Beispiel #1
0
        private static void Test()
        {
            var api = new Telegram.Bot.Api("Paste some key for debugging purposes");

            var flowEngine = new FlowEngine(api, new DatabaseStateProvider(@"Data Source=(localdb)\ProjectsV13;Initial Catalog=MafiaGM;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"), null);

            var mainMenu = flowEngine.AddCommand("start")
                           .EchoReply(new OneLanguageString("Welcome"));

            flowEngine.AddAnyInput()
            .EchoReply(new OneLanguageString("Please, type /Start to start"));
            mainMenu.AddCommand("help")
            .EchoReply(new OneLanguageString("No help for now"));
            mainMenu.AddCommand("sum")
            .EchoReply(new OneLanguageString("Provide A"))
            .AddAnyInput()
            .EchoReply(new OneLanguageString("Provide B (A is {0}"))
            .AddAnyInput()
            .AddDelegateInput(context => (int.Parse(context[0]) + int.Parse(context[1])).ToString())
            .EchoReply(new OneLanguageString("Result is {0}"))
            .Execute(context => context.Echo(context[1] + context[2], context.UserMessageIdOrZero)); //а тут сразу же показываем конкатенацию
            mainMenu.AddCommand("testPar", true)
            .EchoReply(new OneLanguageString("parameter is {0}"));
            mainMenu.AddCommandWithParameter("testAnyPar", new OneLanguageString("Please, enter value"))
            .ForEach(step => step.EchoReply(new OneLanguageString("Value is {0}")));

            int lastUpdate = 0;

            do
            {
                var updates = api.GetUpdates(lastUpdate + 1).Result;
                if (!updates.Any())
                {
                    Thread.Sleep(3000); continue;
                }
                foreach (var update in updates)
                {
                    IState state;
                    flowEngine.Process(update, null, out state);
                    ((DatabaseState)state).SaveAndDispose();
                    lastUpdate = update.Id;
                }
            } while (true);
        }
Beispiel #2
0
        public bool ProcessUpdate(Update update)
        {
            try
            {
                if (!IsSupportedUpdate(update))
                {
                    return(false);
                }

                var chatId = update.GetChat().Id;
                TelemetryStatic.TelemetryClient.Context.Properties[TelemetryStatic.ChatKey] = chatId.ToString();

                if (!_typingTyped)
                {
                    _typingTyped = true; //no locks - fine to do it several times

                    TelemetryStatic.TelemetryClient.TrackEvent("Typing",
                                                               new Dictionary <string, string>
                    {
                        [TelemetryStatic.ToChatKey] = chatId.ToString()
                    });     //todo: low incapsulate telemetry so all this assemblies don't have to depend on microsoft insight
                    _api.SendChatAction(chatId, ChatAction.Typing);
                }
#if ONECHAT_DEBUG
                bool oneChatProcess = false;
                var  realChatId     = update.GetMessage().Chat.Id;

                if (update.Type == UpdateType.MessageUpdate && update.Message.Type == MessageType.TextMessage &&
                    update.GetMessage().Text.Contains("Sobachka2"))
                {
                    _oneChatId = realChatId;
                    _api.SendTextMessage(realChatId, "You are in one chat debug now");

                    return(true);
                }

                if (_oneChatId == realChatId)
                {
                    oneChatProcess = true;
                }

                if (!oneChatProcess)
                {
                    _api.SendTextMessage(realChatId, LocalizedStrings.Servicing_Now);
                    return(true);
                }
#endif

                var language = _gameProvider.GetLanguageForChat(chatId);
                LocalizedStrings.Language = language;

                var isPrivate = update.IsPrivate();
                try
                {
                    IState finalState;
                    if (isPrivate)
                    {
                        _privateEngine.Process(update, _gameProvider, out finalState);
                    }
                    else
                    {
                        _publicEngine.Process(update, _gameProvider, out finalState);
                    }

                    ((DatabaseState)finalState).SaveAndDispose();
                }
                catch (ApiChatBadRequestException)
                {
                }
            }
            catch (ChatException chatException)
            {
                //здесь не выносим за дебаг потому что он кидается только за дебагом

                chatException.Chat.Echo(LocalizedStrings.GameEngine_ErrorSorry, 0, null);

                // думаю не стоит этого делать, потому что пропадает инфа для отладки DatabaseStateProvider.CleanStateForChat(new UserInChat(update.GetChat().ToChat(), update.GetUser()), _connectionString);
            }

            return(true);
        }