public ModelStatus PostingChat(string owner, string msg, ulong messageId, bool isPrivate = false)
        {
            var packet = new ModelPostingChat()
            {
                IdChat       = isPrivate ? 0 : 1, // system chat: for private command in game
                Message      = msg,
                Owner        = owner,
                IdDiscordMsg = messageId,
            };

            return(_sessionClient.TransObject2 <ModelStatus>(packet, PackageType.Request19PostingChat, PackageType.Response20PostingChat));
        }
Example #2
0
        public ModelStatus GetModelStatus(ModelPostingChat pc, ServiceContext context)
        {
            var timeNow = DateTime.UtcNow;

            if (string.IsNullOrEmpty(pc.Message))
            {
                return(new ModelStatus()
                {
                    Status = 0,
                    Message = null
                });
            }

            var chat = context.Player.Chats.Keys.FirstOrDefault(ct => ct.Id == pc.IdChat);

            if (chat == null)
            {
                return(new ModelStatus()
                {
                    Status = 1,
                    Message = "Chat not available"
                });
            }

            Grants       acceptedGrants;
            PlayerServer player;

            // обработка команд чата
            if ("discord".Equals(context.Player.Public.Login.ToLower()))
            {
                player = Repository.GetPlayerByLogin(pc.Owner);
                if (player == null)
                {
                    return(new ModelStatus()
                    {
                        Status = (int)ChatCmdResult.UserNotFound,
                        Message = $"user {pc.Owner} not found",
                    });
                }

                acceptedGrants = context.Player.Public.Grants & player.Public.Grants;
            }
            else
            {
                player         = context.Player;
                acceptedGrants = player.Public.Grants;
            }

            if (pc.Message[0] == '/')
            {
                var s       = pc.Message.Split(new char[] { ' ' }, 2);
                var command = s[0].Trim().ToLower();
                var args    = s.Length == 1 ? "" : s[1];
                //разбираем аргументы в кавычках '. Удвоенная кавычка указывает на её символ.
                var argsM = SplitBySpace(args);

                var result = ChatManager.TryGetCmdForUser(player.Public.Login, acceptedGrants, command, out IChatCmd cmd);
                if (result.Status > 0)
                {
                    return(result);
                }

                // аdditionally check Grants for DiscordUser: some commands for example: create chat, get token doesn't permitted from discord

                return(cmd.Execute(ref player, chat, argsM));
            }
            else
            {
                Loger.Log("Server post " + context.Player.Public.Login + ":" + pc.Message);
                var mmsg = pc.Message;
                if (mmsg.Length > 2048)
                {
                    mmsg = mmsg.Substring(0, 2048);
                }
                chat.Posts.Add(new ChatPost()
                {
                    Time             = timeNow,
                    Message          = mmsg,
                    OwnerLogin       = player.Public.Login,
                    DiscordIdMessage = pc.IdDiscordMsg,
                });
            }

            return(new ModelStatus()
            {
                Status = 0,
                Message = null
            });
        }
