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 string BadgeGuid = "";
public Badge() {}
public Badge() { }
public Badge(NetBadge badge)
{
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
{
// User info
@@ -282,6 +294,8 @@ namespace EpinelPS.Database
public List<Trigger> Triggers = [];
public int LastTriggerId = 1;
public List<int> CompletedAchievements = [];
public List<NetMessage> MessengerData = [];
public ulong LastMessageId = 1;
// Event data
public Dictionary<int, EventData> EventInfo = new();
@@ -524,6 +538,34 @@ namespace EpinelPS.Database
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
{

View File

@@ -69,6 +69,9 @@ namespace EpinelPS.StaticInfo
public readonly Dictionary<int, InfracoreRecord> InfracoreTable = [];
public readonly Dictionary<int, AttractiveCounselCharacterRecord> AttractiveCounselCharacterTable = [];
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;
@@ -528,6 +531,24 @@ namespace EpinelPS.StaticInfo
{
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)

View File

@@ -713,4 +713,40 @@
{
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 });
if (characterData.original_rare == "SSR")
{
user.AddTrigger(TriggerType.ObtainCharacterSSR, characterData.name_code);
}
else
{
user.AddTrigger(TriggerType.ObtainCharacter, characterData.name_code);
}
user.AddTrigger(TriggerType.ObtainCharacter, characterData.name_code);
}
}

View File

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

View File

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

View File

@@ -1,3 +1,5 @@
using EpinelPS.Database;
using EpinelPS.StaticInfo;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Messenger
@@ -8,10 +10,16 @@ namespace EpinelPS.LobbyServer.Messenger
protected override async Task HandleAsync()
{
var req = await ReadData<ReqEnterSubQuestMessengerDialog>();
var user = GetUser();
// TODO: save these things
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);
}
}

View File

@@ -1,4 +1,5 @@
using EpinelPS.Utils;
using EpinelPS.Database;
using EpinelPS.Utils;
namespace EpinelPS.LobbyServer.Messenger
{
@@ -8,10 +9,17 @@ namespace EpinelPS.LobbyServer.Messenger
protected override async Task HandleAsync()
{
var req = await ReadData<ReqGetMessages>();
var user = GetUser();
// TODO: save these things
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);
}
}

View File

@@ -1,4 +1,6 @@
using EpinelPS.Utils;
using EpinelPS.StaticInfo;
using EpinelPS.Database;
namespace EpinelPS.LobbyServer.Messenger
{
@@ -7,10 +9,21 @@ namespace EpinelPS.LobbyServer.Messenger
{
protected override async Task HandleAsync()
{
// This request handles saving user choices
var req = await ReadData<ReqProceedMessage>();
ResProceedMessage response = new();
var user = GetUser();
// TODO: save these things
var response = new ResProceedMessage();
var msgToSave = GameData.Instance.Messages.Where(x => x.Key == req.MessageId).First();
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);
}

View File

@@ -185,6 +185,12 @@ namespace EpinelPS.LobbyServer.Stage
user.BondInfo.Add(new() { NameCode = 3001, 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()
{

View File

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