Compare commits

..

No commits in common. "main" and "v1.3βeta" have entirely different histories.

9 changed files with 87 additions and 199 deletions

View File

@ -1,44 +0,0 @@
using System.Reflection;
namespace TelegramMessageCounter;
public static class ArgumentReader
{
public static DataRequest ReadArguments(string[] args)
{
string? login = null;
string? username = null;
if (args.Length > 0 && args.Any(x => x == "--help"))
{
var helpFile = Assembly.GetExecutingAssembly()
.GetManifestResourceStream("TelegramMessageCounter.help.txt");
Console.WriteLine(new StreamReader(helpFile ?? new MemoryStream()).ReadToEnd());
Environment.Exit(0);
}
if (args.Any(x => x == "--user"))
{
var userNameArgIndex = args.ToList().IndexOf("--user");
username = args[userNameArgIndex + 1];
}
if (args.Any(x => x == "--login" || x == "-L"))
{
var userNameArgIndex = args.ToList().IndexOf("--login");
if (userNameArgIndex == -1)
{
userNameArgIndex = args.ToList().IndexOf("-L");
}
login = args[userNameArgIndex + 1];
}
string?[] argValues = [login, username];
string? path = args.Length > 1 && argValues.All(x => x != args.Last()) ? args.Last() : null;
if (path == null)
return new(login, username);
return new(login, username, path);
}
}

View File

