using System; using System.IO; using Grpc; using Grpc.Core; using Brazchat; using Google.Protobuf; using Newtonsoft.Json; namespace BrazChatServer { class MessagingImpl : Messaging.MessagingBase { public override Task SendMessage(SendMessageRequest request, ServerCallContext context) { string username = request.ClientUsername; if(request.ClientUsername == null) { username = "Guest"; } Console.WriteLine($"Message received: '{request.Message}' from {username}"); Utilities.LogNewMessage(request.Message, username); return Task.FromResult(new SendMessageReply { Confirmation = "Successfully sent message to target!" }); } public override Task GetMessageLogs(GetMessageLogsRequest request, ServerCallContext context) { return Task.FromResult(new GetMessageLogsReply { Log = File.ReadAllText(@$"{Program.brazChatPath}\log\ChatLog.txt")}); } public override Task GetMessages(GetMessagesRequest request, ServerCallContext context) { List text = File.ReadLines(@$"{Program.brazChatPath}\log\ChatLog.txt").Reverse().Take(20).Reverse().ToList(); string messages = string.Join("\n", text); return Task.FromResult(new GetMessagesReply { Confirmation = "Successful!", Messages = messages}); } public override Task WelcomeMessage(WelcomeMessageRequest request, ServerCallContext context) { return Task.FromResult(new WelcomeMessageReply {WelcomeLogo = Figgle.FiggleFonts.Banner3D.Render("BrazChat") , MOTD = File.ReadAllText(@$"{Program.brazChatPath}\config\MOTD.txt") }); //Make this read the logo from a file in the future. } public override Task Greeting(GreetingRequest request, ServerCallContext context) { return Task.FromResult(new GreetingReply { }); } } class Program { public static string brazChatPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); const int Port = 50051; public static void Main(string[] args) { CheckNecessaryFiles(); List configItems = new List(); using (StreamReader r = new StreamReader(@$"{Program.brazChatPath}\config\config.json")) { string json = r.ReadToEnd(); configItems = JsonConvert.DeserializeObject>(json); } Server server = new Server { Services = { Messaging.BindService(new MessagingImpl()) }, Ports = { new ServerPort(configItems[0].Host, configItems[0].Port, ServerCredentials.Insecure)} }; server.Start(); Console.WriteLine("Server running. Press any key to stop server."); Console.ReadKey(); } public static void CheckNecessaryFiles() { if (File.Exists(@$"{Program.brazChatPath}\config\MOTD.txt") == false) { Directory.CreateDirectory($@"{Program.brazChatPath}\config"); File.WriteAllText(@$"{Program.brazChatPath}\config\MOTD.txt", "Default MOTD"); } if (File.Exists(@$"{Program.brazChatPath}\config\config.json") == false) { Console.WriteLine("No config file found! Exiting."); Environment.Exit(2); } if (File.Exists(@$"{Program.brazChatPath}\log\ChatLog.txt") == false) { Directory.CreateDirectory($@"{Program.brazChatPath}\log"); File.WriteAllText(@$"{Program.brazChatPath}\log\ChatLog.txt", "Say something!\n"); } } } class Utilities { public static void LogNewMessage(string message, string username) { string path = @$"{Program.brazChatPath}\log\ChatLog.txt"; File.AppendAllText(path, $"{username}: {message}\n"); } } public class Config { public string Host; public int Port; } }