초기커밋
This commit is contained in:
107
GameServer/Global/NoticeChat/NoticeChat.cs
Normal file
107
GameServer/Global/NoticeChat/NoticeChat.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class NoticeChat : EntityBase
|
||||
{
|
||||
private NoticeChat(EntityBase parent)
|
||||
: base(EntityType.NoticeChat, parent)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
addEntityAttribute(new NoticeChatAttribute(this));
|
||||
|
||||
return await base.onInit();
|
||||
}
|
||||
|
||||
public static async Task<(Result, NoticeChat?)> createTestNoticeChat(EntityBase owner, int chat_id, int messageType, string KoMessage, string EnMessage)
|
||||
{
|
||||
var notice_chat = new NoticeChat(owner);
|
||||
var result = await notice_chat.onInit();
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
var err_msg = string.Empty;
|
||||
DateTime now = DateTime.UtcNow;
|
||||
|
||||
var notice_chat_attribute = notice_chat.getEntityAttribute<NoticeChatAttribute>();
|
||||
if (notice_chat_attribute == null)
|
||||
{
|
||||
err_msg = $"Failed to get notice chat attribute : {nameof(NoticeChatAttribute)}";
|
||||
result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
List<NoticeChatDetail> detailInfos = new();
|
||||
detailInfos.Add(new NoticeChatDetail() { ChatMessage = $"{chat_id} {KoMessage}", Languagetype = LanguageType.Ko });
|
||||
detailInfos.Add(new NoticeChatDetail() { ChatMessage = $"{chat_id} {EnMessage}", Languagetype = LanguageType.En });
|
||||
detailInfos.Add(new NoticeChatDetail() { ChatMessage = $"{chat_id} あなたの名前は何ですか", Languagetype = LanguageType.Ja });
|
||||
|
||||
notice_chat_attribute.ChatId = chat_id;
|
||||
notice_chat_attribute.NextNoticeTime = now;
|
||||
notice_chat_attribute.RepeatCount = 10;
|
||||
notice_chat_attribute.RepeatMinuteTime = 1;
|
||||
notice_chat_attribute.Sender = "[GM]그리노스";
|
||||
notice_chat_attribute.MessageType = messageType;
|
||||
notice_chat_attribute.DetailList = detailInfos;
|
||||
|
||||
notice_chat_attribute.newEntityAttribute();
|
||||
|
||||
return (result, notice_chat);
|
||||
}
|
||||
|
||||
public static async Task<(Result, NoticeChat?)> createMailFromDoc(EntityBase parent, NoticeChatDoc doc)
|
||||
{
|
||||
var system_mail = new NoticeChat(parent);
|
||||
var result = await system_mail.onInit();
|
||||
if (result.isFail())
|
||||
{
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var notice_chat_attribute = system_mail.getEntityAttribute<NoticeChatAttribute>();
|
||||
if (notice_chat_attribute == null)
|
||||
{
|
||||
err_msg = $"Failed to get notice chat attribute : {nameof(NoticeChatAttribute)}";
|
||||
result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
if (notice_chat_attribute.copyEntityAttributeFromDoc(doc) == false)
|
||||
{
|
||||
err_msg = $"Failed to copyEntityAttributeFromDoc !!! : doc_type {doc.GetType()} - {system_mail.getRootParent().toBasicString()}";
|
||||
result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
return (result, system_mail);
|
||||
}
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
return $"{this.getTypeName()} - {getRootParent().toBasicString()}";
|
||||
}
|
||||
|
||||
public override string toSummaryString()
|
||||
{
|
||||
return $"{this.getTypeName()} - {getRootParent().toBasicString()}";
|
||||
}
|
||||
}
|
||||
246
GameServer/Global/NoticeChat/NoticeChatManager.cs
Normal file
246
GameServer/Global/NoticeChat/NoticeChatManager.cs
Normal file
@@ -0,0 +1,246 @@
|
||||
using ServerCommon;
|
||||
using System.Collections.Concurrent;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class NoticeChatManager : EntityBase, IWithLogActor
|
||||
{
|
||||
ConcurrentDictionary<Int32 ,NoticeChat> m_notice_chats = new();
|
||||
|
||||
public NoticeChatManager()
|
||||
: base(EntityType.NoticeChatManager)
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<Result> 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<NoticeChatDoc>(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<NoticeChatAttribute>();
|
||||
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<Result> 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<NoticeChat> copy_notice_chats = CopyData();
|
||||
foreach (var notice_chat in copy_notice_chats)
|
||||
{
|
||||
var notice_chat_attribute = notice_chat.getEntityAttribute<NoticeChatAttribute>();
|
||||
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<ChatType>(notice_chat_attribute.MessageType) == false)
|
||||
{
|
||||
err_msg = $"is Not Defined EChatType !!! EChatType : {notice_chat_attribute.MessageType} - {toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
continue;
|
||||
}
|
||||
|
||||
Dictionary<LanguageType, (string Sender, ChatType MessageType, string ChatMessage)> 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<UserCreateOrLoadAction>();
|
||||
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<AccountAttribute>();
|
||||
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<NoticeChat> CopyData()
|
||||
{
|
||||
return new List<NoticeChat>(m_notice_chats.Values);
|
||||
}
|
||||
|
||||
public async Task<Result> 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<NoticeChatAttribute>();
|
||||
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<QueryRunnerWithDocument>(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;
|
||||
}
|
||||
}
|
||||
}
|
||||
41
GameServer/Global/NoticeChat/NoticeCheat.cs
Normal file
41
GameServer/Global/NoticeChat/NoticeCheat.cs
Normal file
@@ -0,0 +1,41 @@
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
[ChatCommandAttribute("addnoticechat", typeof(ChatCommandAddNoticeChat), AuthAdminLevelType.Developer, AuthAdminLevelType.GmNormal, AuthAdminLevelType.GmSuper)]
|
||||
internal class ChatCommandAddNoticeChat : ChatCommandBase
|
||||
{
|
||||
public override async Task invoke(Player player, string token, string[] args)
|
||||
{
|
||||
Log.getLogger().info($"HandleAddNoticeChat");
|
||||
|
||||
if (args.Length < 3)
|
||||
{
|
||||
Log.getLogger().error($"Invalid Argument");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (!int.TryParse(args[0], out var messageType))
|
||||
{
|
||||
Log.getLogger().error($"questcomplete param parsing Error args : {args[0]}");
|
||||
return;
|
||||
}
|
||||
|
||||
string KoMessage = args[1];
|
||||
string EnMessage = args[2];
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
ArgumentNullException.ThrowIfNull(server_logic);
|
||||
await server_logic.getNoticeChatManager().CheatFuncSaveNoticeChat(messageType, KoMessage, EnMessage);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.getLogger().error($"AddNoticeChat cheat Failed. {ex}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user