diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java new file mode 100644 index 000000000..fafd2379a --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/GlobleSystemLogic.java @@ -0,0 +1,95 @@ +package com.ljsd.jieling.logic; + +import com.ljsd.GameApplication; +import com.ljsd.jieling.db.mongo.MongoUtil; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.logic.activity.ActivityLogic; +import com.ljsd.jieling.logic.activity.ActivityType; +import com.ljsd.jieling.logic.activity.ActivityTypeEnum; +import com.ljsd.jieling.logic.activity.IEventHandler; +import com.ljsd.jieling.logic.activity.event.IEvent; +import com.ljsd.jieling.logic.activity.event.MinuteTaskEvent; +import com.ljsd.jieling.logic.activity.event.Poster; +import com.ljsd.jieling.logic.dao.root.GlobalSystemControl; +import config.SGlobalActivity; +import config.SGodSacrificeSetting; +import manager.STableManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import util.TimeUtils; + +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Description: des + * Author: zsx + * CreateDate: 2020/10/22 10:46 + */ +public class GlobleSystemLogic implements IEventHandler { + + private static final Logger LOGGER = LoggerFactory.getLogger(GlobleSystemLogic.class); + + private GlobleSystemLogic() { + Poster.getPoster().listenEvent(this, MinuteTaskEvent.class); + } + + public static GlobleSystemLogic getInstence() { + return GlobleSystemLogic.InnerClass.instance; + } + + public GlobalSystemControl getGlobalSystemControl() throws Exception { + GlobalSystemControl globalSystemControl = MongoUtil.getInstence().getMyMongoTemplate().findById(GameApplication.serverId, GlobalSystemControl.class); + if (globalSystemControl == null) { + globalSystemControl = new GlobalSystemControl(GameApplication.serverId); + } + return globalSystemControl; + } + + private static class InnerClass { + private static final GlobleSystemLogic instance = new GlobleSystemLogic(); + } + + + @Override + public void onEvent(IEvent event) throws Exception { + if (event instanceof MinuteTaskEvent) { + try { + SGodSacrificeSetting sGodSacrificeSetting = STableManager.getConfig(SGodSacrificeSetting.class).get(1); + if(null==sGodSacrificeSetting){ + throw new ErrorCodeException(ErrorCode.CFG_NULL); + } + List list1 = Arrays.stream(sGodSacrificeSetting.getTimePointList()).boxed().collect(Collectors.toList()); + Calendar calendar = Calendar.getInstance(); + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + if(list1.contains(hour)&& minute ==0){ + //更新社稷大典 + List activities = SGlobalActivity.sGlobalActivityMapByType.get(ActivityType.SHEJI_ACTIVITY); + int openID=0; + for(SGlobalActivity sGlobalActivity:activities){ + if(ActivityLogic.getInstance().checkGlobleActivityOpen(sGlobalActivity.getId())){ + openID=sGlobalActivity.getId(); + break; + } + } + + if(openID!=0){ + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + GlobalSystemControl globalSystemControl = MongoUtil.getInstence().getMyMongoTemplate().findById(GameApplication.serverId, GlobalSystemControl.class); + globalSystemControl.getActivityOpenValue().putIfAbsent(openID,(int)(calendar.getTimeInMillis()/1000L)); + GlobalSystemControl.save(globalSystemControl); + } + } + + } catch (Exception e) { + e.printStackTrace(); + LOGGER.error("Exception::=>{}", e.toString()); + } + + } + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/SheJiActivity.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/SheJiActivity.java new file mode 100644 index 000000000..abadab2bd --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/SheJiActivity.java @@ -0,0 +1,329 @@ +package com.ljsd.jieling.logic.activity; + +import com.ljsd.jieling.core.Lockeys; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.globals.Global; +import com.ljsd.jieling.jbean.ActivityMission; +import com.ljsd.jieling.jbean.ActivityProgressInfo; +import com.ljsd.jieling.logic.OnlineUserManager; +import com.ljsd.jieling.logic.activity.event.CommitSheJiEvent; +import com.ljsd.jieling.logic.activity.event.IEvent; +import com.ljsd.jieling.logic.activity.event.Poster; +import com.ljsd.jieling.logic.activity.event.SignInEvent; +import com.ljsd.jieling.logic.dao.GuilidManager; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.GuildInfo; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.logic.mail.MailLogic; +import com.ljsd.jieling.logic.rank.RankContext; +import com.ljsd.jieling.logic.rank.RankEnum; +import com.ljsd.jieling.logic.rank.rankImpl.AbstractRank; +import com.ljsd.jieling.network.session.ISession; +import com.ljsd.jieling.thread.ThreadManager; +import com.ljsd.jieling.util.ItemUtil; +import config.*; +import manager.STableManager; +import org.springframework.data.redis.core.ZSetOperations; +import util.TimeUtils; + +import java.util.*; + +/** + * 社稷大典 + */ +class SheJiActivity extends AbstractActivity { + + public SheJiActivity(int id) { + super(id); + Poster.getPoster().listenEvent(this, CommitSheJiEvent.class); + } + + @Override + public void onActivityStart() throws Exception { + super.onActivityStart(); + } + + @Override + public void initActivity(User user) throws Exception { + super.initActivity(user); + //初始化移除道具 + SGodSacrificeSetting sGodSacrificeSetting = STableManager.getConfig(SGodSacrificeSetting.class).get(1); + if (null != sGodSacrificeSetting) { + if (sGodSacrificeSetting.getItemDelete() == 1) { + int[] activityItems = sGodSacrificeSetting.getActivityItems(); + for (int item : activityItems) { + user.getItemManager().removeItem(item); + } + } + } + } + + + @Override + void updateProgressWithUser(User user, ActivityMission activityMission, int count) { + Map activityProgressInfoMap = activityMission.getActivityMissionMap(); + int progress; + for (Map.Entry item : activityProgressInfoMap.entrySet()) { + ActivityProgressInfo activityProgressInfo = item.getValue(); + //考虑退公会的情况 + if (activityProgressInfo.getProgrss() > count) { + break; + } + progress = count; + activityProgressInfo.setProgrss(progress); + activityMission.getActivityMissionMap().put(item.getKey(), activityProgressInfo); + // activityMission.updateProgressInfo(item.getKey(), activityProgressInfo); + } + + + } + + + @Override + public void onEvent(IEvent event) throws Exception { + if (!(event instanceof CommitSheJiEvent)) return; + + int guildId = ((CommitSheJiEvent) event).getGuild(); + if (guildId == 0) { + LOGGER.error("Exception guild id=>{} not exit", guildId); + } + + //lock all 会修改公会记录 + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guildId); + Set sendUids = new HashSet<>(); + for (Set items : guildInfo.getMembers().values()) { + sendUids.addAll(items); + } + Lockeys.getLockeys().lock("guild", sendUids); + + for (Integer uid : sendUids) { + User user = UserManager.getUser(uid); + if (null == user) { + LOGGER.error("Exception::user==null,uid=>{}", uid); + continue; + } + update(user, guildInfo.getGuildSheJiScore()); + } + AbstractRank guildRank = RankContext.getRankEnum(RankEnum.GUILD_SHEJI_SCORE_RANK.getType()); + guildRank.addRank(guildId,String.valueOf(id),guildInfo.getGuildSheJiScore()); + if( ((CommitSheJiEvent) event).getScore()!=0){ + RankContext.getRankEnum(RankEnum.EXPERT_RANK.getType()).incrementRankScore(((CommitSheJiEvent) event).getCommitUid(), String.valueOf(id), ((CommitSheJiEvent) event).getScore()); + } + } + + + @Override + public void onActivityEnd() throws Exception { + ThreadManager.getScheduledExecutor().execute(this::sendReward); + } + + protected void sendReward() { + Thread.currentThread().setName("sendReward-Activity-" + id); + SGlobalActivity sGlobalActivity = SGlobalActivity.getsGlobalActivityMap().get(id); + if (sGlobalActivity.getOpenRanking() == 0) { + return; + } + Map> integerListMap = SGodSacrificeConfig.getIntegerListMap().get(1); + if (integerListMap == null) { + return; + } + SGodSacrificeSetting sGodSacrificeSetting = STableManager.getConfig(SGodSacrificeSetting.class).get(1); + InnerResult rewardMap = getRewardMap(2); + Map rank2miss = rewardMap.getRank2miss(); + int maxRank = rewardMap.getMaxRamk(); + int maxRewardId = rewardMap.getMaxRewardId(); + + AbstractRank expertRank = RankContext.getRankEnum(RankEnum.EXPERT_RANK.getType()); + Set> rankInfo = expertRank.getRankByKey(String.valueOf(id), 0, -1); + int rank = 1; + int nowTime = (int) (TimeUtils.now() / 1000); + for (ZSetOperations.TypedTuple item : rankInfo) { + + String value = item.getValue(); + int uid = Integer.parseInt(value); + try { + User user = UserManager.getUser(uid, true); + if (null == user) { + continue; + } + + int missionId; + Double score = item.getScore(); + + if(score rank2miss = rewardMap.getRank2miss(); + int maxRank = rewardMap.getMaxRamk(); + + + AbstractRank abstractRank = RankContext.getRankEnum(RankEnum.GUILD_SHEJI_SCORE_RANK.getType()); + Set> rankByKey = abstractRank.getRankByKey("", 0, -1); + int rankIndex = 1; + for (ZSetOperations.TypedTuple item : rankByKey) { + + + try { + String guildId = item.getValue(); + int guild = Integer.parseInt(guildId); + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(guild); + Set sendUids = new HashSet<>(); + for (Set items : guildInfo.getMembers().values()) { + sendUids.addAll(items); + } + + for (Integer uid : sendUids) { + try { + User user = UserManager.getUser(uid, true); + if (null == user) { + continue; + } + if (user.getPlayerInfoManager().getCreateTime() + sGodSacrificeSetting.getLifeLimit() * TimeUtils.ONE_DAY - nowTime > 0) { + continue; + } + if (user.getGuildMyInfo().getJoinTime() + sGodSacrificeSetting.getJoinLimit() * TimeUtils.ONE_DAY - nowTime > 0) { + continue; + } + int missionId; + if (rank2miss.containsKey(rankIndex)) { + missionId = rank2miss.get(rankIndex); + } else { + if (maxRank == -1) { + missionId = rewardMap.getMaxRewardId(); + } else { + continue; + } + } + //checkAndUpdate value + SGodSacrificeConfig sActivityRankingReward1 = SGodSacrificeConfig.getsGodSacrificeConfigMap().get(missionId); + //sendmail + String title = SErrorCodeEerverConfig.getI18NMessage("guild_activity_reward_title", new Object[]{sGlobalActivity.getSesc()}); + String content = SErrorCodeEerverConfig.getI18NMessage("guild_activity_reward_txt", new Object[]{sGlobalActivity.getSesc(), rankIndex++}); + String mailReward = ItemUtil.getMailReward(sActivityRankingReward1.getRankingReward()); + MailLogic.getInstance().sendMail(uid, title, content, mailReward, nowTime, Global.MAIL_EFFECTIVE_TIME); + } catch (Exception e) { + LOGGER.error("id为{}的玩家,{}活动排行奖励没有发成功", uid, id); + System.out.println(e); + e.printStackTrace(); + } + } + + + } catch (Exception e) { + LOGGER.error("排行奖励没有发成功=>{}", id); + e.printStackTrace(); + } + } + } + + private InnerResult getRewardMap(int type) { + InnerResult innerResult = new InnerResult(); + + Map rank2miss = innerResult.getRank2miss(); + Map> integerListMap = SGodSacrificeConfig.getIntegerListMap().get(type); + if (integerListMap == null) { + return innerResult; + } + List sGodSacrificeConfigs = integerListMap.get(id); + if (null == sGodSacrificeConfigs) + return innerResult; + int maxRank = 0; + int maxRewardId = 0; + + for (SGodSacrificeConfig sActivityRankingReward1 : sGodSacrificeConfigs) { + if (sActivityRankingReward1.getMaxRank() == -1) { + maxRank = -1; + maxRewardId = sActivityRankingReward1.getId(); + continue; + } + + if (maxRank != -1) { + maxRank = Math.max(maxRank, sActivityRankingReward1.getMaxRank()); + } + + for (Integer rank : getRankSet(sActivityRankingReward1.getMinRank(), sActivityRankingReward1.getMaxRank())) { + rank2miss.put(rank, sActivityRankingReward1.getId()); + } + } + innerResult.setMaxRamk(maxRank); + innerResult.setMaxRewardId(maxRewardId); + return innerResult; + + } + + class InnerResult { + + Map rank2miss = new HashMap<>(); + int maxRamk; + int maxRewardId; + + Map getRank2miss() { + return rank2miss; + } + + public void setRank2miss(Map rank2miss) { + this.rank2miss = rank2miss; + } + + int getMaxRamk() { + return maxRamk; + } + + void setMaxRamk(int maxRamk) { + this.maxRamk = maxRamk; + } + + int getMaxRewardId() { + return maxRewardId; + } + + void setMaxRewardId(int maxRewardId) { + this.maxRewardId = maxRewardId; + } + } + + +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/event/CommitSheJiEvent.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/event/CommitSheJiEvent.java new file mode 100644 index 000000000..21a79ae63 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/event/CommitSheJiEvent.java @@ -0,0 +1,41 @@ +package com.ljsd.jieling.logic.activity.event; + + +/** + * 社稷大典贡献道具下发玩家积分 + */ +public class CommitSheJiEvent implements IEvent{ + private int guild; + private int commitUid; + private int score; + + public CommitSheJiEvent(int guild, int commitUid, int score) { + this.guild = guild; + this.commitUid = commitUid; + this.score = score; + } + + public int getGuild() { + return guild; + } + + public void setGuild(int guild) { + this.guild = guild; + } + + public int getCommitUid() { + return commitUid; + } + + public void setCommitUid(int commitUid) { + this.commitUid = commitUid; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/event/GetSheJiAwardEvent.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/event/GetSheJiAwardEvent.java new file mode 100644 index 000000000..6fba1abc7 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/activity/event/GetSheJiAwardEvent.java @@ -0,0 +1,20 @@ +package com.ljsd.jieling.logic.activity.event; + + +/** + * 社稷大典贡献领取奖励 + */ +public class GetSheJiAwardEvent implements IEvent{ + private int uid; + public GetSheJiAwardEvent(int uid) { + this.uid = uid; + } + + public int getGuild() { + return uid; + } + + public void setGuild(int uid) { + this.uid = uid; + } +} diff --git a/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/GuildSheJiScoreRank.java b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/GuildSheJiScoreRank.java new file mode 100644 index 000000000..8098b6ce3 --- /dev/null +++ b/serverlogic/src/main/java/com/ljsd/jieling/logic/rank/rankImpl/GuildSheJiScoreRank.java @@ -0,0 +1,65 @@ +package com.ljsd.jieling.logic.rank.rankImpl; + +import com.ljsd.jieling.core.GlobalsDef; +import com.ljsd.jieling.db.redis.RedisUtil; +import com.ljsd.jieling.exception.ErrorCode; +import com.ljsd.jieling.exception.ErrorCodeException; +import com.ljsd.jieling.logic.dao.GuilidManager; +import com.ljsd.jieling.logic.dao.UserManager; +import com.ljsd.jieling.logic.dao.root.GuildInfo; +import com.ljsd.jieling.logic.dao.root.User; +import com.ljsd.jieling.protocols.CommonProto; +import com.ljsd.jieling.protocols.PlayerInfoProto; +import org.springframework.data.redis.core.ZSetOperations; + +import java.util.Set; + +/** + * @author lvxinran + * @date 2020/8/22 + * @discribe + */ +public class GuildSheJiScoreRank extends AbstractRank { + public GuildSheJiScoreRank(int type, String redisKey) { + super(type, redisKey); + } + + @Override + public long[] getDataByScore(Double score) { + return new long[]{score.longValue()}; + } + + @Override + public double getScore(double... data) { + return data[0]; + } + + protected void getOptional(int index, ZSetOperations.TypedTuple data, PlayerInfoProto.RankResponse.Builder builder) { + GuildInfo guildInfo = GuilidManager.guildInfoMap.get(Integer.parseInt(data.getValue())); + CommonProto.RankInfo.Builder everyRankInfo = CommonProto.RankInfo.newBuilder() + .setRank(index) + .setParam1(getParam1(data.getScore())) + .setParam2(getParam2(data.getScore())) + .setParam3(getParam3(data.getScore())); + CommonProto.UserRank.Builder everyRank = CommonProto.UserRank.newBuilder() + .setUid(guildInfo.getId()) + .setUserName(guildInfo.getName()) + .setRankInfo(everyRankInfo); + builder.addRanks(everyRank); + } + + @Override + protected void getMyInfo(User user, String rkey, PlayerInfoProto.RankResponse.Builder allUserResponse){ + int guildId = user.getPlayerInfoManager().getGuildId(); + if(guildId==0){ + return; + } + int myRank= RedisUtil.getInstence().getZSetreverseRank(redisKey,rkey,Integer.toString(guildId)).intValue(); + Double zSetScore = RedisUtil.getInstence().getZSetScore(redisKey, rkey, Integer.toString(guildId)); + CommonProto.RankInfo towerRankInfo = CommonProto.RankInfo.newBuilder() + .setRank(myRank) + .setParam1(getParam1(zSetScore)) + .setParam2(getParam2(zSetScore)).build(); + allUserResponse.setMyRankInfo(towerRankInfo); + } +}