Messenger implementation

This commit is contained in:
Mikhail
2025-05-01 18:18:15 -04:00
parent 24b4d11862
commit e4e8f801ce
11 changed files with 155 additions and 23 deletions

View File

@@ -160,7 +160,7 @@ namespace EpinelPS.Database
public BadgeContents BadgeContent; public BadgeContents BadgeContent;
public string BadgeGuid = ""; public string BadgeGuid = "";
public Badge() {} public Badge() { }
public Badge(NetBadge badge) public Badge(NetBadge badge)
{ {
Location = badge.Location; Location = badge.Location;
@@ -201,6 +201,18 @@ namespace EpinelPS.Database
}; };
} }
} }
public class ConversationChoice
{
}
public class ConversationMessage
{
public string ConversationId { get; set; } = "";
public long CreatedAt { get; set; }
public ulong Seq { get; set; }
public string Id { get; set; } = "";
public int State { get; set; }
}
public class User public class User
{ {
// User info // User info
@@ -282,6 +294,8 @@ namespace EpinelPS.Database
public List<Trigger> Triggers = []; public List<Trigger> Triggers = [];
public int LastTriggerId = 1; public int LastTriggerId = 1;
public List<int> CompletedAchievements = []; public List<int> CompletedAchievements = [];
public List<NetMessage> MessengerData = [];
public ulong LastMessageId = 1;
// Event data // Event data
public Dictionary<int, EventData> EventInfo = new(); public Dictionary<int, EventData> EventInfo = new();
@@ -524,6 +538,34 @@ namespace EpinelPS.Database
return removed; return removed;
} }
public NetMessage CreateMessage(MessengerDialogRecord r, int state = 0)
{
var msg = new NetMessage()
{
ConversationId = r.conversation_id,
CreatedAt = DateTime.UtcNow.Ticks,
MessageId = r.id,
Seq = (long)LastMessageId++,
State = state
};
MessengerData.Add(msg);
return msg;
}
public NetMessage CreateMessage(string conversationId, string messageId, int state = 0)
{
var msg = new NetMessage()
{
ConversationId = conversationId,
CreatedAt = DateTime.UtcNow.Ticks,
MessageId = messageId,
Seq = (long)LastMessageId++,
State = state
};
MessengerData.Add(msg);
return msg;
}
} }
public class CoreInfo public class CoreInfo
{ {

View File

@@ -69,6 +69,9 @@ namespace EpinelPS.StaticInfo
public readonly Dictionary<int, InfracoreRecord> InfracoreTable = []; public readonly Dictionary<int, InfracoreRecord> InfracoreTable = [];
public readonly Dictionary<int, AttractiveCounselCharacterRecord> AttractiveCounselCharacterTable = []; public readonly Dictionary<int, AttractiveCounselCharacterRecord> AttractiveCounselCharacterTable = [];
public readonly Dictionary<int, AttractiveLevelRewardRecord> AttractiveLevelReward = []; public readonly Dictionary<int, AttractiveLevelRewardRecord> AttractiveLevelReward = [];
public readonly Dictionary<int, SubquestRecord> Subquests = [];
public readonly Dictionary<string, MessengerDialogRecord> Messages = [];
public readonly Dictionary<int, MessengerMsgConditionRecord> MessageConditions = [];
public byte[] Sha256Hash; public byte[] Sha256Hash;
@@ -528,6 +531,24 @@ namespace EpinelPS.StaticInfo
{ {
this.AttractiveLevelReward.Add(obj.id, obj); this.AttractiveLevelReward.Add(obj.id, obj);
} }
var subquest = await LoadZip<SubquestTable>("SubQuestTable.json", progress);
foreach (var obj in subquest.records)
{
this.Subquests.Add(obj.id, obj);
}
var msgs = await LoadZip<MessengerDialogTable>("MessengerDialogTable.json", progress);
foreach (var obj in msgs.records)
{
this.Messages.Add(obj.id, obj);
}
var msgc = await LoadZip<MessengerMsgConditionTable>("MessengerConditionTriggerTable.json", progress);
foreach (var obj in msgc.records)
{
this.MessageConditions.Add(obj.id, obj);
}
} }
public MainQuestCompletionRecord? GetMainQuestForStageClearCondition(int stage) public MainQuestCompletionRecord? GetMainQuestForStageClearCondition(int stage)