@ -1,23 +1,17 @@
using CsvHelper.Configuration.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TelegramMessageCounter;
public record CounterInfo(
[property: Name("Message multiplier")]
float MessageMultiplier,
[property: Name("Symbols multiplier")]
float SymbolsMultiplier,
[property: Name("Your messages")]
int UserMessageCount,
[property: Name("Target messages")]
int TargetMessageCount,
[property: Name("Your symbols")]
int UserSymbolsCount,
[property: Name("Target symbols")]
int TargetSymbolsCount,
[property: Name("All messages")]
int FullMessageCount,
[Index(0)]
[property: Name("Target username")]
namespace TelegramMessageCounter
{
internal record CounterInfo
(
float Multiplier,
int TargetMsg,
int MyMsg,
int FullMsg,
string TargetUsername
);
}

View File

@ -1,3 +0,0 @@
namespace TelegramMessageCounter;
public record DataRequest(string? Login, string? Username, string Path = "results.txt");

View File

@ -5,24 +5,28 @@ namespace TelegramMessageCounter
{
internal static class Program
{
private static readonly Client
Client = new(23711185,
"9e23f24bbb2f3dc3e561c0a5c9d3e622"); //Please, create your client, but don't shy use it if you are lazy :)
private static readonly Client Client = new(23711185, "9e23f24bbb2f3dc3e561c0a5c9d3e622"); //Please, create your client, but don't shy use it if you are lazy :)
static void Main(string[] args)
{
var dataRequest = ArgumentReader.ReadArguments(args);
var username = dataRequest.Login;
if (args.Length > 0 && args[0] == "--help")
{
Console.WriteLine("Usage: TelegramMessageCounter <login (phone number)> <path>" +
"\n login - Phone number of telegram. If argument is empty, waiting for Keyboard interrupt" +
"\n path - Path to save results file. If argument is empty, path will be \"results.txt\"\n");
}
string? login = args.Length > 0 ? args[0] : null;
string? path = args.Length > 1 ? args[1] : null;
Splash.MakeSplash();
loginStage:
if (username is null)
if (login is null)
{
Console.WriteLine("Enter your phone number: ");
username = Console.ReadLine();
login = Console.ReadLine();
}
if (username is null)
if (login is null)
{
Console.WriteLine("Login is invalid!");
goto loginStage;
@ -33,7 +37,7 @@ namespace TelegramMessageCounter
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Waiting to login...");
DoLogin(username).Wait();
DoLogin(login).Wait();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]"); //Check logged
@ -42,34 +46,27 @@ namespace TelegramMessageCounter
List<CounterInfo> infos = [];
foreach(var user in Client.Messages_GetAllDialogs().Result.users.Values)
{
if (dataRequest.Username is not null && user.username != dataRequest.Username)
continue;
var res = GetInfo(user.id);
if (res == null)
{
Console.WriteLine($"[WARN]User {user.id} failed to analyze! Skipping...");
Console.WriteLine($"User {user.id} not found! Skipping...");
continue;
}
Console.WriteLine(
$"MessageMultiplier {Client.User}/{res.TargetUsername} is: {res.MessageMultiplier} of {res.UserMessageCount}/{res.TargetMessageCount} and total {res.FullMessageCount} messages");
Console.WriteLine($"Multiplier {Client.User}/{res.TargetUsername} is: {res.Multiplier} of {res.MyMsg}/{res.TargetMsg} and total {res.FullMsg} messages");
infos.Add(res);
}
if (dataRequest.Path.Contains(".csv"))
ResultWriter.SaveStatsToCsv(infos, dataRequest.Path);
if(path is not null)
SaveAndAddStats(infos, path);
else
ResultWriter.SaveStatsToTxt(infos, dataRequest.Path);
SaveAndAddStats(infos);
}
static CounterInfo? GetInfo(long targetId)
{
var dialogs = Client.Messages_GetAllDialogs().Result;
int userMsgCount = 0;
int userSymbolsCount = 0;
int targetMsgCount = 0;
int targetSymbolsCount = 0;
int myCounter = 0;
int targetCounter = 0;
User? peer;
try
{
@ -80,7 +77,7 @@ namespace TelegramMessageCounter
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]");
Console.WriteLine($"Username is: {peer?.username}");
Console.WriteLine($"Username is: {(peer)?.username}");
}
catch (Exception ex)
{
@ -91,7 +88,7 @@ namespace TelegramMessageCounter
}
List<Messages_MessagesBase> messagesList = [];
var fullMsgCount = 0;
var messageCount = 0;
try
{
var res = Client.Messages_GetHistory((InputPeer)peer).Result;
@ -111,8 +108,7 @@ namespace TelegramMessageCounter
// ignored
}
}
fullMsgCount = res.Count;
messageCount =res.Count;
}
catch (Exception)
{
@ -129,47 +125,55 @@ namespace TelegramMessageCounter
{
if (msg.from_id != null)
{
userMsgCount++;
userSymbolsCount += msg.message.Length;
myCounter++;
}
else
{
targetMsgCount++;
targetSymbolsCount += msg.message.Length;
else targetCounter++;
}
}
}
}
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]");
Console.ForegroundColor = ConsoleColor.White;
return new(
(float)userMsgCount / targetMsgCount,
(float)userSymbolsCount / targetSymbolsCount,
userMsgCount,
targetMsgCount,
userSymbolsCount,
targetSymbolsCount,
fullMsgCount,
(float)myCounter / targetCounter,
targetCounter,
myCounter,
messageCount,
string.IsNullOrEmpty(peer?.username ?? "") ? peer?.id.ToString() ?? "unknown" : $"@{peer?.username}");
}
static void SaveAndAddStats(List<CounterInfo> infos, string path = "results.txt")
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write("Saving results...");
File.Create("results.txt");
string fileData = "";
float multiplier = 0;
foreach (CounterInfo info in infos)
{
fileData += "username: " + info.TargetUsername + "\n" +
"multiplier: " + info.Multiplier + "\n" +
"total messages: " + info.FullMsg + "\n" +
"your messages: " + info.MyMsg + "\n" +
"target messages: " + info.TargetMsg + "\n-----\n";
multiplier += info.Multiplier;
}
multiplier /= infos.Count;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"Middle result is: {multiplier}");
File.WriteAllText(path, fileData);
Console.WriteLine("Goodbye!");
}
static async Task DoLogin(string loginInfo)
{
while (Client.User == null)
switch (await Client.Login(loginInfo)) // returns which config is needed to continue login
{
case "verification_code":
Console.Write("Code: ");
loginInfo = Console.ReadLine()!;
break;
case "password":
Console.Write("Password: ");
loginInfo = Console.ReadLine()!;
break; // if user has enabled 2FA
case "verification_code": Console.Write("Code: "); loginInfo = Console.ReadLine()!; break;
case "password": Console.Write("Password: "); loginInfo = Console.ReadLine()!; break; // if user has enabled 2FA
default: loginInfo = null!; break;
}
}

View File

