- using Microsoft.VisualBasic;
- using System;
- using System.Collections.Generic;
- using System.Text;
-
- namespace AnySignatureMethod
- {
- class Program
- {
- static void Main(string[] args)
- {
- //Чтобы не писать реализацию сервера, просто заведём переменную с его типом для примера.
- IServer server = null;
- var executor = new Executor();
-
- //Как видно это замыкание, лямбда захватила переменную server
- executor.RegisterMethodHandler("пока", s => server.CloseUserConnection(s.Id));
- executor.RegisterMethodHandler("kill", s =>
- {
- if (s.Group == ClientsGroup.Admin)
- {
- var words = s.GetCommands();
- //Очевидно что тут какая то логика что вторым словом идёт отключаемый юзер, ладно пускай так)
- server.CloseUserConnection(words[1]);
- }
- else
- {
- server.SendMessageToClient("Данная команда вам не доступна, вы не админ", s.Id);
- }
- });
- executor.RegisterMethodHandler("showclients", s =>
- {
- if (s.Group == ClientsGroup.Admin)
- {
-
- var sb = new StringBuilder();
- server.GetClientsNamesList().ForEach(n => sb.Append($"{n} \n"));
- server.SendMessageToClient(sb.ToString(), s.Id);
- }
- else
- {
- server.SendMessageToClient("Данная команда вам не доступна, вы не админ", s.Id);
- }
- });
- }
- }
-
- public enum ClientsGroup
- {
- Admin,
- User,
- }
-
- public class Sender
- {
- public string Id { get; set; }
- public ClientsGroup Group { get; set; }
- public string Words { get; set; }
- }
-
- public static class SenderExtentions
- {
- public static string[] GetCommands(this Sender self)
- {
- var commands = self.Words.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
- return commands;
- }
- }
-
- public interface IServer
- {
- void CloseUserConnection(string senderId);
- void SendMessageToClient(string message, string senderId);
- List<string> GetClientsNamesList();
- }
-
- public class Executor
- {
- private readonly Dictionary<string, Action<Sender>> queryMap;
-
- public void RegisterMethodHandler(string queryKey, Action<Sender> method)
- {
- queryMap.Add(queryKey, method);
- }
-
- public void Execute(Sender sender)
- {
- var words = sender.GetCommands();
- foreach (var word in words)
- {
- queryMap[word].Invoke(sender);
- }
- }
- }
- }
|