View File

@@ -713,4 +713,40 @@
{ {
public List<AttractiveLevelRewardRecord> records = []; public List<AttractiveLevelRewardRecord> records = [];
} }
public class SubquestRecord
{
public int id;
public int group_id;
public int clear_condition_id;
public int clear_condition_value;
public string conversation_id = "";
public string end_messenger_conversation_id = "";
public int before_sub_quest_id;
}
public class SubquestTable
{
public List<SubquestRecord> records = [];
}
public class MessengerDialogRecord
{
public string id = "";
public string conversation_id = "";
public string jump_target = "";
public bool is_opener;
public int reward_id;
}
public class MessengerDialogTable
{
public List<MessengerDialogRecord> records = [];
}
public class MessengerMsgConditionRecord
{
public int id;
public string tid = "";
public int reward_id;
}
public class MessengerMsgConditionTable
{
public List<MessengerMsgConditionRecord> records = [];
}
} }

View File

@@ -219,14 +219,7 @@ namespace EpinelPS.LobbyServer.Gacha
{ {
user.BondInfo.Add(new() { NameCode = characterData.name_code, Level = 1 }); user.BondInfo.Add(new() { NameCode = characterData.name_code, Level = 1 });
if (characterData.original_rare == "SSR") user.AddTrigger(TriggerType.ObtainCharacter, characterData.name_code);
{
user.AddTrigger(TriggerType.ObtainCharacterSSR, characterData.name_code);
}
else
{
user.AddTrigger(TriggerType.ObtainCharacter, characterData.name_code);
}
} }
} }

View File

