Current state of the websocket server for the Hermes client

This commit is contained in:
Tom
2024-06-24 22:21:59 +00:00
commit 95bc073a73
32 changed files with 1676 additions and 0 deletions

34
Requests/BanTTSUser.cs Normal file
View File

@ -0,0 +1,34 @@
// using System.Text.Json;
// using HermesSocketLibrary.db;
// using HermesSocketLibrary.Requests;
// namespace HermesSocketServer.Requests
// {
// public class BanTTSUser : IRequest
// {
// public string Name => "ban_tts_user";
// private Database _database;
// private ILogger _logger;
// public BanTTSUser(Database database, ILogger logger)
// {
// _database = database;
// _logger = logger;
// }
// public async Task<RequestResult> Grant(IDictionary<string, object> data)
// {
// // if (long.TryParse(data["user"].ToString(), out long user))
// // data["user"] = user;
// // if (data["broadcaster"] is JsonElement b)
// // data["broadcaster"] = b.ToString();
// // if (data["voice"] is JsonElement v)
// // data["voice"] = v.ToString();
// // string sql = "UPDATE \"TtsChatVoice\" (\"broadcasterId\", \"chatterId\", \"ttsVoiceId\") VALUES (@broadcaster, @user, @voice)";
// // var result = await _database.Execute(sql, data);
// // _logger.Information($"Selected a tts voice for {data["user"]} in channel {data["broadcaster"]}: {data["voice"]}");
// return new RequestResult(1 == 1, null);
// }
// }
// }

39
Requests/CreateTTSUser.cs Normal file
View File

@ -0,0 +1,39 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class CreateTTSUser : IRequest
{
public string Name => "create_tts_user";
private Database _database;
private ILogger _logger;
public CreateTTSUser(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
if (long.TryParse(data["chatter"].ToString(), out long chatter))
data["chatter"] = chatter;
if (data["voice"] is JsonElement v)
data["voice"] = v.ToString();
data["user"] = sender;
var check = await _database.ExecuteScalar("SELECT state FROM \"TtsVoiceState\" WHERE \"userId\" = @user AND \"ttsVoiceId\" = @voice", data) ?? false;
if (check is not bool state || !state){
return new RequestResult(false, null);
}
string sql = "INSERT INTO \"TtsChatVoice\" (\"userId\", \"chatterId\", \"ttsVoiceId\") VALUES (@user, @chatter, @voice)";
var result = await _database.Execute(sql, data);
_logger.Information($"Selected a tts voice for {data["chatter"]} in channel {data["user"]}: {data["voice"]}");
return new RequestResult(result == 1, null);
}
}
}

View File

@ -0,0 +1,46 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class CreateTTSVoice : IRequest
{
public string Name => "create_tts_voice";
private Database _database;
private ILogger _logger;
private Random _random;
public CreateTTSVoice(Database database, ILogger logger)
{
_database = database;
_logger = logger;
_random = new Random();
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
string id = RandomString(25);
data.Add("idd", id);
if (data["voice"] is JsonElement v)
data["voice"] = v.ToString();
string sql = "INSERT INTO \"TtsVoice\" (id, name) VALUES (@idd, @voice)";
var result = await _database.Execute(sql, data);
_logger.Information($"Added a new voice: {data["voice"]} (id: {data["idd"]})");
data.Remove("idd");
return new RequestResult(result == 1, id);
}
private string RandomString(int length)
{
const string chars = "abcdefghijklmnopqrstuvwxyz0123456789";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[_random.Next(s.Length)]).ToArray());
}
}
}

View File

@ -0,0 +1,31 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class DeleteTTSVoice : IRequest
{
public string Name => "delete_tts_voice";
private Database _database;
private ILogger _logger;
public DeleteTTSVoice(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
if (data["voice"] is JsonElement v)
data["voice"] = v.ToString();
string sql = "DELETE FROM \"TtsVoice\" WHERE id = @voice";
var result = await _database.Execute(sql, data);
_logger.Information($"Deleted a voice by id: {data["voice"]}");
return new RequestResult(result == 1, null);
}
}
}

29
Requests/GetChatterIds.cs Normal file
View File

@ -0,0 +1,29 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class GetChatterIds : IRequest
{
public string Name => "get_chatter_ids";
private Database _database;
private ILogger _logger;
public GetChatterIds(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
IList<long> ids = new List<long>();
string sql = $"SELECT id FROM \"Chatter\"";
await _database.Execute(sql, data, (r) => ids.Add(r.GetInt64(0)));
_logger.Information($"Fetched all chatters.");
return new RequestResult(true, ids, notifyClientsOnAccount: false);
}
}
}

34
Requests/GetEmotes.cs Normal file
View File

@ -0,0 +1,34 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using HermesSocketLibrary.Requests.Messages;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class GetEmotes : IRequest
{
public string Name => "get_emotes";
private Database _database;
private ILogger _logger;
public GetEmotes(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
IList<EmoteInfo> emotes = new List<EmoteInfo>();
string sql = $"SELECT id, name FROM \"Emote\"";
await _database.Execute(sql, data, (r) => emotes.Add(new EmoteInfo()
{
Id = r.GetString(0),
Name = r.GetString(1)
}));
_logger.Information($"Fetched all emotes.");
return new RequestResult(true, emotes, notifyClientsOnAccount: false);
}
}
}

31
Requests/GetTTSUsers.cs Normal file
View File

