From 9bab0102e869a6e92991d7c288ccadefe4d837a3 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Wed, 18 Jan 2023 03:32:49 +0100 Subject: [PATCH] Receive emoji reactions (#11) --- tgcli/tgcli.cs | 78 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 66 insertions(+), 12 deletions(-) diff --git a/tgcli/tgcli.cs b/tgcli/tgcli.cs index f237592..f1ade05 100644 --- a/tgcli/tgcli.cs +++ b/tgcli/tgcli.cs @@ -51,9 +51,7 @@ namespace tgcli { if (!Directory.Exists(dbdir)) Directory.CreateDirectory(dbdir); - client.Send(new SetLogStream { - LogStream = new LogStream.LogStreamFile { Path = Path.Combine(dbdir, "tdlib.log"), MaxFileSize = 10000000 } - }); + client.Send(new SetLogStream { LogStream = new LogStream.LogStreamFile { Path = Path.Combine(dbdir, "tdlib.log"), MaxFileSize = 10000000 } }); client.Send(new SetLogVerbosityLevel { NewVerbosityLevel = 2 }); @@ -62,9 +60,7 @@ namespace tgcli { client.UpdateReceived += HandleUpdate; - OnAuthUpdate(new Update.UpdateAuthorizationState { - AuthorizationState = new AuthorizationState.AuthorizationStateWaitTdlibParameters() - }); + OnAuthUpdate(new Update.UpdateAuthorizationState { AuthorizationState = new AuthorizationState.AuthorizationStateWaitTdlibParameters() }); while (!authorized) { Thread.Sleep(1); @@ -100,6 +96,9 @@ namespace tgcli { } }); break; + case Update.UpdateMessageUnreadReactions message: + Task.Run(() => AddMessageToQueue(message)); + break; case Update.UpdateMessageSendSucceeded sentMsg: lastMessage = sentMsg.Message; break; @@ -315,7 +314,7 @@ namespace tgcli { HandleCommand(currentChatId == 0 ? "q" : "c"); ScreenUpdate(); return; - + // input navigation case ConsoleKey.U when key.Modifiers.HasFlag(ConsoleModifiers.Control): SetInputLine(""); @@ -357,9 +356,9 @@ namespace tgcli { UseSecretChats = true }); break; -// case AuthorizationState.AuthorizationStateWaitEncryptionKey _: -// client.Send(new Td.TdApi.CheckDatabaseEncryptionKey()); -// break; + // case AuthorizationState.AuthorizationStateWaitEncryptionKey _: + // client.Send(new Td.TdApi.CheckDatabaseEncryptionKey()); + // break; case AuthorizationState.AuthorizationStateWaitPhoneNumber _: { Console.Write("[tgcli] login> "); var phone = Console.ReadLine(); @@ -449,7 +448,15 @@ namespace tgcli { } } - var rest = $"{text}{(msg.EditDate == 0 ? "" : $"{Ansi.Yellow}*")}"; + var rest = $"{text}{(msg.EditDate == 0 ? "" : $"{Ansi.Yellow}*")}"; + + if (msg.InteractionInfo.Reactions.Any(p => p.Type is ReactionType.ReactionTypeEmoji)) { + rest = $"{rest} {Ansi.Cyan}<--"; + foreach (var reaction in msg.InteractionInfo.Reactions) + if (reaction.Type is ReactionType.ReactionTypeEmoji emoji) + rest += $" {reaction.TotalCount} {emoji.Emoji}"; + } + var lines = rest.Split("\n").ToList(); if (!isReply) { finalOutput += arrows + lines.First(); @@ -471,7 +478,7 @@ namespace tgcli { var username = TruncateString(GetFormattedUsername(msg.SenderId), 10); var time = FormatTime(msg.Date); var isChannel = msg.IsChannelPost; - var isPrivate = chat.Type is ChatType.ChatTypePrivate || chat.Type is ChatType.ChatTypeSecret; + var isPrivate = chat.Type is ChatType.ChatTypePrivate or ChatType.ChatTypeSecret; var isSecret = chat.Type is ChatType.ChatTypeSecret; chat.Title = TruncateString(chat.Title, 20); @@ -508,6 +515,7 @@ namespace tgcli { var time = FormatTime(message.EditDate); var isChannel = message.IsChannelPost; var isPrivate = chat.Type is ChatType.ChatTypePrivate; + chat.Title = TruncateString(chat.Title, 20); return $"{Ansi.Bold}{Ansi.Green}[{time}] {Ansi.Cyan}{chat.Title} " + $"{(isPrivate || isChannel ? "" : $"{Ansi.Yellow}{username} ")}" @@ -515,6 +523,33 @@ namespace tgcli { + $"{text}" + $"{Ansi.Yellow}*"; } + + private static string FormatMessage(Update.UpdateMessageUnreadReactions msg) { + string text; + + var message = GetMessage(msg.ChatId, msg.MessageId); + if (message.Content is MessageContent.MessageText messageText) + text = messageText.Text.Text; + else + text = $"[unsupported {message.Content.DataType}]"; + var chat = GetChat(msg.ChatId); + var username = TruncateString(GetFormattedUsername(message.SenderId), 10); + var time = FormatTime(message.Date); + var isChannel = message.IsChannelPost; + var isPrivate = chat.Type is ChatType.ChatTypePrivate; + chat.Title = TruncateString(chat.Title, 20); + + text = $"{text}{Ansi.Yellow} <-- "; + foreach (var reaction in msg.UnreadReactions) + if (reaction.Type is ReactionType.ReactionTypeEmoji emoji) + text += $"{emoji.Emoji} ({GetFormattedUsername(reaction.SenderId)})"; + + return $"{Ansi.Bold}{Ansi.Green}[{time}] {Ansi.Cyan}{chat.Title} " + + $"{(isPrivate || isChannel ? "" : $"{Ansi.Yellow}{username} ")}" + + $"{(message.IsOutgoing ? $"{Ansi.Blue}»»»" : $"{Ansi.Magenta}«««")} " + + $"{(message.EditDate == 0 ? "" : $"{Ansi.Yellow}*")}" + + $"{text}"; + } public static void AddMessageToQueue(Message msg) { //handle muted @@ -554,5 +589,24 @@ namespace tgcli { messageQueue.Add(formattedMessage); ScreenUpdate(); } + + public static void AddMessageToQueue(Update.UpdateMessageUnreadReactions msg) { + //handle muted + if (GetChat(msg.ChatId).NotificationSettings.MuteFor > 0 && currentChatId != msg.ChatId) + return; + + if (!msg.UnreadReactions.Any(p => p.Type is ReactionType.ReactionTypeEmoji)) + return; + + var formattedMessage = FormatMessage(msg); + + if (currentChatId != 0 && msg.ChatId != currentChatId) + lock (@lock) + missedMessages.Add(formattedMessage); + else + lock (@lock) + messageQueue.Add(formattedMessage); + ScreenUpdate(); + } } }