@@ -3,7 +3,7 @@ using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.LobbyUser namespace EpinelPS.LobbyServer.LobbyUser
{ {
[PacketPath("/user/SetNickNameInTutorial")] [PacketPath("/User/SetNickNameInTutorial")]
public class SetNicknameInTutorial : LobbyMsgHandler public class SetNicknameInTutorial : LobbyMsgHandler
{ {
protected override async Task HandleAsync() protected override async Task HandleAsync()

View File

@@ -1,4 +1,6 @@
using EpinelPS.Utils; using EpinelPS.Utils;
using EpinelPS.StaticInfo;
using EpinelPS.Database;
namespace EpinelPS.LobbyServer.Messenger namespace EpinelPS.LobbyServer.Messenger
{ {
@@ -8,16 +10,18 @@ namespace EpinelPS.LobbyServer.Messenger
protected override async Task HandleAsync() protected override async Task HandleAsync()
{ {
var req = await ReadData<ReqEnterMessengerDialog>(); var req = await ReadData<ReqEnterMessengerDialog>();
var user = GetUser();
// TODO: save these things
var response = new ResEnterMessengerDialog(); var response = new ResEnterMessengerDialog();
response.Message = new NetMessage(){
ConversationId = "m_mainafter_28_01", var opener = GameData.Instance.MessageConditions[req.Tid];
CreatedAt = 132123123, var conversation = GameData.Instance.Messages.Where(x => x.Value.conversation_id == opener.tid && x.Value.is_opener).First();
MessageId = "m_mainafter_28_01_1",
Seq = 324234, response.Message = user.CreateMessage(conversation.Value);
State = 0
}; user.AddTrigger(TriggerType.MessageClear, 1, req.Tid); // TODO check if this is correct
JsonDb.Save();
await WriteDataAsync(response); await WriteDataAsync(response);
} }

View File

@@ -1,3 +1,5 @@
using EpinelPS.Database;
using EpinelPS.StaticInfo;
using EpinelPS.Utils; using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Messenger namespace EpinelPS.LobbyServer.Messenger
@@ -8,10 +10,16 @@ namespace EpinelPS.LobbyServer.Messenger
protected override async Task HandleAsync() protected override async Task HandleAsync()
{ {
var req = await ReadData<ReqEnterSubQuestMessengerDialog>(); var req = await ReadData<ReqEnterSubQuestMessengerDialog>();
var user = GetUser();
// TODO: save these things
var response = new ResEnterSubQuestMessengerDialog(); var response = new ResEnterSubQuestMessengerDialog();
var opener = GameData.Instance.Subquests.Where(x => x.Key == req.SubQuestId).First();
var conversation = GameData.Instance.Messages.Where(x => x.Value.conversation_id == opener.Value.conversation_id && x.Value.is_opener).First();
response.Message = user.CreateMessage(conversation.Value);
JsonDb.Save();
await WriteDataAsync(response); await WriteDataAsync(response);
} }
} }

View File

@@ -1,4 +1,5 @@
using EpinelPS.Utils; using EpinelPS.Database;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Messenger namespace EpinelPS.LobbyServer.Messenger
{ {
@@ -8,10 +9,17 @@ namespace EpinelPS.LobbyServer.Messenger
protected override async Task HandleAsync() protected override async Task HandleAsync()
{ {
var req = await ReadData<ReqGetMessages>(); var req = await ReadData<ReqGetMessages>();
var user = GetUser();
// TODO: save these things
var response = new ResGetMessages(); var response = new ResGetMessages();
var newMessages = user.MessengerData.Where(x => x.Seq >= req.Seq);
foreach (var item in newMessages)
{
response.Messages.Add(item);
}
await WriteDataAsync(response); await WriteDataAsync(response);
} }
} }

View File

@@ -1,4 +1,6 @@
using EpinelPS.Utils; using EpinelPS.Utils;
using EpinelPS.StaticInfo;
using EpinelPS.Database;
namespace EpinelPS.LobbyServer.Messenger namespace EpinelPS.LobbyServer.Messenger
{ {
@@ -7,10 +9,21 @@ namespace EpinelPS.LobbyServer.Messenger
{ {
protected override async Task HandleAsync() protected override async Task HandleAsync()
{ {
// This request handles saving user choices
var req = await ReadData<ReqProceedMessage>(); var req = await ReadData<ReqProceedMessage>();
ResProceedMessage response = new();
var user = GetUser();
// TODO: save these things var msgToSave = GameData.Instance.Messages.Where(x => x.Key == req.MessageId).First();
var response = new ResProceedMessage();
response.Message = user.CreateMessage(msgToSave.Value.conversation_id, req.MessageId);
if (msgToSave.Value.reward_id != 0)
{
Console.WriteLine("TODO reward for messenger. Reward ID: " + msgToSave.Value.reward_id + " Message ID: " + req.MessageId);
}
JsonDb.Save();
await WriteDataAsync(response); await WriteDataAsync(response);
} }

View File

@@ -185,6 +185,12 @@ namespace EpinelPS.LobbyServer.Stage
user.BondInfo.Add(new() { NameCode = 3001, Level = 1 }); user.BondInfo.Add(new() { NameCode = 3001, Level = 1 });
user.BondInfo.Add(new() { NameCode = 3005, Level = 1 }); user.BondInfo.Add(new() { NameCode = 3005, Level = 1 });
user.AddTrigger(TriggerType.ObtainCharacter, 1, 3001);
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1018);
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1015);
user.AddTrigger(TriggerType.ObtainCharacter, 1, 1014);
user.AddTrigger(TriggerType.ObtainCharacter, 1, 3005);
NetTeamData team1Sub = new() NetTeamData team1Sub = new()
{ {

View File

@@ -303,6 +303,7 @@ namespace EpinelPS
}); });
user.BondInfo.Add(new() { NameCode = character.name_code, Level = 1 }); user.BondInfo.Add(new() { NameCode = character.name_code, Level = 1 });
user.AddTrigger(TriggerType.ObtainCharacter, 1, character.name_code);
} }
} }