@ -0,0 +1,31 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class GetTTSUsers : IRequest
{
public string Name => "get_tts_users";
private readonly Database _database;
private readonly ILogger _logger;
public GetTTSUsers(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
data["user"] = sender;
IDictionary<long, string> users = new Dictionary<long, string>();
string sql = $"SELECT \"ttsVoiceId\", \"chatterId\" FROM \"TtsChatVoice\" WHERE \"userId\" = @user";
await _database.Execute(sql, data, (r) => users.Add(r.GetInt64(1), r.GetString(0)));
_logger.Information($"Fetched all chatters' selected tts voice for channel {data["user"]}.");
return new RequestResult(true, users, notifyClientsOnAccount: false);
}
}
}

33
Requests/GetTTSVoices.cs Normal file
View File

@ -0,0 +1,33 @@
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using HermesSocketLibrary.Requests.Messages;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class GetTTSVoices : IRequest
{
public string Name => "get_tts_voices";
private Database _database;
private ILogger _logger;
public GetTTSVoices(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
IList<VoiceDetails> voices = new List<VoiceDetails>();
string sql = "SELECT id, name FROM \"TtsVoice\"";
await _database.Execute(sql, data, (r) => voices.Add(new VoiceDetails()
{
Id = r.GetString(0),
Name = r.GetString(1)
}));
_logger.Information("Fetched all TTS voices.");
return new RequestResult(true, voices, notifyClientsOnAccount: false);
}
}
}

View File

@ -0,0 +1,36 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using HermesSocketLibrary.Requests.Messages;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class GetTTSWordFilters : IRequest
{
public string Name => "get_tts_word_filters";
private readonly Database _database;
private readonly ILogger _logger;
public GetTTSWordFilters(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
data["user"] = sender;
IList<TTSWordFilter> filters = new List<TTSWordFilter>();
string sql = $"SELECT id, search, replace FROM \"TtsWordFilter\" WHERE \"userId\" = @user";
await _database.Execute(sql, data, (r) => filters.Add(new TTSWordFilter()
{
Id = r.GetString(0),
Search = r.GetString(1),
Replace = r.GetString(2)
}));
return new RequestResult(true, filters, notifyClientsOnAccount: false);
}
}
}

View File

@ -0,0 +1,14 @@
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer
{
public class ServerRequestManager : RequestManager
{
public ServerRequestManager(IServiceProvider serviceProvider, ILogger logger) : base(serviceProvider, logger)
{
}
protected override string AssemblyName => "SocketServer";
}
}

40
Requests/UpdateTTSUser.cs Normal file
View File

@ -0,0 +1,40 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class UpdateTTSUser : IRequest
{
public string Name => "update_tts_user";
private readonly Database _database;
private readonly ILogger _logger;
public UpdateTTSUser(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
if (long.TryParse(data["chatter"].ToString(), out long chatterId))
data["chatter"] = chatterId;
if (data["voice"] is JsonElement v)
data["voice"] = v.ToString();
data["user"] = sender;
var check = await _database.ExecuteScalar("SELECT state FROM \"TtsVoiceState\" WHERE \"userId\" = @user AND \"ttsVoiceId\" = @voice", data) ?? false;
if (check is not bool state || !state)
{
return new RequestResult(false, null);
}
string sql = "UPDATE \"TtsChatVoice\" SET \"ttsVoiceId\" = @voice WHERE \"userId\" = @user AND \"chatterId\" = @chatter";
var result = await _database.Execute(sql, data);
_logger.Information($"Updated {data["chatter"]}'s selected tts voice to {data["voice"]} in channel {data["user"]}.");
return new RequestResult(result == 1, null);
}
}
}

View File

@ -0,0 +1,33 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class UpdateTTSVoice : IRequest
{
public string Name => "update_tts_voice";
private Database _database;
private ILogger _logger;
public UpdateTTSVoice(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
if (data["voice"] is JsonElement v)
data["voice"] = v.ToString();
if (data["voiceid"] is JsonElement id)
data["voiceid"] = id.ToString();
string sql = "UPDATE \"TtsVoice\" SET name = @voice WHERE id = @voiceid";
var result = await _database.Execute(sql, data);
_logger.Information($"Updated voice {data["voiceid"]}'s name to {data["voice"]}.");
return new RequestResult(result == 1, null);
}
}
}

View File

@ -0,0 +1,35 @@
using System.Text.Json;
using HermesSocketLibrary.db;
using HermesSocketLibrary.Requests;
using ILogger = Serilog.ILogger;
namespace HermesSocketServer.Requests
{
public class UpdateTTSVoiceState : IRequest
{
public string Name => "update_tts_voice_state";
private Database _database;
private ILogger _logger;
public UpdateTTSVoiceState(Database database, ILogger logger)
{
_database = database;
_logger = logger;
}
public async Task<RequestResult> Grant(string sender, IDictionary<string, object> data)
{
if (data["voice"] is JsonElement voice)
data["voice"] = voice.ToString();
if (data["state"] is JsonElement state)
data["state"] = state.ToString() == "True";
data["user"] = sender;
//string sql = "UPDATE \"TtsVoiceState\" SET state = @state WHERE \"userId\" = @user AND \"ttsVoiceId\" = @voice";
string sql = "INSERT INTO \"TtsVoiceState\" (\"userId\", \"ttsVoiceId\", state) VALUES (@user, @voice, @state) ON CONFLICT (\"userId\", \"ttsVoiceId\") DO UPDATE SET state = @state";
var result = await _database.Execute(sql, data);
_logger.Information($"Updated voice {data["voice"]}'s state (from {data["user"]}) to {data["state"]}.");
return new RequestResult(result == 1, null);
}
}
}