초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View 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()}";
}
}

View 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;
}
}
}

View 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;
}
}
}