Skip to content

Commit

Permalink
Fix diverse bugs.
Browse files Browse the repository at this point in the history
Add "force" advancing to escape getting stuck
  • Loading branch information
RenNagasaki committed Sep 21, 2024
1 parent 07e8f1f commit 306c3eb
Show file tree
Hide file tree
Showing 15 changed files with 381 additions and 77 deletions.
8 changes: 7 additions & 1 deletion Echosync-Data/SyncMessages.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,15 @@ public enum SyncMessages
{
Test,
CreateChannel,
ConnectedPlayersDialogue,
ConnectedPlayersReady,
StartNpc,
EndNpc,
JoinDialogue,
LeaveDialogue,
Click,
ClickForce,
ClickWait,
ClickWaitCatchup,
ClickDone,
ServerShutdown
}
Expand Down
16 changes: 8 additions & 8 deletions Echosync-Server/Behaviours/EchosyncBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ protected override void OnOpen()
{
try
{
LogHelper.Log($"Client with guid '{ID}' connected to main service!");
LogHelper.Log("Main", $"Client with guid '{ID}' connected to main service!");
}
catch (Exception ex)
{
LogHelper.Log($"Error while client '{ID}' connected to main service: {ex}");
LogHelper.Log("Main", $"Error while client '{ID}' connected to main service: {ex}", true);
}

base.OnOpen();
Expand All @@ -37,11 +37,11 @@ protected override void OnClose(CloseEventArgs e)
{
try
{
LogHelper.Log($"Client with guid '{ID}' disconnected from main service!");
LogHelper.Log("Main", $"Client with guid '{ID}' disconnected from main service!");
}
catch (Exception ex)
{
LogHelper.Log($"Error while client '{ID}' disconnected from main service: {ex}");
LogHelper.Log("Main", $"Error while client '{ID}' disconnected from main service: {ex}", true);
}

base.OnClose(e);
Expand All @@ -56,18 +56,18 @@ protected override void OnMessage(MessageEventArgs e)
var messageSplit = message.Split('|');
var messageEnum = (SyncMessages)Convert.ToInt32(messageSplit[0]);

LogHelper.Log($"Message received: '{messageEnum}' from '{clientID}'");
LogHelper.Log("Main", $"Message received: '{messageEnum}' from '{clientID}'");
switch (messageEnum)
{
case SyncMessages.CreateChannel:
var channel = messageSplit[1];
if (_server.WebSocketServices.Hosts.ToList().Find(p => p.Path == $"/{channel}") == null)
{
_server.AddWebSocketService($"/{channel}", () => new EchosyncChannelBehaviour(_server, channel));
LogHelper.Log($"User '{clientID}' created channel '{channel}'");
LogHelper.Log("Main", $"User '{clientID}' created channel '{channel}'");
}
else
LogHelper.Log($"User '{clientID}' requested existing channel '{channel}'");
LogHelper.Log("Main", $"User '{clientID}' requested existing channel '{channel}'");
Send($"{(int)SyncMessages.CreateChannel}");
break;
case SyncMessages.Test:
Expand All @@ -77,7 +77,7 @@ protected override void OnMessage(MessageEventArgs e)
}
catch (Exception ex)
{
LogHelper.Log($"Illegal message from '{clientID}': {ex}");
LogHelper.Log("Main", $"Illegal message from '{clientID}': {ex}", true);
}
}
}
Expand Down
146 changes: 108 additions & 38 deletions Echosync-Server/Behaviours/EchosyncChannelBehaviour.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,31 @@ namespace Echosync_Server.Behaviours
{
public class EchosyncChannelBehaviour : WebSocketBehavior
{
public static Dictionary<string, Dictionary<string, Dictionary<string, bool>>> UsersReadyState = new Dictionary<string, Dictionary<string, Dictionary<string, bool>>>();
private HttpServer _server;
private string _channelName;
protected static Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, bool>>>> UsersReadyState = new Dictionary<string, Dictionary<string, Dictionary<string, Dictionary<string, bool>>>>();
protected static Dictionary<string, Dictionary<string, List<string>>> UsersDialogNpc = new Dictionary<string, Dictionary<string, List<string>>>();
protected static Dictionary<string, Dictionary<string, Dictionary<string, int>>> UsersDialogNpcCount = new Dictionary<string, Dictionary<string, Dictionary<string, int>>>();
protected HttpServer _server;
protected string _channelName;

public EchosyncChannelBehaviour(HttpServer server, string channelName)
{
_server = server;
_channelName = channelName;

if (!UsersReadyState.ContainsKey(channelName))
UsersReadyState.Add(channelName, new Dictionary<string, Dictionary<string, bool>>());
UsersReadyState.TryAdd(channelName, new Dictionary<string, Dictionary<string, Dictionary<string, bool>>>());
UsersDialogNpc.TryAdd(channelName, new Dictionary<string, List<string>>());
UsersDialogNpcCount.TryAdd(channelName, new Dictionary<string, Dictionary<string, int>>());
}

protected override void OnOpen()
{
try
{
LogHelper.Log($"Client with guid '{ID}' connected to channel '{_channelName}'!");
LogHelper.Log(_channelName, $"Client with guid '{ID}' connected!");
}
catch (Exception ex)
{
LogHelper.Log($"Error while client '{ID}' connected to channel '{_channelName}': {ex}");
LogHelper.Log(_channelName, $"Error while client '{ID}' connected: {ex}");
}

base.OnOpen();
Expand All @@ -43,17 +46,17 @@ protected override void OnClose(CloseEventArgs e)
{
try
{
LogHelper.Log($"Client with guid '{ID}' disconnected from channel '{_channelName}'!");
LogHelper.Log(_channelName, $"Client with guid '{ID}' disconnected!");

if (Sessions.Count == 0)
{
_server.RemoveWebSocketService($"/{_channelName}");
LogHelper.Log($"Last client disconnected from channel '{_channelName}' closing channel!");
LogHelper.Log(_channelName, $"Last client disconnected, closing channel!");
}
}
catch (Exception ex)
{
LogHelper.Log($"Error while client '{ID}' disconnected from channel '{_channelName}': {ex}");
LogHelper.Log(_channelName, $"Error while client '{ID}' disconnected: {ex}", true);
}

base.OnClose(e);
Expand All @@ -71,56 +74,123 @@ protected override void OnMessage(MessageEventArgs e)

switch (messageEnum)
{
case SyncMessages.JoinDialogue:
case SyncMessages.StartNpc:
userName = messageSplit[1];
var npcId = messageSplit[2];
LogHelper.Log(_channelName, $"Message received: '{messageEnum}' from '{userName}/{clientID}' for npc '{npcId}'");

UsersDialogNpc[_channelName].TryAdd(npcId, new List<string>());
if (!UsersDialogNpc[_channelName][npcId].Contains(userName))
UsersDialogNpc[_channelName][npcId].Add(userName);
UsersDialogNpcCount[_channelName].TryAdd(npcId, new Dictionary<string, int>());
UsersDialogNpcCount[_channelName][npcId].TryAdd(userName, 0);
UsersDialogNpcCount[_channelName][npcId][userName] = 0;
break;
case SyncMessages.EndNpc:
userName = messageSplit[1];
var dialogue = messageSplit[2];
LogHelper.Log($"Message received: '{messageEnum}' from '{userName}/{clientID}' in channel '{_channelName}' for dialogue '{dialogue}'");
npcId = messageSplit[2];
LogHelper.Log(_channelName, $"Message received: '{messageEnum}' from '{userName}/{clientID}' for npc '{npcId}'");

UsersReadyState[_channelName].TryAdd(dialogue, new Dictionary<string, bool>());
UsersReadyState[_channelName][dialogue].TryAdd(userName, false);
UsersReadyState[_channelName][npcId].Values.ToList().ForEach(x => x.Remove(userName));
UsersDialogNpc[_channelName][npcId].Remove(userName);
UsersDialogNpcCount[_channelName].Remove(userName);
if (UsersDialogNpc[_channelName][npcId].Count == 0)
UsersDialogNpc[_channelName].Remove(npcId);
break;
case SyncMessages.LeaveDialogue:
case SyncMessages.JoinDialogue:
userName = messageSplit[1];
dialogue = messageSplit[2];
LogHelper.Log($"Message received: '{messageEnum}' from '{userName}/{clientID}' in channel '{_channelName}' for dialogue '{dialogue}'");
npcId = messageSplit[2];
var dialogue = messageSplit[3];
LogHelper.Log(_channelName, $"Message received: '{messageEnum}' from '{userName}/{clientID}' for dialogue '{dialogue}'");

if (UsersReadyState[_channelName].ContainsKey(dialogue))
UsersReadyState[_channelName][dialogue].Remove(userName);
UsersDialogNpcCount[_channelName][npcId][userName] += 1;
UsersReadyState[_channelName].TryAdd(npcId, new Dictionary<string, Dictionary<string, bool>>());
UsersReadyState[_channelName][npcId].TryAdd(dialogue, new Dictionary<string, bool>());
UsersReadyState[_channelName][npcId][dialogue].TryAdd(userName, false);
Sessions.Broadcast($"{(int)SyncMessages.ConnectedPlayersDialogue}|{npcId}|{dialogue}|{UsersReadyState[_channelName][npcId][dialogue].Count}");
Sessions.Broadcast($"{(int)SyncMessages.ConnectedPlayersReady}|{npcId}|{dialogue}|{UsersReadyState[_channelName][npcId][dialogue].Values.ToList().FindAll(p => p == true).Count}");
break;
case SyncMessages.Click:
userName = messageSplit[1];
dialogue = messageSplit[2];
UsersReadyState[_channelName][dialogue][userName] = true;
LogHelper.Log($"Message received: '{messageEnum}' from '{userName}/{clientID}' in channel '{_channelName}'");
LogHelper.Log($"User '{userName}/{clientID}' in channel '{_channelName}' is ready");
var allReady = true;
foreach (var dialogUser in UsersReadyState[_channelName][dialogue])
npcId = messageSplit[2];
dialogue = messageSplit[3];
LogHelper.Log(_channelName, $"Message received: '{messageEnum}' from '{userName}/{clientID}'");
LogHelper.Log(_channelName, $"User '{userName}/{clientID}' in channel '{_channelName}' is ready");
if (!UserClick(clientID, userName, npcId, dialogue))
{
if (!dialogUser.Value)
{
allReady = false;
break;
}
Sessions.Broadcast($"{(int)SyncMessages.ConnectedPlayersDialogue}|{npcId}|{dialogue}|{UsersReadyState[_channelName][npcId][dialogue].Count}");
Sessions.Broadcast($"{(int)SyncMessages.ConnectedPlayersReady}|{npcId}|{dialogue}|{UsersReadyState[_channelName][npcId][dialogue].Values.ToList().FindAll(p => p == true).Count}");
}

if (allReady)
break;
case SyncMessages.ClickForce:
userName = messageSplit[1];
npcId = messageSplit[2];
dialogue = messageSplit[3];
LogHelper.Log(_channelName, $"Message received: '{messageEnum}' from '{userName}/{clientID}'");
if (!UserClick(clientID, userName, npcId, dialogue))
{
LogHelper.Log($"All users in channel '{_channelName}' for dialogue '{dialogue}' are ready sending advance command'");
Sessions.Broadcast($"{(int)SyncMessages.ClickDone}");
UsersReadyState[_channelName].Remove(dialogue);
LogHelper.Log(_channelName, $"User '{userName}/{clientID}' is forcing click for itself");
Send($"{(int)SyncMessages.ClickDone}");
UsersReadyState[_channelName][npcId][dialogue].Remove(userName);
if (UsersReadyState[_channelName][npcId][dialogue].Count == 0)
UsersReadyState[_channelName][npcId].Remove(dialogue);
else
{
Sessions.Broadcast($"{(int)SyncMessages.ConnectedPlayersDialogue}|{npcId}|{dialogue}|{UsersReadyState[_channelName][npcId][dialogue].Count}");
Sessions.Broadcast($"{(int)SyncMessages.ConnectedPlayersReady}|{npcId}|{dialogue}|{UsersReadyState[_channelName][npcId][dialogue].Values.ToList().FindAll(p => p == true).Count}");
}
}
break;
case SyncMessages.Test:
LogHelper.Log($"Message received: '{messageEnum}' from '{userName}/{clientID}' in channel '{_channelName}'");
LogHelper.Log(_channelName, $"Message received: '{messageEnum}' from '{userName}/{clientID}'");
Send($"{(int)SyncMessages.Test}");
break;
}

}
catch (Exception ex)
{
LogHelper.Log($"Illegal message from '{userName}/{clientID}' message: '{message}' Exception: {ex}");
LogHelper.Log(_channelName, $"Illegal message from '{userName}/{clientID}' message: '{message}' Exception: {ex}", true);
}
}

protected bool UserClick(string clientID, string userName, string npcId, string dialogue)
{
UsersReadyState[_channelName][npcId][dialogue][userName] = true;
var allReady = true;
foreach (var dialogUser in UsersReadyState[_channelName][npcId][dialogue])
{
if (!dialogUser.Value)
{
allReady = false;
break;
}
}

if (allReady)
{
var userCount = UsersDialogNpcCount[_channelName][npcId][userName];
if (UsersDialogNpcCount[_channelName][npcId].Values.ToList().FindIndex(p => p < userCount) >= 0)
{
LogHelper.Log(_channelName, $"User '{userName}/{clientID}' is waiting for catchup");
Send($"{(int)SyncMessages.ClickWaitCatchup}");
return false;
}
}

if (allReady)
{
LogHelper.Log(_channelName, $"All users in channel for dialogue '{dialogue}' are ready sending advance command'");
Sessions.Broadcast($"{(int)SyncMessages.ClickDone}");
UsersReadyState[_channelName][npcId].Remove(dialogue);
}
else
{
LogHelper.Log(_channelName, $"User '{userName}/{clientID}' is waiting for the others");
Send($"{(int)SyncMessages.ClickWait}");
}

return allReady;
}
}
}
1 change: 1 addition & 0 deletions Echosync-Server/Echosync-Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
<RootNamespace>Echosync_Server</RootNamespace>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Version>0.0.0.2</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
15 changes: 12 additions & 3 deletions Echosync-Server/Helper/LogHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,24 @@ public static class LogHelper
{
private static string FileName;

public static void Log(string log)
public static void Log(string channelName, string log, bool error = false)
{
var timeStamp = DateTime.Now;
log = $"{timeStamp.ToShortDateString()} {timeStamp.ToShortTimeString()}: {log}";

if (!Path.Exists("Logs"))
Directory.CreateDirectory("Logs");

if (string.IsNullOrWhiteSpace(FileName))
FileName = $"{timeStamp.ToString("yyyy-MM-dd")}_Server.log";
FileName = $"Logs\\{timeStamp.ToString("yyyy-MM-dd")}_{channelName}.log";
File.AppendAllLines(FileName, new string[] { log });
Console.WriteLine(log);

if (error)
Console.ForegroundColor = ConsoleColor.Red;
else
Console.ForegroundColor = ConsoleColor.White;

Console.WriteLine($"{log} - Channel: {channelName}");
}
}
}
6 changes: 3 additions & 3 deletions Echosync-Server/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,17 @@ public class Program

