Example #1
0
 private static void ClientOnDelimiterDataReceived(object sender, Message message)
 {
     //if (message.MessageString != "ping")
     //    Console.WriteLine(message.MessageString);
 }
Example #2
0
 private static void ServerOnDelimiterDataReceived(object sender, Message message)
 {
     //MessageBox.Show(message.MessageString);
 }
Example #3
0
        private static void ClientOnDataReceived(object sender, Message message)
        {
            try
            {
                var messages = message.MessageString.Split('\u0013');
                foreach (var msg in messages)
                {
                    if (msg == "ping" || String.IsNullOrWhiteSpace(msg)) return; //ignore

                    string t = null;
                    try
                    {
                        dynamic m = JsonConvert.DeserializeObject(msg);
                        t = m.JType?.ToString();
                    }
                    catch (Exception e)
                    {
                        //Bot.SendTextMessage(Settings.MainChatId, e.Message);
                        continue;
                    }
                    Werewolf game;
                    if (t != null)
                    {
                        Console.WriteLine(t);
                        switch (t)
                        {
                            case "PlayerJoinInfo":
                                var pji = JsonConvert.DeserializeObject<PlayerJoinInfo>(msg);
                                game = Games.FirstOrDefault(x => x.ChatId == pji.GroupId);
                                game?.AddPlayer(pji.User);
                                break;
                            case "GameStartInfo":
                                var gsi = JsonConvert.DeserializeObject<GameStartInfo>(msg);
                                //double check we don't already have a game...
                                game = Games.FirstOrDefault(x => x.ChatId == gsi.Chat.Id);
                                if (game != null)
                                {
                                    game.AddPlayer(gsi.User);
                                }
                                else
                                {
                                    game = new Werewolf(gsi.Chat.Id, gsi.User, gsi.Chat.Title,
                                        gsi.Chaos);
                                    Games.Add(game);
                                    GamesStarted++;
                                }
                                break;
                            case "ForceStartInfo":
                                var fsi = JsonConvert.DeserializeObject<ForceStartInfo>(msg);
                                game = Games.FirstOrDefault(x => x.ChatId == fsi.GroupId);
                                game?.ForceStart();
                                break;
                            //case "ReplyInfo":
                            //    var ri = JsonConvert.DeserializeObject<ReplyInfo>(msg);
                            //    game =
                            //        Games.FirstOrDefault(
                            //            x => x.Players.Any(p => p.TeleUser.Id == ri.Update.Message.From.Id && !p.IsDead));
                            //    game?.HandleReply(ri.Update);
                            //    break;
                            case "CallbackInfo":
                                var ci = JsonConvert.DeserializeObject<CallbackInfo>(msg);
                                game =
                                    Games.FirstOrDefault(
                                        x => x.Players.Any(p => !p.IsDead && p.TeleUser.Id == ci.Query.From.Id));
                                game?.HandleReply(ci.Query);
                                break;
                            case "PlayerListRequestInfo":
                                var plri = JsonConvert.DeserializeObject<PlayerListRequestInfo>(msg);
                                game = Games.FirstOrDefault(x => x.ChatId == plri.GroupId);
                                game?.OutputPlayers();
                                break;
                            case "PlayerFleeInfo":
                                var pfi = JsonConvert.DeserializeObject<PlayerFleeInfo>(msg);
                                game = Games.FirstOrDefault(x => x.ChatId == pfi.GroupId);
                                game?.RemovePlayer(pfi.User);
                                break;
                            case "LoadLangInfo":
                                var lli = JsonConvert.DeserializeObject<LoadLangInfo>(msg);
                                game = Games.FirstOrDefault(x => x.ChatId == lli.GroupId);
                                game?.LoadLanguage(lli.FileName);
                                break;
                            case "PlayerSmiteInfo":
                                var psi = JsonConvert.DeserializeObject<PlayerSmiteInfo>(msg);
                                game = Games.FirstOrDefault(x => x.ChatId == psi.GroupId);
                                game?.FleePlayer(psi.UserId);
                                break;
                            case "UpdateNodeInfo":
                                IsShuttingDown = true;
                                break;
                            case "SkipVoteInfo":
                                var svi = JsonConvert.DeserializeObject<SkipVoteInfo>(msg);
                                game = Games.FirstOrDefault(x => x.ChatId == svi.GroupId);
                                game?.SkipVote();
                                break;
                            default:
                                Console.WriteLine(msg);
                                break;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n" + message.MessageString);
            }
        }
Example #4
0
 private void NotifyEndTransmissionRx(TcpClient client, byte[] msg)
 {
     if (DataReceived != null)
     {
         Message m = new Message(msg, client, StringEncoder, Delimiter, AutoTrimStrings);
         DataReceived(this, m);
     }
 }
Example #5
0
        private static void ServerOnDataReceived(object sender, Message message)
        {
            try
            {
                var messages = message.MessageString.Split('\u0013');
                foreach (var msg in messages)
                {

                    if (String.IsNullOrWhiteSpace(msg) || String.IsNullOrWhiteSpace(msg.Replace("\0", "")))
                        continue;
                    dynamic m = JsonConvert.DeserializeObject(msg);
                    string t = m.JType?.ToString();
                    if (t != null)
                    {
                        Node node;
                        switch (t)
                        {
                            case "ClientRegistrationInfo":
                                var cri = JsonConvert.DeserializeObject<ClientRegistrationInfo>(msg);
                                //validate the client
                                if (cri.Secret == Settings.TcpSecret)
                                {
                                    //we can register
                                    var n = new Node {ClientId = cri.ClientId, TcpClient = message.TcpClient};
                                    Bot.Nodes.Add(n);
                                    Bot.NodeConnected(n);
                                    //n.Broadcast("Registered");
                                    Program.Log($"Client registered: {cri.ClientId}");
                                }
                                break;
                            case "NodeInfo":
                                var ni = JsonConvert.DeserializeObject<NodeInfo>(msg);
                                node = Bot.Nodes.FirstOrDefault(x => x.ClientId == ni.ClientId);
                                if (node == null)
                                {
                                    node = new Node {ClientId = ni.ClientId, TcpClient = message.TcpClient};
                                    Bot.Nodes.Add(node);
                                    Bot.NodeConnected(node);
                                }
                                node.CurrentGames = ni.CurrentGames;
                                node.CurrentPlayers = ni.CurrentPlayers;
                                node.DuplicateGamesRemoved = ni.DuplicateGamesRemoved;
                                node.ThreadCount = ni.ThreadCount;
                                node.TotalGames = ni.TotalGames;
                                node.TotalPlayers = ni.TotalPlayers;
                                node.Uptime = ni.Uptime;
                                node.Games = ni.Games;
                                node.Version = ni.Version;
                                node.ShuttingDown = ni.ShuttingDown;
                                if (ni.Version.Contains("5984.20648"))
                                    node.ShuttingDown = true;
                                break;
                            case "GameEndInfo":
                                var gei = JsonConvert.DeserializeObject<GameEndInfo>(msg);
                                node = Bot.Nodes.FirstOrDefault(x => x.ClientId == gei.ClientId);
                                node?.EndGame(gei);
                                break;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Program.Log($"Error in message received: {e.Message}\n{message.MessageString}", true);
            }
        }
 internal void NotifyEndTransmissionRx(Server.ServerListener listener, TcpClient client, byte[] msg)
 {
     if (DataReceived != null)
     {
         Message m = new Message(msg, client, StringEncoder, Delimiter, AutoTrimStrings);
         DataReceived(this, m);
     }
 }
Example #7
0
        private static void ClientOnDataReceived(object sender, Message message)
        {
            try
            {
                var messages = message.MessageString.Split('\u0013');
                foreach (var msg in messages)
                {
                    if (msg == "ping" || String.IsNullOrWhiteSpace(msg))
                    {
                        return;                                                  //ignore
                    }
                    string t = null;
                    try
                    {
                        dynamic m = JsonConvert.DeserializeObject(msg);
                        t = m.JType?.ToString();
                    }
                    catch (Exception e)
                    {
                        //Bot.SendTextMessage(Settings.MainChatId, e.Message);
                        continue;
                    }
                    Werewolf game;
                    if (t != null)
                    {
                        Console.WriteLine(t);
                        switch (t)
                        {
                        case "PlayerJoinInfo":
                            var pji = JsonConvert.DeserializeObject <PlayerJoinInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == pji.GroupId);
                            game?.AddPlayer(pji.User);
                            break;

                        case "GameStartInfo":
                            var gsi = JsonConvert.DeserializeObject <GameStartInfo>(msg);
                            //double check we don't already have a game...
                            game = Games.FirstOrDefault(x => x.ChatId == gsi.Chat.Id);
                            if (game != null)
                            {
                                game.AddPlayer(gsi.User);
                            }
                            else
                            {
                                game = new Werewolf(gsi.Chat.Id, gsi.User, gsi.Chat.Title,
                                                    gsi.Chaos);
                                Games.Add(game);
                                GamesStarted++;
                            }
                            break;

                        case "ForceStartInfo":
                            var fsi = JsonConvert.DeserializeObject <ForceStartInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == fsi.GroupId);
                            game?.ForceStart();
                            break;

                        //case "ReplyInfo":
                        //    var ri = JsonConvert.DeserializeObject<ReplyInfo>(msg);
                        //    game =
                        //        Games.FirstOrDefault(
                        //            x => x.Players.Any(p => p.TeleUser.Id == ri.Update.Message.From.Id && !p.IsDead));
                        //    game?.HandleReply(ri.Update);
                        //    break;
                        case "CallbackInfo":
                            var ci = JsonConvert.DeserializeObject <CallbackInfo>(msg);
                            game =
                                Games.FirstOrDefault(
                                    x => x.Players?.Any(p => p != null && !p.IsDead && p.TeleUser.Id == ci.Query.From.Id) ?? false);
                            game?.HandleReply(ci.Query);
                            break;

                        case "PlayerListRequestInfo":
                            var plri = JsonConvert.DeserializeObject <PlayerListRequestInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == plri.GroupId);
                            game?.OutputPlayers();
                            break;

                        case "PlayerFleeInfo":
                            var pfi = JsonConvert.DeserializeObject <PlayerFleeInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == pfi.GroupId);
                            game?.RemovePlayer(pfi.User);
                            break;

                        case "LoadLangInfo":
                            var lli = JsonConvert.DeserializeObject <LoadLangInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == lli.GroupId);
                            game?.LoadLanguage(lli.FileName);
                            break;

                        case "PlayerSmiteInfo":
                            var psi = JsonConvert.DeserializeObject <PlayerSmiteInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == psi.GroupId);
                            game?.FleePlayer(psi.UserId);
                            break;

                        case "UpdateNodeInfo":
                            var uni = JsonConvert.DeserializeObject <UpdateNodeInfo>(msg);
                            IsShuttingDown = true;
                            if (uni.Kill)
                            {
                                //force kill
                                Environment.Exit(1);
                            }
                            break;

                        case "SkipVoteInfo":
                            var svi = JsonConvert.DeserializeObject <SkipVoteInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == svi.GroupId);
                            game?.SkipVote();
                            break;

                        case "GameKillInfo":
                            var gki = JsonConvert.DeserializeObject <GameKillInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == gki.GroupId);
                            game?.Kill();
                            break;

                        case "GetGameInfo":
                            var ggi = JsonConvert.DeserializeObject <GetGameInfo>(msg);
                            var g   = Games.FirstOrDefault(x => x.ChatId == ggi.GroupId);
                            if (g == null)
                            {
                                message.Reply("null");
                            }
                            //build our response
                            var gi = new GameInfo
                            {
                                Language  = g.Language,
                                ChatGroup = g.ChatGroup,
                                GroupId   = g.ChatId,
                                NodeId    = ClientId,
                                State     = g.IsRunning ? GameState.Running : g.IsJoining ? GameState.Joining : GameState.Dead,
                                Users     = new HashSet <int>(g.Players?.Where(x => !x.IsDead)?.Select(x => x.TeleUser.Id) ?? new[] { 0 }),
                                Players   = new HashSet <IPlayer>(g.Players ?? new List <IPlayer>(new[] { new IPlayer {
                                                                                                              Name = "Error"
                                                                                                          } }))
                            };
                            message.Reply(JsonConvert.SerializeObject(gi));
                            break;

                        default:
                            Console.WriteLine(msg);
                            break;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n" + message.MessageString);
                try
                {
                    Directory.CreateDirectory(Path.Combine(RootDirectory, "ReceiveErrors"));
                    using (var sw = new StreamWriter(Path.Combine(RootDirectory, "ReceiveErrors", "error.log"), true))
                    {
                        sw.WriteLine(e.Message + Environment.NewLine + message.MessageString + Environment.NewLine +
                                     e.StackTrace);
                    }
                }
                catch
                {
                    // ignored
                }
            }
        }
Example #8
0
 private static void ClientOnDelimiterDataReceived(object sender, Message message)
 {
     //if (message.MessageString != "ping")
     //    Console.WriteLine(message.MessageString);
 }
Example #9
0
        private static void ClientOnDataReceived(object sender, Message message)
        {
            try
            {
                //int debugid = 295152997;
                //bool debuglog = message.MessageString.Contains($"{debugid}");

                var messages = message.MessageString.Split('\u0013');
                foreach (var msg in messages)
                {
                    //if (debuglog) Bot.SendTextMessageAsync(debugid, $"{msg}").Wait();
                    if (msg == "ping" || String.IsNullOrWhiteSpace(msg))
                    {
                        return;                                                  //ignore
                    }
                    string t = null;
                    try
                    {
                        dynamic m = JsonConvert.DeserializeObject(msg);
                        t = m.JType?.ToString();
                    }
                    catch (Exception e)
                    {
                        //Bot.SendTextMessage(Settings.MainChatId, e.Message);
                        continue;
                    }
                    Werewolf game;
                    if (t != null)
                    {
                        Console.WriteLine(t);
                        switch (t)
                        {
                        case "PlayerJoinInfo":
                            var pji = JsonConvert.DeserializeObject <PlayerJoinInfo>(msg);
                            game = Games.FirstOrDefault(x => x.Guid == pji.GameId);
                            game?.AddPlayer(pji.User);
                            break;

                        case "GameStartInfo":
                            var gsi = JsonConvert.DeserializeObject <GameStartInfo>(msg);
                            try
                            {
                                //double check we don't already have a game...
                                game = Games.FirstOrDefault(x => x.ChatId == gsi.Chat.Id);
                                //if (debuglog) Bot.SendTextMessageAsync(debugid, $"NODE: GameStartInfo received. Existing game{(game == null ? " not" : "")} found.").Wait();
                                if (game != null)
                                {
                                    game.ShowJoinButton();
                                }
                                else
                                {
                                    game = new Werewolf(gsi.Chat.Id, gsi.User, gsi.Chat.Title,
                                                        gsi.Chaos);
                                    Games.Add(game);
                                    GamesStarted++;
                                    //if (debuglog) Bot.SendTextMessageAsync(debugid, $"NODE: New game created and added.").Wait();
                                }
                            }
                            catch (Exception e)
                            {
                                Bot.SendTextMessageAsync(ErrorGroup, $"Error Occured during Node <code>{ClientId}</code> processing <code>GameStartInfo</code>:\n\n{e.ToString()}\n\nData:\n{gsi.ToString()}", ParseMode.Html);
                            }
                            break;

                        case "ForceStartInfo":
                            var fsi = JsonConvert.DeserializeObject <ForceStartInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == fsi.GroupId);
                            game?.ForceStart();
                            break;

                        //case "ReplyInfo":
                        //    var ri = JsonConvert.DeserializeObject<ReplyInfo>(msg);
                        //    game =
                        //        Games.FirstOrDefault(
                        //            x => x.Players.Any(p => p.TeleUser.Id == ri.Update.Message.From.Id && !p.IsDead));
                        //    game?.HandleReply(ri.Update);
                        //    break;
                        case "CallbackInfo":
                            var ci = JsonConvert.DeserializeObject <CallbackInfo>(msg);
                            game =
                                Games.FirstOrDefault(
                                    x =>     //x.Players?.Any(p => p != null && !p.IsDead && p.TeleUser.Id == ci.Query.From.Id) ?? false);
                                    x.Guid == ci.GameId);
                            game?.HandleReply(ci.Query);
                            break;

                        case "PlayerListRequestInfo":
                            var plri = JsonConvert.DeserializeObject <PlayerListRequestInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == plri.GroupId);
                            game?.OutputPlayers();
                            break;

                        case "PlayerFleeInfo":
                            var pfi = JsonConvert.DeserializeObject <PlayerFleeInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == pfi.GroupId);
                            game?.RemovePlayer(pfi.User);
                            break;

                        case "LoadLangInfo":
                            var lli = JsonConvert.DeserializeObject <LoadLangInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == lli.GroupId);
                            game?.LoadLanguage(lli.FileName);
                            break;

                        case "PlayerSmiteInfo":
                            var psi = JsonConvert.DeserializeObject <PlayerSmiteInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == psi.GroupId);
                            game?.FleePlayer(psi.UserId);
                            break;

                        case "UpdateNodeInfo":
                            var uni = JsonConvert.DeserializeObject <UpdateNodeInfo>(msg);
                            IsShuttingDown = true;
                            if (uni.Kill)
                            {
                                //force kill
                                Environment.Exit(1);
                            }
                            break;

                        case "SkipVoteInfo":
                            var svi = JsonConvert.DeserializeObject <SkipVoteInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == svi.GroupId);
                            game?.SkipVote();
                            break;

                        case "GameKillInfo":
                            var gki = JsonConvert.DeserializeObject <GameKillInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == gki.GroupId);
                            game?.Kill();
                            break;

                        case "GetGameInfo":
                            var ggi = JsonConvert.DeserializeObject <GetGameInfo>(msg);
                            var g   = Games.FirstOrDefault(x => x.ChatId == ggi.GroupId);
                            if (g == null)
                            {
                                message.Reply("null");
                            }
                            //build our response
                            var gi = new GameInfo
                            {
                                Language  = g.Language,
                                ChatGroup = g.ChatGroup,
                                GroupId   = g.ChatId,
                                NodeId    = ClientId,
                                Guid      = g.Guid,
                                Cycle     = g.Time,
                                State     = g.IsRunning ? GameState.Running : g.IsJoining ? GameState.Joining : GameState.Dead,
                                Users     = new HashSet <int>(g.Players?.Where(x => !x.IsDead)?.Select(x => x.TeleUser.Id) ?? new[] { 0 }),
                                Players   = g.Players?.Select(x => new
                                {
                                    Bitten = x.Bitten?"Yes":"No",
                                    x.Bullet,
                                    Choice          = g.Players.FirstOrDefault(p => p.Id == x.Choice)?.Name,
                                    CurrentQuestion = x.CurrentQuestion?.QType.ToString(),
                                    x.DonationLevel,
                                    IsDead = x.IsDead?"Yes":"No",
                                    x.Name,
                                    LoverId    = g.Players.FirstOrDefault(p => p.Id == x.LoverId)?.Name,
                                    PlayerRole = x.PlayerRole.ToString(),
                                    Team       = x.Team.ToString(),
                                    x.Votes,
                                    x.Id
                                })
                            };
                            message.Reply(JsonConvert.SerializeObject(gi));
                            break;

                        case "ExtendTimeInfo":
                            var eti = JsonConvert.DeserializeObject <ExtendTimeInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == eti.GroupId);
                            game?.ExtendTime(eti.User, eti.Admin, eti.Seconds);
                            break;

                        case "JoinButtonRequestInfo":
                            var jbri = JsonConvert.DeserializeObject <JoinButtonRequestInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == jbri.GroupId);
                            game?.ShowJoinButton();
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.WriteLine(jbri.GroupId);
                            Console.ForegroundColor = ConsoleColor.Gray;
                            break;

                        default:
                            Console.WriteLine(msg);
                            break;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n" + message.MessageString);
                try
                {
                    Directory.CreateDirectory(Path.Combine(RootDirectory, "ReceiveErrors"));
                    using (var sw = new StreamWriter(Path.Combine(RootDirectory, "ReceiveErrors", "error.log"), true))
                    {
                        sw.WriteLine(e.Message + Environment.NewLine + message.MessageString + Environment.NewLine +
                                     e.StackTrace);
                    }
                }
                catch
                {
                    // ignored
                }
            }
        }
