huge refactor
This commit is contained in:
parent
d52abd93e0
commit
74fefd9d7b
|
@ -1,7 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NeoSmart.Unicode;
|
|
||||||
using TdLib;
|
using TdLib;
|
||||||
using static telegram.tgcli;
|
using static telegram.tgcli;
|
||||||
using static telegram.Util;
|
using static telegram.Util;
|
||||||
|
@ -10,26 +9,26 @@ namespace telegram
|
||||||
{
|
{
|
||||||
public abstract class Command
|
public abstract class Command
|
||||||
{
|
{
|
||||||
public string Trigger;
|
public string trigger;
|
||||||
public string Shortcut;
|
public string shortcut;
|
||||||
public string Description;
|
public string description;
|
||||||
public string Syntax;
|
public string syntax;
|
||||||
public int ParamCount;
|
public int paramCount;
|
||||||
public abstract void Handler(List<string> inputParams);
|
public abstract void Handler(List<string> inputParams);
|
||||||
|
|
||||||
protected Command(string trigger, string shortcut, string description, string syntax, int paramCount)
|
protected Command(string trigger, string shortcut, string description, string syntax, int paramCount)
|
||||||
{
|
{
|
||||||
Trigger = trigger;
|
this.trigger = trigger;
|
||||||
Shortcut = shortcut;
|
this.shortcut = shortcut;
|
||||||
Description = description;
|
this.description = description;
|
||||||
ParamCount = paramCount;
|
this.paramCount = paramCount;
|
||||||
Syntax = syntax;
|
this.syntax = syntax;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class CommandManager
|
public static class CommandManager
|
||||||
{
|
{
|
||||||
public static List<Command> Commands = new List<Command>
|
public static readonly List<Command> Commands = new List<Command>
|
||||||
{
|
{
|
||||||
new ClearCommand(),
|
new ClearCommand(),
|
||||||
new CloseCommand(),
|
new CloseCommand(),
|
||||||
|
@ -57,25 +56,27 @@ namespace telegram
|
||||||
{
|
{
|
||||||
var split = input.Split(" ").ToList();
|
var split = input.Split(" ").ToList();
|
||||||
var trigger = split.First();
|
var trigger = split.First();
|
||||||
var command = Commands.Find(p => p.Trigger == trigger || p.Shortcut == trigger);
|
var command = Commands.Find(p => p.trigger == trigger || p.shortcut == trigger);
|
||||||
if (command == null)
|
if (command == null)
|
||||||
{
|
{
|
||||||
//TODO Console.WriteLine("do something");
|
lock(@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Invalid command. Check /help for all available commands.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
split.RemoveAt(0);
|
split.RemoveAt(0);
|
||||||
if (command.ParamCount == -1)
|
if (command.paramCount == -1)
|
||||||
{
|
{
|
||||||
command.Handler(split);
|
command.Handler(split);
|
||||||
}
|
}
|
||||||
else if (split.Count == command.ParamCount)
|
else if (split.Count == command.paramCount)
|
||||||
{
|
{
|
||||||
command.Handler(split);
|
command.Handler(split);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//TODO Console.WriteLine("do something");
|
lock(@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Invalid command syntax. Check /help for more information.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -88,8 +89,11 @@ namespace telegram
|
||||||
|
|
||||||
public override void Handler(List<string> inputParams)
|
public override void Handler(List<string> inputParams)
|
||||||
{
|
{
|
||||||
if (inputParams.Count == 0)
|
if (inputParams.Count == 0){
|
||||||
return; //TODO do something
|
lock(@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Invalid command syntax. Check /help for more information.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
var query = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
var query = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
||||||
var chatId = SearchChatId(query);
|
var chatId = SearchChatId(query);
|
||||||
if (chatId == 0) return;
|
if (chatId == 0) return;
|
||||||
|
@ -162,7 +166,12 @@ namespace telegram
|
||||||
public override void Handler(List<string> inputParams)
|
public override void Handler(List<string> inputParams)
|
||||||
{
|
{
|
||||||
var chat = GetChatByUsernameGlobal(inputParams[0]);
|
var chat = GetChatByUsernameGlobal(inputParams[0]);
|
||||||
if (chat == null) return; //TODO do something
|
if (chat == null)
|
||||||
|
{
|
||||||
|
lock(@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] User not found. Try /s <query> to find valid usernames.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
currentChatId = 0;
|
currentChatId = 0;
|
||||||
currentChatUserId = 0;
|
currentChatUserId = 0;
|
||||||
|
@ -230,9 +239,7 @@ namespace telegram
|
||||||
|
|
||||||
public override void Handler(List<string> _)
|
public override void Handler(List<string> _)
|
||||||
{
|
{
|
||||||
if (currentChatId == 0)
|
if (currentChatId != 0 && GetChat(currentChatId).Type is TdApi.ChatType.ChatTypeSecret type)
|
||||||
return; //TODO do something
|
|
||||||
if (GetChat(currentChatId).Type is TdApi.ChatType.ChatTypeSecret type)
|
|
||||||
{
|
{
|
||||||
CloseSecretChat(type.SecretChatId);
|
CloseSecretChat(type.SecretChatId);
|
||||||
DeleteChatHistory(currentChatId);
|
DeleteChatHistory(currentChatId);
|
||||||
|
@ -240,7 +247,8 @@ namespace telegram
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//TODO do something
|
lock(@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No secret chat selected, cannot continue.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -256,9 +264,18 @@ namespace telegram
|
||||||
var userId = GetUserIdByUsername(inputParams[0]);
|
var userId = GetUserIdByUsername(inputParams[0]);
|
||||||
|
|
||||||
if (userId == 0)
|
if (userId == 0)
|
||||||
return; //TODO do something
|
{
|
||||||
|
lock(@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] User not found. Try /s <query> to find valid usernames.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (GetSecretChats().Count(p => ((TdApi.ChatType.ChatTypeSecret) p.Type).UserId == userId) > 0)
|
if (GetSecretChats().Count(p => ((TdApi.ChatType.ChatTypeSecret) p.Type).UserId == userId) > 0)
|
||||||
return; //TODO do something
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] You already have a secret chat with the specified user.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var chat = CreateSecretChat(userId);
|
var chat = CreateSecretChat(userId);
|
||||||
CommandManager.HandleCommand("osd " + chat.Id);
|
CommandManager.HandleCommand("osd " + chat.Id);
|
||||||
|
@ -276,12 +293,18 @@ namespace telegram
|
||||||
var id = inputParams[0];
|
var id = inputParams[0];
|
||||||
if (!long.TryParse(id, out var chatId))
|
if (!long.TryParse(id, out var chatId))
|
||||||
{
|
{
|
||||||
return; //todo do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Invalid chat id.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var chat = GetChat(chatId);
|
var chat = GetChat(chatId);
|
||||||
if (chat == null)
|
if (chat == null)
|
||||||
return; //TODO do something
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Invalid chat id.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
TdApi.SecretChat secChat;
|
TdApi.SecretChat secChat;
|
||||||
if (chat.Type is TdApi.ChatType.ChatTypeSecret secretChat)
|
if (chat.Type is TdApi.ChatType.ChatTypeSecret secretChat)
|
||||||
|
@ -293,7 +316,9 @@ namespace telegram
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return; //TODO do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] The specified chat isn't a secret chat.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.Title = TruncateString(chat.Title, 20);
|
chat.Title = TruncateString(chat.Title, 20);
|
||||||
|
@ -361,11 +386,17 @@ namespace telegram
|
||||||
var query = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
var query = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
||||||
var userId = SearchUserInChats(query);
|
var userId = SearchUserInChats(query);
|
||||||
if (userId == 0 || query.Length == 0)
|
if (userId == 0 || query.Length == 0)
|
||||||
return; //TODO do something;
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No matching chat found.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
var chat = GetSecretChats().Find(p => ((TdApi.ChatType.ChatTypeSecret) p.Type).UserId == userId);
|
var chat = GetSecretChats().Find(p => ((TdApi.ChatType.ChatTypeSecret) p.Type).UserId == userId);
|
||||||
if (chat == null)
|
if (chat == null)
|
||||||
{
|
{
|
||||||
return; //TODO do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No matching secret chat found.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TdApi.SecretChat secChat;
|
TdApi.SecretChat secChat;
|
||||||
|
@ -378,7 +409,9 @@ namespace telegram
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return; //TODO do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No matching secret chat found. (this error should be impossible to produce)");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.Title = TruncateString(chat.Title, 20);
|
chat.Title = TruncateString(chat.Title, 20);
|
||||||
|
@ -443,7 +476,12 @@ namespace telegram
|
||||||
|
|
||||||
public override void Handler(List<string> inputParams)
|
public override void Handler(List<string> inputParams)
|
||||||
{
|
{
|
||||||
if (currentChatId == 0) return; //TODO: do something
|
if (currentChatId == 0)
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No open chat, cannot continue.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
MarkUnread(currentChatId);
|
MarkUnread(currentChatId);
|
||||||
CommandManager.HandleCommand("c");
|
CommandManager.HandleCommand("c");
|
||||||
}
|
}
|
||||||
|
@ -457,7 +495,12 @@ namespace telegram
|
||||||
|
|
||||||
public override void Handler(List<string> inputParams)
|
public override void Handler(List<string> inputParams)
|
||||||
{
|
{
|
||||||
if (currentChatId == 0) return; //TODO: do something
|
if (currentChatId == 0)
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No open chat, cannot continue.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
currentChatId = 0;
|
currentChatId = 0;
|
||||||
currentChatUserId = 0;
|
currentChatUserId = 0;
|
||||||
|
@ -486,7 +529,12 @@ namespace telegram
|
||||||
|
|
||||||
public override void Handler(List<string> inputParams)
|
public override void Handler(List<string> inputParams)
|
||||||
{
|
{
|
||||||
if (currentChatId == 0) return; //TODO: do something
|
if (currentChatId == 0)
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No open chat, cannot continue.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var history = inputParams.Count == 1 && int.TryParse(inputParams[0], out var limit)
|
var history = inputParams.Count == 1 && int.TryParse(inputParams[0], out var limit)
|
||||||
? GetHistory(currentChatId, limit)
|
? GetHistory(currentChatId, limit)
|
||||||
|
@ -589,7 +637,11 @@ namespace telegram
|
||||||
public override void Handler(List<string> inputParams)
|
public override void Handler(List<string> inputParams)
|
||||||
{
|
{
|
||||||
if (inputParams.Count == 0)
|
if (inputParams.Count == 0)
|
||||||
return; //TODO do something
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Invalid syntax, check /help for more information.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var query = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
var query = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
||||||
|
|
||||||
|
@ -619,6 +671,7 @@ namespace telegram
|
||||||
|
|
||||||
public override void Handler(List<string> inputParams)
|
public override void Handler(List<string> inputParams)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
var query = inputParams[0];
|
var query = inputParams[0];
|
||||||
|
|
||||||
var chat = GetChatByUsernameGlobal(query);
|
var chat = GetChatByUsernameGlobal(query);
|
||||||
|
@ -628,7 +681,11 @@ namespace telegram
|
||||||
//TODO implement when TDLib 1.6 is released
|
//TODO implement when TDLib 1.6 is released
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return; //TODO do something
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Username does not refer to a user.");
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -665,12 +722,12 @@ namespace telegram
|
||||||
messageQueue.Add($"{Ansi.Yellow}[tgcli] Listing {CommandManager.Commands.Count} commands:");
|
messageQueue.Add($"{Ansi.Yellow}[tgcli] Listing {CommandManager.Commands.Count} commands:");
|
||||||
CommandManager.Commands.ForEach(command =>
|
CommandManager.Commands.ForEach(command =>
|
||||||
{
|
{
|
||||||
var commandText = $"/{command.Trigger}";
|
var commandText = $"/{command.trigger}";
|
||||||
if (!string.IsNullOrWhiteSpace(command.Syntax))
|
if (!string.IsNullOrWhiteSpace(command.syntax))
|
||||||
commandText += $" {command.Syntax}";
|
commandText += $" {command.syntax}";
|
||||||
commandText += $": {command.Description}";
|
commandText += $": {command.description}";
|
||||||
if (!string.IsNullOrWhiteSpace(command.Shortcut))
|
if (!string.IsNullOrWhiteSpace(command.shortcut))
|
||||||
commandText += $" ({command.Shortcut})";
|
commandText += $" ({command.shortcut})";
|
||||||
|
|
||||||
messageQueue.Add($"{Ansi.Yellow}{commandText}");
|
messageQueue.Add($"{Ansi.Yellow}{commandText}");
|
||||||
});
|
});
|
||||||
|
@ -710,24 +767,39 @@ namespace telegram
|
||||||
|
|
||||||
var message = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
var message = inputParams.Aggregate((current, param) => current + " " + param).Trim();
|
||||||
|
|
||||||
if (currentChatId == 0) return; //TODO do something
|
if (currentChatId == 0)
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No open chat, cannot continue.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (lastMessage == null)
|
if (lastMessage == null)
|
||||||
{
|
{
|
||||||
//try to find last message
|
//try to find last message
|
||||||
var history = GetHistory(currentChatId, 50);
|
var history = GetHistory(currentChatId, 50);
|
||||||
var last = history.LastOrDefault(p => p.IsOutgoing);
|
var last = history.LastOrDefault(p => p.IsOutgoing);
|
||||||
if (last == null) return; //TODO do something
|
if (last == null)
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No message to edit found, cannot continue.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
lastMessage = last;
|
lastMessage = last;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(message))
|
if (string.IsNullOrWhiteSpace(message))
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No message specified, cannot continue.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
EditMessage(message, lastMessage);
|
EditMessage(message, lastMessage);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
//TODO do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Unknown error editing message.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -744,7 +816,9 @@ namespace telegram
|
||||||
{
|
{
|
||||||
if (inputParams.Count < 2)
|
if (inputParams.Count < 2)
|
||||||
{
|
{
|
||||||
return; //TODO do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Invalid syntax, check /help for more information.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var history = GetHistory(currentChatId, 50);
|
var history = GetHistory(currentChatId, 50);
|
||||||
|
@ -755,18 +829,26 @@ namespace telegram
|
||||||
|
|
||||||
if (!parsed || string.IsNullOrWhiteSpace(message) || history.Count < offset)
|
if (!parsed || string.IsNullOrWhiteSpace(message) || history.Count < offset)
|
||||||
{
|
{
|
||||||
return; //TODO do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}Invalid syntax, check /help for more information.");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var replyMessage = history[offset - 1];
|
var replyMessage = history[offset - 1];
|
||||||
|
|
||||||
if (currentChatId == 0) return; //TODO do something
|
if (currentChatId == 0)
|
||||||
|
{
|
||||||
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] No open chat, cannot continue.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SendMessage(message, currentChatId, replyMessage.Id);
|
SendMessage(message, currentChatId, replyMessage.Id);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
//TODO do something
|
lock (@lock)
|
||||||
|
messageQueue.Add($"{Ansi.Red}[tgcli] Unknown error sending message.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -269,7 +269,6 @@ namespace telegram
|
||||||
public static void ClearCurrentConsoleLine()
|
public static void ClearCurrentConsoleLine()
|
||||||
{
|
{
|
||||||
Console.Write("\u001b[2K\r");
|
Console.Write("\u001b[2K\r");
|
||||||
//TODO is there a better solution?
|
|
||||||
|
|
||||||
//Console.SetCursorPosition(0, Console.WindowHeight);
|
//Console.SetCursorPosition(0, Console.WindowHeight);
|
||||||
//Console.Write(new string(' ', Console.WindowWidth));
|
//Console.Write(new string(' ', Console.WindowWidth));
|
||||||
|
|
|
@ -14,7 +14,6 @@ namespace telegram
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* TODO:
|
* TODO:
|
||||||
* waaay more error messages instead of just doing nothing or crashing (search for TODOs and "do something")
|
|
||||||
* mute,unmute chats
|
* mute,unmute chats
|
||||||
* photo & document download & show externally
|
* photo & document download & show externally
|
||||||
* publish AUR package
|
* publish AUR package
|
||||||
|
@ -22,6 +21,8 @@ namespace telegram
|
||||||
* ref: http://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html#cursor-navigation
|
* ref: http://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html#cursor-navigation
|
||||||
* ref: https://en.wikipedia.org/wiki/ANSI_escape_code#Escape_sequences
|
* ref: https://en.wikipedia.org/wiki/ANSI_escape_code#Escape_sequences
|
||||||
* refactor everything
|
* refactor everything
|
||||||
|
* re-evaluate ClearCurrentConsoleLine function
|
||||||
|
* When TDLib 1.6 is released: implement contacts
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// ReSharper disable once InconsistentNaming
|
// ReSharper disable once InconsistentNaming
|
||||||
|
@ -175,7 +176,6 @@ namespace telegram
|
||||||
var chat = update.SecretChat;
|
var chat = update.SecretChat;
|
||||||
switch (chat.State)
|
switch (chat.State)
|
||||||
{
|
{
|
||||||
//TODO: send notifs here!
|
|
||||||
case Td.TdApi.SecretChatState.SecretChatStateClosed _:
|
case Td.TdApi.SecretChatState.SecretChatStateClosed _:
|
||||||
lock (@lock)
|
lock (@lock)
|
||||||
messageQueue.Add($"{Ansi.Red}[tgcli] Secret chat with {chat.Id} was closed.");
|
messageQueue.Add($"{Ansi.Red}[tgcli] Secret chat with {chat.Id} was closed.");
|
||||||
|
|
Loading…
Reference in a new issue