static void Main(string[] args)
{
LogHelper.Log($"Starting server with port '{Port}'!");
LogHelper.Log("Main", $"Starting server with port '{Port}'!");
var wssv = new HttpServer(Port);
LogHelper.Log($"Starting main Thread!");
LogHelper.Log("Main", $"Starting main Thread!");
wssv.AddWebSocketService<EchosyncBehaviour>("/main", () => new EchosyncBehaviour(wssv));
wssv.Start();

var command = "";
while (command != "quit")
{
command = Console.ReadLine();
LogHelper.Log($"Command '{command}' entered");
LogHelper.Log("Main", $"Command '{command}' entered");
}

wssv.WebSocketServices.Broadcast($"{((int)SyncMessages.ServerShutdown)}");
Expand Down
6 changes: 4 additions & 2 deletions Echosync.sln
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ VisualStudioVersion = 17.10.34916.146
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Echosync", "Echosync\Echosync.csproj", "{13C812E9-0D42-4B95-8646-40EEBF30636F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Echosync-Server", "Echosync-Server\Echosync-Server.csproj", "{879FC7FB-5B24-4775-BC34-073A30C95A57}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Echosync-Server", "Echosync-Server\Echosync-Server.csproj", "{879FC7FB-5B24-4775-BC34-073A30C95A57}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Echosync-Data", "Echosync-Data\Echosync-Data.csproj", "{F4898945-1598-42A7-963C-AAFEB3F5786D}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Echosync-Data", "Echosync-Data\Echosync-Data.csproj", "{F4898945-1598-42A7-963C-AAFEB3F5786D}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{9C64E85B-198F-465A-8B58-B47BD415CC8F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down
2 changes: 1 addition & 1 deletion Echosync/DataClasses/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class Configuration : IPluginConfiguration
public bool SomePropertyToBeSavedAndWithADefault { get; set; } = true;
public bool Enabled { get; set; } = true;
public bool ConnectAtStart { get; set; } = false;
public string SyncServer { get; set; } = "wss://echosync.hogwarts-library.de";
public string SyncServer { get; set; } = "wss://echosync.echotools.cloud";
public string SyncChannel { get; set; } = "";
public LogConfig logConfig { get; set; } = new LogConfig();

Expand Down
2 changes: 1 addition & 1 deletion Echosync/Echosync.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<Import Project="Dalamud.Plugin.Bootstrap.targets" />

<PropertyGroup>
<Version>0.0.0.2</Version>
<Version>0.0.0.3</Version>
<Description>Echosync</Description>
<PackageProjectUrl>https://github.com/RenNagasaki/Echosync</PackageProjectUrl>
<PackageLicenseExpression>AGPL-3.0-or-later</PackageLicenseExpression>
Expand Down
Loading

0 comments on commit 306c3eb

Please sign in to comment.