private void HandleReadMessageEvent(User user, MessageNewContent content, UserChat chat) { var btn = !user.GetChat(user.LastPeerId).HasKeyboard() ? null : FindButton(content.Text, user, out var _); if (btn == null) { chat.NewMessageAction?.Invoke(content.Text); return; } if (!(btn.Action is DefaultButtonAction defaultButtonAction)) { return; } if (defaultButtonAction.Executor?.StartsWith("/page ") ?? false) { defaultButtonAction.Action = _ => { SiteProvider.EmulateExecute(user, defaultButtonAction.Executor); } } ; else if (btn.Action == user.GetChat(user.LastPeerId).ReplyMarkupKeyboard.Menu.Action) { chat.NewMessageAction = null; } if (defaultButtonAction.Action != null) { var tmp = chat.NewMessageAction; chat.NewMessageAction = null; defaultButtonAction.Action.Invoke(user); chat.NewMessageAction = tmp; return; } chat.NewMessageAction?.Invoke(defaultButtonAction.Executor); }
public override void Handle(User user, MessageNewContent content) { user.LastPeerId = content.PeerId; var keyboardUser = content.Text?.StartsWith("from ") ?? false ? user.Provider.GetOrCreateUser(ulong.Parse(content.Text.Substring(5))) : user; var chat = keyboardUser.GetChat(user.LastPeerId); if (chat.NewMessageAction != null) { HandleReadMessageEvent(user, content, chat); return; } var message = content.Text; if (content.Payload != null) { message = "/" + JObject.Parse(content.Payload)["command"]; } var isFromKeyboard = false; if (chat.HasKeyboard()) { var btn = FindButton(content.Text, keyboardUser, out var isInline); if (btn == null && chat.ReplyMarkupKeyboard != null) { if (chat.ReplyMarkupKeyboard != null && chat.InlineMarkupKeyboard != null && user.LastPeerId == (long)user.Id) { user.Send(new Message(chat.KeyboardMessage, new ReplyMarkupKeyboard(chat.ReplyMarkupKeyboard), new InlineMarkupKeyboard(chat.InlineMarkupKeyboard)), (long)user.Id); } else if (chat.ReplyMarkupKeyboard != null && user.LastPeerId == (long)user.Id) { user.Send(new Message(chat.KeyboardMessage, new ReplyMarkupKeyboard(chat.ReplyMarkupKeyboard)), (long)user.Id); } else if (chat.ReplyMarkupKeyboard == null) { user.Send(new Message(chat.KeyboardMessage, new InlineMarkupKeyboard(chat.InlineMarkupKeyboard)), user.LastPeerId); } return; } if (btn?.Action is DefaultButtonAction defaultButtonAction) { var oldKeyboard = chat.ReplyMarkupKeyboard; if (chat.ReplyMarkupKeyboard != null && oldKeyboard == chat.ReplyMarkupKeyboard && chat.ReplyMarkupKeyboard.IsOneTime && !(defaultButtonAction.Executor?.StartsWith("/page ") ?? false) && !isInline) { chat.KeyboardReset(); } if (!defaultButtonAction.Executor?.StartsWith("/page") ?? true) { defaultButtonAction.Action?.Invoke(user); } if (defaultButtonAction.Executor == null) { return; } message = defaultButtonAction.Executor; isFromKeyboard = true; } else if (btn?.Action != null) { return; } } if (!message.StartsWith("/")) { if (content.PeerId == (long)user.Id) { SiteProvider.EmulateExecute(user, "/error unknown_command"); } return; } message = message.Substring(1); var args = message.Split(' ').ToList(); var command = args[0]; args.RemoveAt(0); var commandExecutor = SiteProvider.BotInstance.GetCommandExecutor(command); var arrayArgs = args.ToArray(); if (commandExecutor == null || commandExecutor.IsHidden && !isFromKeyboard) { if (message != "error unknown_command" && content.PeerId == (long)user.Id) { SiteProvider.EmulateExecute(user, "/error unknown_command"); } return; } if ((commandExecutor.Scope == CommandScope.PrivateChat && content.PeerId != (long)user.Id) || (commandExecutor.Scope == CommandScope.PublicChat && content.PeerId == (long)user.Id)) { return; } commandExecutor.User = user; commandExecutor.Args = arrayArgs; commandExecutor.QueryData = content.QueryData; foreach (var middleware in commandExecutor.Middlewares) { var responseMiddleware = middleware(commandExecutor); if (!responseMiddleware) { return; } } if (!commandExecutor.PreProcessData()) { return; } var response = commandExecutor.Execute(); if (response == null) { return; } user.Send(response.Value, content.PeerId); }