Example #3
0
        public ModelStatus PostingChat(ModelPostingChat pc)
        {
            if (Player == null)
            {
                return(null);
            }

            lock (Player)
            {
                var timeNow = DateTime.UtcNow;
                if (string.IsNullOrEmpty(pc.Message))
                {
                    return new ModelStatus()
                           {
                               Status  = 0,
                               Message = null
                           }
                }
                ;

                var chat = Player.Chats.FirstOrDefault(ct => ct.Id == pc.ChatId);
                if (chat == null)
                {
                    return new ModelStatus()
                           {
                               Status  = 1,
                               Message = "Chat not available"
                           }
                }
                ;

                if (pc.Message[0] == '/')
                {
                    var s = pc.Message.Split(new char[] { ' ' }, 2);

                    var command = s[0].Trim().ToLower();
                    var args    = s.Length == 1 ? "" : s[1];
                    //разбираем аргументы в кавычках '. Удвоенная кавычка указывает на её символ.
                    var argsM = SplitBySpace(args);

                    // обработка команд чата {
                    switch (command)
                    {
                    case "/help":
                        PostCommandPrivatPostActivChat(chat, ChatHelpText
                                                       + (Player.IsAdmin ? ChatHelpTextAdmin : ""));
                        break;

                    case "/createchat":
                        Loger.Log("Server createChat");
                        if (argsM.Count < 1)
                        {
                            PostCommandPrivatPostActivChat(chat, "No new channel name specified");
                        }
                        else
                        {
                            var nChat = new Chat()
                            {
                                Name       = argsM[0],
                                OwnerLogin = Player.Public.Login,
                                OwnerMaker = true,
                                PartyLogin = new List <string>()
                                {
                                    Player.Public.Login, "system"
                                },
                                Id = Repository.GetData.GetChatId(),
                            };
                            nChat.Posts.Add(new ChatPost()
                            {
                                Time       = DateTime.UtcNow,
                                Message    = "User " + Player.Public.Login + " created a channel " + argsM[0],
                                OwnerLogin = "******"
                            });
                            Player.Chats.Add(nChat);

                            if (argsM.Count > 1)
                            {
                                PostCommandAddPlayer(nChat, argsM[1]);
                            }
                            Repository.Get.ChangeData = true;
                        }
                        break;

                    case "/exitchat":
                        Loger.Log("Server exitChat OwnerMaker=" + (chat.OwnerMaker ? "1" : "0"));
                        if (!chat.OwnerMaker)
                        {
                            PostCommandPrivatPostActivChat(chat, "From a shared channel, you can not leave");
                        }
                        else
                        {
                            chat.Posts.Add(new ChatPost()
                            {
                                Time       = DateTime.UtcNow,
                                Message    = "User " + Player.Public.Login + " left the channel.",
                                OwnerLogin = "******"
                            });
                            chat.PartyLogin.Remove(Player.Public.Login);
                            var r = Player.Chats.Remove(chat);
                            Loger.Log("Server exitChat remove" + (r ? "1" : "0"));
                            Repository.Get.ChangeData = true;
                        }
                        break;

                    case "/renamechat":
                        if (!chat.OwnerMaker)
                        {
                            PostCommandPrivatPostActivChat(chat, "You can not rename a shared channel");
                        }
                        if (argsM.Count < 1)
                        {
                            PostCommandPrivatPostActivChat(chat, "No new name specified");
                        }
                        else if (chat.OwnerLogin != Player.Public.Login && !Player.IsAdmin)
                        {
                            PostCommandPrivatPostActivChat(chat, "Operation is not available to you");
                        }
                        else
                        {
                            chat.Posts.Add(new ChatPost()
                            {
                                Time       = DateTime.UtcNow,
                                Message    = "The channel was renamed to " + argsM[0],
                                OwnerLogin = "******"
                            });
                            Loger.Log("Server renameChat " + chat.Name + " -> " + argsM[0]);
                            chat.Name = argsM[0];
                            Repository.Get.ChangeData = true;
                        }
                        break;

                    case "/addplayer":
                        Loger.Log("Server addPlayer");
                        if (argsM.Count < 1)
                        {
                            PostCommandPrivatPostActivChat(chat, "Player name is empty");
                        }
                        else
                        {
                            PostCommandAddPlayer(chat, argsM[0]);
                        }
                        break;

                    case "/killmyallplease":
                        Loger.Log("Server killmyallplease OwnerMaker=" + (chat.OwnerMaker ? "1" : "0"));
                        if (chat.OwnerMaker)
                        {
                            PostCommandPrivatPostActivChat(chat, "Operation only for the shared channel");
                        }
                        else
                        {
                            chat.Posts.Add(new ChatPost()
                            {
                                Time       = DateTime.UtcNow,
                                Message    = "User " + Player.Public.Login + " deleted settlements.",
                                OwnerLogin = "******"
                            });
                            var data = Repository.GetData;
                            lock (data)
                            {
                                for (int i = 0; i < data.WorldObjects.Count; i++)
                                {
                                    var item = data.WorldObjects[i];
                                    if (item.LoginOwner != Player.Public.Login)
                                    {
                                        continue;
                                    }
                                    //удаление из базы
                                    item.UpdateTime = timeNow;
                                    data.WorldObjects.Remove(item);
                                    data.WorldObjectsDeleted.Add(item);
                                }
                            }
                            Player.SaveDataPacket = null;
                            Loger.Log("Server killmyallplease " + Player.Public.Login);
                            Player = null;
                            Repository.Get.ChangeData = true;
                        }
                        break;

                    case "/killhimplease":
                        Loger.Log("Server killhimplease OwnerMaker=" + (chat.OwnerMaker ? "1" : "0"));
                        if (!Player.IsAdmin)
                        {
                            PostCommandPrivatPostActivChat(chat, "Command only for admin");
                        }
                        else
                        if (argsM.Count < 1)
                        {
                            PostCommandPrivatPostActivChat(chat, "Player name is empty");
                        }
                        else
                        {
                            var killPlayer = Repository.GetData.PlayersAll
                                             .FirstOrDefault(p => p.Public.Login == argsM[0]);
                            if (killPlayer == null)
                            {
                                PostCommandPrivatPostActivChat(chat, "User " + argsM[0] + " not found");
                            }
                            else
                            {
                                chat.Posts.Add(new ChatPost()
                                {
                                    Time       = DateTime.UtcNow,
                                    Message    = "User " + killPlayer.Public.Login + " deleted settlements.",
                                    OwnerLogin = "******"
                                });
                                var data = Repository.GetData;
                                lock (data)
                                {
                                    for (int i = 0; i < data.WorldObjects.Count; i++)
                                    {
                                        var item = data.WorldObjects[i];
                                        if (item.LoginOwner != killPlayer.Public.Login)
                                        {
                                            continue;
                                        }
                                        //удаление из базы
                                        item.UpdateTime = timeNow;
                                        data.WorldObjects.Remove(item);
                                        data.WorldObjectsDeleted.Add(item);
                                    }
                                }
                                killPlayer.SaveDataPacket = null;
                                Repository.Get.ChangeData = true;
                                Loger.Log("Server killhimplease " + killPlayer.Public.Login);
                            }
                        }
                        break;

                    default:
                        PostCommandPrivatPostActivChat(chat, "Command not found: " + command);
                        return(new ModelStatus()
                        {
                            Status = 2,
                            Message = "Command not found: " + command
                        });
                    }
                    // } обработка команд чата
                }
                else
                {
                    Loger.Log("Server post " + Player.Public.Login /*+ " " + timeNow.Ticks*/ + ":" + pc.Message);
                    var mmsg = pc.Message;
                    if (mmsg.Length > 2048)
                    {
                        mmsg = mmsg.Substring(0, 2048);
                    }
                    chat.Posts.Add(new ChatPost()
                    {
                        Time       = timeNow,
                        Message    = mmsg,
                        OwnerLogin = Player.Public.Login
                    });
                }

                return(new ModelStatus()
                {
                    Status = 0,
                    Message = null
                });
            }
        }