InstaFollowersOverseer/Telegram/TelegramWrapper.cs

134 lines
5.2 KiB
C#

using System.Net.Http;
using System.Threading;
using Telegram.Bot;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using InstaFollowersOverseer.Instagram;
namespace InstaFollowersOverseer.Telegram;
public static class TelegramWrapper
{
private static ContextLogger TelegramLogger = new("telegram", ParentLogger);
private static TelegramBotClient Bot=null!;
public static async void Init()
{
try
{
TelegramLogger.LogInfo("initializing telegram wrapper");
if (CurrentConfig is null)
throw new NullReferenceException("config is null");
Bot = new TelegramBotClient(CurrentConfig.botToken, new HttpClient());
await Bot.SetMyCommandsAsync(new BotCommand[]
{
new() { Command = "start", Description = "starts the bot"},
// new() { Command = "help", Description = "shows commands list" },
new() { Command = "oversee", Description = "[instagram username] - " +
"enables notifications about instagram user's followers" },
new() { Command = "list", Description = "shows list of overseeing instagram users" }
});
var receiverOptions = new ReceiverOptions
{
// AllowedUpdates = { }, // receive all update types
};
TelegramLogger.LogInfo("bot starting recieving long polls");
Bot.StartReceiving(BotApiUpdateHandler, BotApiExceptionHandler, receiverOptions, Program.MainCancelToken);
TelegramLogger.LogInfo("telegram wrapper have initialized successfully");
}
catch (OperationCanceledException) {}
catch (Exception ex)
{
TelegramLogger.LogError("init", ex);
Program.Stop();
}
}
private static Task BotApiExceptionHandler(ITelegramBotClient bot, Exception ex, CancellationToken cls)
{
TelegramLogger.LogError(ex);
return Task.CompletedTask;
}
static async Task SendInfoReply(string text, Message replyToMessage)
{
TelegramLogger.LogInfo(text);
await Bot.SendTextMessageAsync(replyToMessage.Chat, text,
replyToMessageId: replyToMessage.MessageId,
parseMode:ParseMode.MarkdownV2);
}
static async Task SendErrorReply(string text, Message replyToMessage)
{
TelegramLogger.LogWarn(text);
await Bot.SendTextMessageAsync(replyToMessage.Chat, "error: "+text,
replyToMessageId: replyToMessage.MessageId,
parseMode:ParseMode.MarkdownV2);
}
private static async Task BotApiUpdateHandler(ITelegramBotClient bot, Update update, CancellationToken cls)
{
try
{
switch (update.Type)
{
case UpdateType.Message:
{
var message = update.Message!;
if (message.Text!.StartsWith('/'))
{
TelegramLogger.LogInfo($"user {message.Chat.Id} sent command {message.Text}");
var spl = message.Text.SplitToList(' ');
string command = spl[0].Substring(1);
spl.RemoveAt(0);
string[] args = spl.ToArray();
await ExecCommandAsync(command, args, message);
}
else TelegramLogger.LogDebug($"message recieved: {message.Text}");
break;
}
/*case UpdateType.InlineQuery:
break;
case UpdateType.ChosenInlineResult:
break;
case UpdateType.CallbackQuery:
break;*/
default:
TelegramLogger.LogWarn($"unknown update type: {update.Type}");
break;
}
}
catch (OperationCanceledException) {}
catch (Exception ex)
{
TelegramLogger.LogWarn("UpdateHandler", ex);
}
}
private static async Task ExecCommandAsync(string command, string[] args, Message message)
{
switch (command)
{
case "start":
await Bot.SendTextMessageAsync(message.Chat, "hi");
break;
case "oversee":
{
string usernameOrUrl = args[0];
await SendInfoReply($"searching for instagram user <{usernameOrUrl}>", message);
var user = await InstagramWrapper.GetUserAsync(usernameOrUrl);
if (user is null)
{
await SendErrorReply($"user **{usernameOrUrl}** doesnt exist", message);
return;
}
CurrentUsersData.AddOrSet(message.Chat.Id.ToString(), new InstagramObservableParams(usernameOrUrl));
CurrentUsersData.SaveToFile();
break;
}
default:
await SendErrorReply("ivalid command", message);
break;
}
}
}