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)); }
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 }); }
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 }); } }