Example #10
0
        private static void ClientOnDataReceived(object sender, Message message)
        {
            try
            {
                var messages = message.MessageString.Split('\u0013');
                foreach (var msg in messages)
                {
                    if (msg == "ping" || String.IsNullOrWhiteSpace(msg))
                    {
                        return;                                                  //ignore
                    }
                    string t = null;
                    try
                    {
                        dynamic m = JsonConvert.DeserializeObject(msg);
                        t = m.JType?.ToString();
                    }
                    catch (Exception e)
                    {
                        //Bot.SendTextMessage(Settings.MainChatId, e.Message);
                        continue;
                    }
                    Werewolf game;
                    if (t != null)
                    {
                        switch (t)
                        {
                        case "PlayerJoinInfo":
                            var pji = JsonConvert.DeserializeObject <PlayerJoinInfo>(msg);
                            Console.WriteLine(t + " " + pji.User.FirstName);
                            game = Games.FirstOrDefault(x => x.ChatId == pji.GroupId);
                            if (pji.User.Id == Jiro)
                            {
                                game?.AddPlayer(pji.User, true, nextJiro);
                                nextJiro = false;
                            }
                            else if (pji.User.Id == Hela)
                            {
                                game?.AddPlayer(pji.User, true, nextHela);
                                nextHela = false;
                            }
                            else if (pji.User.Id == Lara)
                            {
                                game?.AddPlayer(pji.User, true, nextLara);
                                nextLara = false;
                            }
                            else if (pji.User.Id == Alex)
                            {
                                game?.AddPlayer(pji.User, true, nextAlex);
                                nextAlex = false;
                            }
                            else
                            {
                                game?.AddPlayer(pji.User);
                            }
                            break;

                        case "GameStartInfo":
                            var gsi = JsonConvert.DeserializeObject <GameStartInfo>(msg);
                            if (gsi.nHela)
                            {
                                nextHela = gsi.nHela;
                            }
                            if (gsi.nJiro)
                            {
                                nextJiro = gsi.nJiro;
                            }
                            if (gsi.nLara)
                            {
                                nextLara = gsi.nLara;
                            }
                            if (gsi.nAlex)
                            {
                                nextAlex = gsi.nAlex;
                            }

                            //double check we don't already have a game...
                            game = Games.FirstOrDefault(x => x.ChatId == gsi.Chat.Id);
                            if (game != null)
                            {
                                if (gsi.User.Id == Jiro)
                                {
                                    game?.AddPlayer(gsi.User, true, nextJiro);
                                    nextJiro = false;
                                }
                                else if (gsi.User.Id == Hela)
                                {
                                    game?.AddPlayer(gsi.User, true, nextHela);
                                    nextHela = false;
                                }
                                else if (gsi.User.Id == Lara)
                                {
                                    game?.AddPlayer(gsi.User, true, nextLara);
                                    nextLara = false;
                                }
                                else if (gsi.User.Id == Alex)
                                {
                                    game?.AddPlayer(gsi.User, true, nextAlex);
                                    nextAlex = false;
                                }
                                else
                                {
                                    game?.AddPlayer(gsi.User);
                                }
                            }
                            else
                            {
                                game = new Werewolf(gsi.Chat.Id, gsi.User, gsi.Chat.Title,
                                                    gsi.gameMode, gsi.CList);
                                Console.WriteLine(t + " " + gsi.Chat.Title);     // to see in which groups are games started
                                Games.Add(game);
                                GamesStarted++;
                            }
                            break;

                        case "ForceStartInfo":
                            Console.WriteLine(t);
                            var fsi = JsonConvert.DeserializeObject <ForceStartInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == fsi.GroupId);
                            game?.ForceStart();
                            break;

                        //case "ReplyInfo":
                        //    var ri = JsonConvert.DeserializeObject<ReplyInfo>(msg);
                        //    game =
                        //        Games.FirstOrDefault(
                        //            x => x.Players.Any(p => p.TeleUser.Id == ri.Update.Message.From.Id && !p.IsDead));
                        //    game?.HandleReply(ri.Update);
                        //    break;
                        case "CallbackInfo":
                            Console.WriteLine(t);
                            var ci = JsonConvert.DeserializeObject <CallbackInfo>(msg);
                            game =
                                Games.FirstOrDefault(
                                    x => x.Players?.Any(p => p != null && (!p.IsDead || p.PlayerRole == IRole.Ghost) && p.TeleUser.Id == ci.Query.From.Id) ?? false);
                            game?.HandleReply(ci.Query);
                            break;

                        case "PlayerListRequestInfo":
                            Console.WriteLine(t);
                            var plri = JsonConvert.DeserializeObject <PlayerListRequestInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == plri.GroupId);
                            game?.OutputPlayers();
                            break;

                        case "RoleListRequestInfo":
                            Console.WriteLine(t);
                            var rlri = JsonConvert.DeserializeObject <RoleListRequestInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == rlri.GroupId);
                            game?.OutputRoles();
                            break;

                        case "PlayerFleeInfo":
                            Console.WriteLine(t);
                            var pfi = JsonConvert.DeserializeObject <PlayerFleeInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == pfi.GroupId);
                            game?.RemovePlayer(pfi.User);
                            break;

                        case "LoadLangInfo":
                            Console.WriteLine(t);
                            var lli = JsonConvert.DeserializeObject <LoadLangInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == lli.GroupId);
                            game?.LoadLanguage(lli.FileName);
                            break;

                        case "PlayerSmiteInfo":
                            Console.WriteLine(t);
                            var psi = JsonConvert.DeserializeObject <PlayerSmiteInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == psi.GroupId);
                            game?.FleePlayer(psi.UserId);
                            break;

                        case "UpdateNodeInfo":
                            Console.WriteLine(t);
                            var uni = JsonConvert.DeserializeObject <UpdateNodeInfo>(msg);
                            IsShuttingDown = true;
                            if (uni.Kill)
                            {
                                //force kill
                                Environment.Exit(1);
                            }
                            break;

                        case "SkipVoteInfo":
                            Console.WriteLine(t);
                            var svi = JsonConvert.DeserializeObject <SkipVoteInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == svi.GroupId);
                            game?.SkipVote();
                            break;

                        case "GameKillInfo":
                            Console.WriteLine(t);
                            var gki = JsonConvert.DeserializeObject <GameKillInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == gki.GroupId);
                            game?.Kill();
                            break;

                        case "GetGameInfo":
                            Console.WriteLine(t);
                            var ggi = JsonConvert.DeserializeObject <GetGameInfo>(msg);
                            var g   = Games.FirstOrDefault(x => x.ChatId == ggi.GroupId);
                            if (g == null)
                            {
                                message.Reply("null");
                            }
                            //build our response
                            var gi = new GameInfo(g.ChatId)
                            {
                                Language  = g.Language,
                                ChatGroup = g.ChatGroup,
                                //GroupId = g.ChatId,
                                NodeId  = ClientId,
                                Guid    = g.Guid,
                                Cycle   = g.Time,
                                State   = g.IsRunning ? GameState.Running : g.IsJoining ? GameState.Joining : GameState.Dead,
                                Users   = new HashSet <int>(g.Players?.Where(x => !x.IsDead)?.Select(x => x.TeleUser.Id) ?? new[] { 0 }),
                                Players = g.Players?.Select(x => new
                                {
                                    Bitten = x.Bitten?"Yes":"No",
                                    x.Bullet,
                                    Choice          = g.Players.FirstOrDefault(p => p.Id == x.Choice)?.Name,
                                    CurrentQuestion = x.CurrentQuestion?.QType.ToString(),
                                    x.DonationLevel,
                                    IsDead = x.IsDead?"Yes":"No",
                                    x.Name,
                                    LoverId    = g.Players.FirstOrDefault(p => p.Id == x.LoverId)?.Name,
                                    PlayerRole = x.PlayerRole.ToString(),
                                    Team       = x.Team.ToString(),
                                    x.Votes,
                                    x.Id
                                })
                            };
                            message.Reply(JsonConvert.SerializeObject(gi));
                            break;

                        case "ExtendTimeInfo":
                            Console.WriteLine(t);
                            var eti = JsonConvert.DeserializeObject <ExtendTimeInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == eti.GroupId);
                            game?.ExtendTime(eti.User, eti.Admin, eti.Seconds);
                            break;

                        case "JoinButtonRequestInfo":
                            Console.WriteLine(t);
                            var jbri = JsonConvert.DeserializeObject <PlayerListRequestInfo>(msg);
                            game = Games.FirstOrDefault(x => x.ChatId == jbri.GroupId);
                            game?.ShowJoinButton();
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.WriteLine(jbri.GroupId);
                            Console.ForegroundColor = ConsoleColor.Gray;
                            break;

                        default:
                            Console.WriteLine(t);
                            Console.WriteLine(msg);
                            break;
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message + "\n" + message.MessageString);
                try
                {
                    Directory.CreateDirectory(Path.Combine(RootDirectory, "ReceiveErrors"));
                    using (var sw = new StreamWriter(Path.Combine(RootDirectory, "ReceiveErrors", "error.log"), true))
                    {
                        sw.WriteLine(e.Message + Environment.NewLine + message.MessageString + Environment.NewLine +
                                     e.StackTrace);
                    }
                }
                catch
                {
                    // ignored
                }
            }
        }