public SupportProvider(User from) { Name = from.FirstName; TelegramID = from.Id; State = ESupportProviderState.INITIAL; }
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; } }
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); } } }