using ServerCommon; using System.Collections.Concurrent; using ServerCore; using ServerBase; namespace GameServer { public class NoticeChatManager : EntityBase, IWithLogActor { ConcurrentDictionary m_notice_chats = new(); public NoticeChatManager() : base(EntityType.NoticeChatManager) { } public async Task LoadDB() { var result = new Result(); var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); ArgumentNullException.ThrowIfNull(server_logic, $"server_logic is null !!!"); ArgumentNullException.ThrowIfNull(dynamo_db_client, $"dynamo_db_client is null !!!"); var doc = new NoticeChatDoc(); var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK()); (result, var read_doc_list) = await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig(query_config); if (result.isFail()) { return result; } foreach (var read_doc in read_doc_list) { (result, var notice_chat) = await NoticeChat.createMailFromDoc(this, read_doc); if (result.isFail() || notice_chat == null) { continue; } var notice_chat_attribute = notice_chat.getEntityAttribute(); if (notice_chat_attribute == null) { continue; } // 지정한 시간으로부터 repeat count만큼만 공지사항을 보낸다. while (true) { if (notice_chat_attribute.RepeatCount == 0) { break; } if (notice_chat_attribute.NextNoticeTime > DateTime.UtcNow) { break; } notice_chat_attribute.RepeatCount -= 1; notice_chat_attribute.NextNoticeTime = notice_chat_attribute.NextNoticeTime.AddMinutes(notice_chat_attribute.RepeatMinuteTime); } if (notice_chat_attribute.RepeatCount == 0) { continue; } m_notice_chats.TryAdd(notice_chat_attribute.ChatId, notice_chat); } return result; } public Task UpdateChat() { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var player_manager = server_logic.getPlayerManager(); ArgumentNullException.ThrowIfNull(server_logic, $"server_logic is null !!!"); ArgumentNullException.ThrowIfNull(player_manager, $"player_manager is null !!!"); List copy_notice_chats = CopyData(); foreach (var notice_chat in copy_notice_chats) { var notice_chat_attribute = notice_chat.getEntityAttribute(); if(notice_chat_attribute == null) { continue; } if (notice_chat_attribute.NextNoticeTime <= DateTime.UtcNow) { if (notice_chat_attribute.MessageType != 10 && notice_chat_attribute.MessageType != 11) { err_msg = $"NoticeChatInfo messageType is invalid. - GMTOOL Data. messageType : {notice_chat_attribute.MessageType}"; Log.getLogger().error(err_msg); m_notice_chats.TryRemove(notice_chat_attribute.ChatId, out var removed_chat); continue; } if (notice_chat_attribute.RepeatCount <= 0) { m_notice_chats.TryRemove(notice_chat_attribute.ChatId, out var removed_chat); continue; } if(EnumHelper.isDefined(notice_chat_attribute.MessageType) == false) { err_msg = $"is Not Defined EChatType !!! EChatType : {notice_chat_attribute.MessageType} - {toBasicString()}"; Log.getLogger().error(err_msg); continue; } Dictionary languageChatInfos = new(); foreach (var detail in notice_chat_attribute.DetailList) { languageChatInfos.Add(detail.Languagetype, (notice_chat_attribute.Sender, (ChatType)notice_chat_attribute.MessageType, detail.ChatMessage)); } var receivers = player_manager.getUsers(); foreach (var receiver in receivers) { var player = receiver.Value; ArgumentNullException.ThrowIfNull(player, $"player is null !!! - {player.toBasicString()}"); var user_create_or_load_action = player.getEntityAction(); ArgumentNullException.ThrowIfNull(user_create_or_load_action, $"user_create_or_load_action is null !!! - {player.toBasicString()}"); if (false == user_create_or_load_action.isCompletedLoadUser()) { continue; } var account_attribute = player.getEntityAttribute(); ArgumentNullException.ThrowIfNull(account_attribute, $"account_attribute is null !!! - {player.toBasicString()}"); if (languageChatInfos.TryGetValue(account_attribute.LanguageType, out var chat_info) == false) { continue; } ChatNotifyHelper.send_S2C_NTF_CHAT(receiver.Value, chat_info.MessageType, chat_info.Sender, receiver.Value.getUserNickname(), PlayerStateType.None, chat_info.ChatMessage); } notice_chat_attribute.RepeatCount -= 1; notice_chat_attribute.NextNoticeTime = notice_chat_attribute.NextNoticeTime.AddMinutes(notice_chat_attribute.RepeatMinuteTime); } } return Task.FromResult(result); } private List CopyData() { return new List(m_notice_chats.Values); } public async Task CheatFuncSaveNoticeChat(int messageType, string KoMessage, string EnMessage) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var dynamo_db_client = server_logic.getDynamoDbClient(); ArgumentNullException.ThrowIfNull(server_logic, $"server_logic is null !!!"); ArgumentNullException.ThrowIfNull(dynamo_db_client, $"dynamo_db_client is null !!!"); var fn_cheat_notice_chat_write = async delegate () { var result = new Result(); int new_chat_id = 0; var notice_chat_list = CopyData(); foreach (var noticechat in notice_chat_list) { var notice_chat_attrib = noticechat.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(notice_chat_attrib, () => $"notice_chat_attrib is null !!!"); int chat_id = notice_chat_attrib.ChatId; if (new_chat_id < chat_id) { new_chat_id = chat_id; } } (result, var notice_chat) = await NoticeChat.createTestNoticeChat(this, new_chat_id, messageType, KoMessage, EnMessage); if (result.isFail() || notice_chat == null) { return result; } var batch = new QueryBatchEx(this, LogActionType.TestWriteNoticeChat , server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) { return result; } m_notice_chats.TryAdd(new_chat_id, notice_chat); return result; }; result = await this.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "CheatNoticeChatWrite", fn_cheat_notice_chat_write); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {this.toBasicString()}"; Log.getLogger().error(err_msg); } return result; } public override string toBasicString() { return $"{this.getTypeName()}"; } public override string toSummaryString() { return $"{this.getTypeName()}"; } public ILogActor toLogActor() { var server_logic = ServerLogicApp.getServerLogicApp(); var log_info = new NoticeChatActorLog(); if (server_logic == null) return log_info; log_info.initLogInfo( // 서버 정보 server_logic.getServerConfig().getRegionId() , server_logic.getServerConfig().getWorldId() , server_logic.getServerType().toServerType() ); return log_info; } } }