internal async Task HandleMessage(TelegramBot bot, Message m) { try { ProcessedRequestCount++; bot.PrintNotification($"Handling message '{m.Text}' from '{m.From}'"); MessageHandlerResult result = await SendMessageToHandler(bot, m, GetMessageType(m)); if (result.Success && result.Reply != null && result.Reply.ReplyMarkup == null) result.Reply.ReplyMarkup = bot.DefaultMarkup; if (result.Reply != null) if (result.Reply.ChatId < 0) Console.WriteLine($"Reply received for debug account {result.Reply.ChatId}: {result.Reply}"); else await result.Reply.HandleReply(bot); } catch (Exception ex) { bot.PrintError("Er is iets fout gegaan bij het verzoek."); bot.PrintError(ex.Message); bot.PrintError(ex.StackTrace); } }
protected override async Task HandleInlineMessage(InlineQuery query, TelegramBot.TelegramBot bot) { var userPreferences = PreferenceRegistry.GetUserPreferencesForUser(query.From); if (!query.HasParameters || true) //haal eigen rooster op { var roosterFor = userPreferences.RoosterFor; if (roosterFor == null) return; //Voor parameterloze queries moeten we een roosterfor hebben var day = DateTime.Today; for (var i = 0; i < 7; i++, day = day.AddDays(1)) { if (day.DayOfWeek == DayOfWeek.Saturday || day.DayOfWeek == DayOfWeek.Sunday) continue; var rooster = await WindesheimRoosterConvertor.GetRooster(userPreferences, day, day); if (!rooster.Success) { bot.PrintError($"Tijdens het opzoeken van het rooster voor een inline query is iets fout gegaan: {rooster.ErrorMessage}"); continue; } TemplateRoosterFormatToImageProvider provider; if (roosterFor.GetType().Name == nameof(Klas)) provider = RoosterFormatToImageProvider.Instance; else provider = DocentRoosterFormatToImageProvider.Instance; var bitmap = provider.GetImageForRooster(rooster.Rooster, userPreferences); if(bitmap == null) continue; var dateDirectory = day.ToString("yyyyMMdd"); var directory = $"images/{dateDirectory}"; if (!Directory.Exists(directory)) Directory.CreateDirectory(directory); var localUrl = $"{directory}/{query.From.ID}.jpeg"; bitmap.Save(localUrl, System.Drawing.Imaging.ImageFormat.Jpeg); string url = $"http://roosterbot.sandervanteinde.nl/{dateDirectory}/{query.From.ID}.jpeg"; AddPhoto($"rooster-{day.ToString("YYYYMMdd")}-{query.From.ID}", url, GetCaptionForDate(day, dateDirectory), photoWidth: bitmap.Width, photoHeight: bitmap.Height, caption: $"Rooster van {query.From} voor {day.ToString("ddd dd MMM")}"); } } }
internal async Task<MessageHandlerResult> SendMessageToHandler(TelegramBot bot, Message m, MessageHandlerType type) { if (type != MessageHandlerType.Message) //Handling of non-messages can only happen through message flows or joker handlers { if (m.From.MessageFlow != null && (m.From.MessageFlow.AcceptedTypes & type) == type) return new MessageHandlerResult(true, await m.From.MessageFlow.DoNext(bot, m, type)); else if (_joker != null && ((_joker.HandlerType & type) == type)) return new MessageHandlerResult(true, await _joker.HandleMessages(bot, m, type)); } else if(m.Command != null) { TemplateMessageHandler handler = _handlers.ContainsKey(m.Command) ? _handlers[m.Command] : null; if (handler == null) { if (m.From.MessageFlow != null && m.From.MessageFlow.HasNext) return new MessageHandlerResult(true, await m.From.MessageFlow.DoNext(bot, m, type)); if (_joker == null) { bot.PrintError($"No handler found for command {m.Command}"); return new MessageHandlerResult(false); } else handler = _joker; } TelegramBotReply reply = null; if (handler.RequiresAdmin) if (bot.Admins.Contains(m.From)) reply = await handler.HandleMessages(bot, m, type); else bot.PrintError($"{m.From} tried to access admin command {m.Command}."); else reply = await handler.HandleMessages(bot, m, type); return new MessageHandlerResult(true, reply); } return new MessageHandlerResult(false); }