示例#1
0
 public SupportProvider(User from)
 {
     Name       = from.FirstName;
     TelegramID = from.Id;
     State      = ESupportProviderState.INITIAL;
 }
示例#2
0
        public override async Task HandleMessage(object sender, MessageEventArgs e)
        {
            var userID = e.Message.From.Id;

            if (State == ESupportProviderState.INITIAL)
            {
                // New ticket -> user must accept GDPR agreement
                var rkm = new InlineKeyboardMarkup(new InlineKeyboardButton()
                {
                    Text = "I Accept", CallbackData = ACCEPT_TOKEN
                });
                await Bot.SendTextMessageAsync(userID, System.IO.File.ReadAllText(m_supporterGDRPPath.Value), replyMarkup : rkm, parseMode : Telegram.Bot.Types.Enums.ParseMode.MarkdownV2);

                State = ESupportProviderState.WAITING_FOR_AGREEMENT;
                return;
            }
            else if (State == ESupportProviderState.WAITING_FOR_AGREEMENT)
            {
                // User needs to send callback, so text input not valid. Just reprompt.
                await Bot.SendTextMessageAsync(userID, Resources.RePromptForAgreement);

                return;
            }
            else if (State == ESupportProviderState.WAITING_FOR_TICKETS)
            {
                await Bot.SendTextMessageAsync(userID, Resources.SupportUserNoActiveTicket);
                await ICantHelpAnymore(userID);

                return;
            }
            else if (State == ESupportProviderState.IN_PROGRESS)
            {
                // find the ticket for this support provider
                var activeTicket = CurrentTicket;
                if (activeTicket == null)
                {
                    // User doesn't have an active ticket
                    await Bot.SendTextMessageAsync(userID, Resources.SupportUserNoActiveTicket);
                    await ICantHelpAnymore(userID);

                    State = ESupportProviderState.WAITING_FOR_TICKETS;
                    return;
                }
                if (e.Message.Text == "/endchat")
                {
                    await activeTicket.Close();

                    return;
                }
                // Just forward the message onwards
                Logger.Debug($"Forwarding message from {e.Message.From.Id} to {activeTicket.Target}");
                activeTicket.Messages.Add(new Message(userID, e.Message.Text));
                await ForwardMessage(TelegramID, activeTicket.Target, Name, e);

                return;
            }
            else
            {
                await Bot.SendTextMessageAsync(userID, Resources.SupportUserNoActiveTicket);
                await ICantHelpAnymore(userID);

                return;
            }
        }
示例#3
0
        public override async Task HandleCallback(object sender, CallbackQueryEventArgs e)
        {
            if (State == ESupportProviderState.WAITING_FOR_AGREEMENT)
            {
                // We want the user to accept the agreement
                if (e.CallbackQuery.Data == ACCEPT_TOKEN)
                {
                    await Bot.AnswerCallbackQueryAsync(e.CallbackQuery.Id);

                    State = ESupportProviderState.IDLE;
                }
                else
                {
                    Logger.Error("Something went wrong...");
                    State = ESupportProviderState.INITIAL;
                    return;
                }
            }
            if (State == ESupportProviderState.IDLE)
            {
                if (e.CallbackQuery.Data == HELP_NOW_TOKEN)
                {
                    // User has said that they're active and waiting for tickets
                    State = ESupportProviderState.WAITING_FOR_TICKETS;
                    var openTicket = Data.OpenTickets.FirstOrDefault();
                    if (openTicket != null)
                    {
                        await openTicket.Claim(this);

                        // Assign them a ticket if there are any
                        State = ESupportProviderState.IN_PROGRESS;
                        return;
                    }
                    await ICantHelpAnymore(TelegramID);

                    return;
                }
                await ICanHelpNow(TelegramID);

                return;
            }
            else if (State == ESupportProviderState.WAITING_FOR_TICKETS)
            {
                if (e.CallbackQuery.Data == HELP_STOP_TOKEN)
                {
                    // User idle and doesn't want tickets anymore
                    State = ESupportProviderState.IDLE;
                    await ICanHelpNow(TelegramID);

                    return;
                }
            }
            else if (State == ESupportProviderState.WAITING_FOR_CLAIM)
            {
                if (e.CallbackQuery.Data == CLAIM_TOKEN)
                {
                    var nextTicket = Data.OpenTickets.FirstOrDefault();
                    if (nextTicket == null)
                    {
                        await Bot.SendTextMessageAsync(TelegramID, Resources.SupportUserBeatenInClaim);
                        await ICantHelpAnymore(TelegramID);

                        State = ESupportProviderState.WAITING_FOR_TICKETS;
                        return;
                    }
                    await nextTicket.Claim(this);
                }
            }
        }