177 lines
6.3 KiB
C#
Raw Permalink Normal View History

2025-02-05 14:05:04 +03:00
using TL;
using WTelegram;
namespace TelegramMessageCounter
{
internal static class Program
{
2025-02-11 22:37:33 +03:00
private static readonly Client
Client = new(23711185,
"9e23f24bbb2f3dc3e561c0a5c9d3e622"); //Please, create your client, but don't shy use it if you are lazy :)
2025-02-05 14:05:04 +03:00
static void Main(string[] args)
{
var dataRequest = ArgumentReader.ReadArguments(args);
var username = dataRequest.Login;
2025-02-05 14:05:04 +03:00
Splash.MakeSplash();
2025-02-11 22:37:33 +03:00
2025-02-05 14:05:04 +03:00
loginStage:
if (username is null)
2025-02-05 14:05:04 +03:00
{
Console.WriteLine("Enter your phone number: ");
username = Console.ReadLine();
2025-02-05 14:05:04 +03:00
}
2025-02-11 22:37:33 +03:00
if (username is null)
2025-02-05 14:05:04 +03:00
{
Console.WriteLine("Login is invalid!");
goto loginStage;
}
2025-02-11 22:37:33 +03:00
2025-02-05 14:05:04 +03:00
Helpers.Log = (_, _) => { }; //force logger to shut up
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Waiting to login...");
2025-02-05 14:05:04 +03:00
DoLogin(username).Wait();
2025-02-05 14:05:04 +03:00
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]"); //Check logged
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"Welcome, {Client.User}!");
List<CounterInfo> infos = [];
2025-02-11 22:37:33 +03:00
foreach (var user in Client.Messages_GetAllDialogs().Result.users.Values)
2025-02-05 14:05:04 +03:00
{
2025-02-11 22:37:33 +03:00
if (dataRequest.Username is not null && user.username != dataRequest.Username)
continue;
2025-02-11 22:37:33 +03:00
2025-02-05 14:05:04 +03:00
var res = GetInfo(user.id);
if (res == null)
{
2025-02-11 21:13:47 +03:00
Console.WriteLine($"[WARN]User {user.id} failed to analyze! Skipping...");
2025-02-05 14:05:04 +03:00
continue;
}
2025-02-11 22:37:33 +03:00
Console.WriteLine(
$"MessageMultiplier {Client.User}/{res.TargetUsername} is: {res.MessageMultiplier} of {res.UserMessageCount}/{res.TargetMessageCount} and total {res.FullMessageCount} messages");
2025-02-05 14:05:04 +03:00
infos.Add(res);
}
2025-02-11 22:37:33 +03:00
if (dataRequest.Path.Contains(".csv"))
ResultWriter.SaveStatsToCsv(infos, dataRequest.Path);
else
ResultWriter.SaveStatsToTxt(infos, dataRequest.Path);
2025-02-05 14:05:04 +03:00
}
2025-02-11 22:37:33 +03:00
2025-02-05 14:05:04 +03:00
static CounterInfo? GetInfo(long targetId)
{
var dialogs = Client.Messages_GetAllDialogs().Result;
2025-02-11 21:13:47 +03:00
int userMsgCount = 0;
int userSymbolsCount = 0;
int targetMsgCount = 0;
int targetSymbolsCount = 0;
2025-02-05 14:05:04 +03:00
User? peer;
try
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write($"Attempt to found chat for id: {targetId}...");
peer = dialogs.users.Values.FirstOrDefault(x => x.ID == targetId);
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]");
2025-02-11 21:13:47 +03:00
Console.WriteLine($"Username is: {peer?.username}");
2025-02-05 14:05:04 +03:00
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"[FAILED]\nError was happened({ex.Message})! Returning...");
Console.ForegroundColor = ConsoleColor.White;
return null;
}
List<Messages_MessagesBase> messagesList = [];
2025-02-11 21:13:47 +03:00
var fullMsgCount = 0;
try
2025-02-05 14:05:04 +03:00
{
var res = Client.Messages_GetHistory((InputPeer)peer).Result;
2025-02-05 14:05:04 +03:00
for (int offset = 0; offset < res.Count; offset += 100)
2025-02-05 14:05:04 +03:00
{
if (offset > res.Count) offset = res.Count;
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write($"\rReading messages, please wait, it may take a while... {offset} => {res.Count}");
try
{
messagesList.Add(Client.Messages_GetHistory((InputPeer)peer, 0, default, offset).Result);
}
catch (Exception)
{
// ignored
}
2025-02-05 14:05:04 +03:00
}
2025-02-11 22:37:33 +03:00
2025-02-11 21:13:47 +03:00
fullMsgCount = res.Count;
2025-02-05 14:05:04 +03:00
}
catch (Exception)
{
// ignored
}
2025-02-05 14:05:04 +03:00
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("\nEvaluating results...");
foreach (var messageBase in messagesList)
{
foreach (var message in messageBase.Messages)
{
if (message is Message msg)
{
if (msg.from_id != null)
{
2025-02-11 21:13:47 +03:00
userMsgCount++;
userSymbolsCount += msg.message.Length;
}
else
{
targetMsgCount++;
targetSymbolsCount += msg.message.Length;
2025-02-05 14:05:04 +03:00
}
}
}
}
2025-02-11 22:37:33 +03:00
2025-02-05 14:05:04 +03:00
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]");
Console.ForegroundColor = ConsoleColor.White;
return new(
2025-02-11 22:37:33 +03:00
(float)userMsgCount / targetMsgCount,
2025-02-11 21:13:47 +03:00
(float)userSymbolsCount / targetSymbolsCount,
2025-02-11 22:37:33 +03:00
userMsgCount,
targetMsgCount,
2025-02-11 21:13:47 +03:00
userSymbolsCount,
targetSymbolsCount,
2025-02-11 22:37:33 +03:00
fullMsgCount,
string.IsNullOrEmpty(peer?.username ?? "") ? peer?.id.ToString() ?? "unknown" : $"@{peer?.username}");
2025-02-05 14:05:04 +03:00
}
2025-02-11 22:37:33 +03:00
2025-02-05 14:05:04 +03:00
static async Task DoLogin(string loginInfo)
{
while (Client.User == null)
switch (await Client.Login(loginInfo)) // returns which config is needed to continue login
{
2025-02-11 22:37:33 +03:00
case "verification_code":
Console.Write("Code: ");
loginInfo = Console.ReadLine()!;
break;
case "password":
Console.Write("Password: ");
loginInfo = Console.ReadLine()!;
break; // if user has enabled 2FA
2025-02-05 14:05:04 +03:00
default: loginInfo = null!; break;
}
}
}
}