@ -6,21 +6,19 @@ Program for calculate statistics of messages sended in telegram with your friend
## Usage
.\TelegramMessageCounter.exe --login <phone_number> --user <username> <path>
.\TelegramMessageCounter.exe <login (phone number)> <path>
where
- `--login -L` - Phone number of telegram. If argument is empty, waiting for keyboard input
- `--user` - Username of telegram for individual stats. If argument is empty, analyzing all user history
- `path` - Path to save results file. If argument is empty, path will be `results.txt`, if path contain '.csv' program
will output stats in CSV format.
- `login` - Phone number of telegram. If argument is empty, waiting for Keyboard interrupt
- `path` - Path to save results file. If argument is empty, path will be `results.txt`
To invoke this text use
.\TelegramMessageCounter.exe --help
### Example
.\TelegramMessageCounter.exe --login +14928587194
.\TelegramMessageCounter.exe -L +14928587194 D:\Results\results.txt
.\TelegramMessageCounter.exe -L +14928587194 --user lisoveliy
.\TelegramMessageCounter.exe +14928587194
.\TelegramMessageCounter.exe +14928587194 D:\Results\results.txt
.\TelegramMessageCounter.exe
### Results

View File

@ -1,50 +0,0 @@
using System.Globalization;
using CsvHelper;
namespace TelegramMessageCounter;
public static class ResultWriter
{
public static void SaveStatsToTxt(List<CounterInfo> infos, string path = "results.txt")
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write($"Saving results to {path}...");
string fileData = "";
float multiplier = 0;
foreach (CounterInfo info in infos)
{
fileData += "username: " + info.TargetUsername + "\n" +
"message multiplier (You/Target): " + info.MessageMultiplier + "\n" +
"symbol multiplier (You/Target): " + info.SymbolsMultiplier + "\n" +
"total messages: " + info.FullMessageCount + "\n" +
"your messages: " + info.UserMessageCount + "\n" +
"target messages: " + info.TargetMessageCount + "\n" +
"your symbols in messages: " + info.UserSymbolsCount + "\n" +
"target symbols in messages: " + info.TargetSymbolsCount + "\n-----\n";
multiplier += info.MessageMultiplier;
}
multiplier /= infos.Count;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($"Middle result is: {multiplier}");
File.WriteAllText(path, fileData);
Console.WriteLine("Goodbye!");
}
public static void SaveStatsToCsv(List<CounterInfo> infos, string path = "results.csv")
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.Write($"Saving results to {path}...");
using (var writer = new StreamWriter(path))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(infos);
}
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("[DONE]");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Goodbye!");
}
}

View File

@ -9,7 +9,7 @@
Console.WriteLine("/__ \\/\\/\\ / __\\");
Console.WriteLine(" / /\\/ \\ / / ");
Console.WriteLine(" / / / /\\/\\ \\/ /___ ");
Console.WriteLine($" \\/ \\/ \\/\\____/ v{System.Reflection.Assembly.GetEntryAssembly()?.GetName().Version} ꞵeta");
Console.WriteLine(" \\/ \\/ \\/\\____/ v1.3 ꞵeta");
Console.WriteLine("Telegram Message Counter by Lisoveliy");
}
}

View File

@ -7,19 +7,13 @@
<Nullable>enable</Nullable>
<Company>Lisoveliy</Company>
<Authors>Lisoveliy</Authors>
<AssemblyVersion>0.2.1.0</AssemblyVersion>
<FileVersion>0.2.1.0</FileVersion>
<AssemblyVersion>0.1.3</AssemblyVersion>
<FileVersion>0.1.3</FileVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CsvHelper" Version="33.0.1" />
<PackageReference Include="WTelegramClient" Version="3.5.3" />
</ItemGroup>
<ItemGroup>
<None Remove="help.txt" />
<EmbeddedResource Include="help.txt" />
</ItemGroup>
</Project>

View File

@ -1,5 +0,0 @@
Usage: TelegramMessageCounter --login <phone_number> --user <username> <path>
--login <phone_number> - Phone number of telegram. If argument is empty, waiting for Keyboard interrupt
--user <user> - Username of telegram for individual stats. If argument is empty, analyzing all users history
<path> - Path to save results file. If argument is empty, path will be `results.txt`, if path contain '.csv' program will output stats in CSV format.