2025-02-05 14:05:04 +03:00
using TL ;
using WTelegram ;
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 :)
static void Main ( string [ ] args )
{
2025-02-11 20:51:33 +03:00
var dataRequest = ArgumentReader . ReadArguments ( args ) ;
var username = dataRequest . Login ;
2025-02-05 14:05:04 +03:00
Splash . MakeSplash ( ) ;
loginStage :
2025-02-11 20:51:33 +03:00
if ( username is null )
2025-02-05 14:05:04 +03:00
{
Console . WriteLine ( "Enter your phone number: " ) ;
2025-02-11 20:51:33 +03:00
username = Console . ReadLine ( ) ;
2025-02-05 14:05:04 +03:00
}
2025-02-11 20:51:33 +03:00
if ( username is null )
2025-02-05 14:05:04 +03:00
{
Console . WriteLine ( "Login is invalid!" ) ;
goto loginStage ;
}
Helpers . Log = ( _ , _ ) = > { } ; //force logger to shut up
Console . ForegroundColor = ConsoleColor . Yellow ;
2025-02-05 14:48:24 +03:00
Console . WriteLine ( "Waiting to login..." ) ;
2025-02-05 14:05:04 +03:00
2025-02-11 20:51:33 +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 = [ ] ;
foreach ( var user in Client . Messages_GetAllDialogs ( ) . Result . users . Values )
{
2025-02-11 20:51:33 +03:00
if ( dataRequest . Username is not null & & user . username ! = dataRequest . Username )
continue ;
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 21:13:47 +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 20:51:33 +03:00
SaveAndAddStats ( infos , dataRequest . Path ) ;
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 ;
}
2025-02-06 17:59:39 +03:00
List < Messages_MessagesBase > messagesList = [ ] ;
2025-02-11 21:13:47 +03:00
var fullMsgCount = 0 ;
2025-02-06 17:59:39 +03:00
try
2025-02-05 14:05:04 +03:00
{
2025-02-06 17:59:39 +03:00
var res = Client . Messages_GetHistory ( ( InputPeer ) peer ) . Result ;
2025-02-05 14:05:04 +03:00
2025-02-06 17:59:39 +03:00
for ( int offset = 0 ; offset < res . Count ; offset + = 100 )
2025-02-05 14:05:04 +03:00
{
2025-02-06 17:59:39 +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 21:13:47 +03:00
fullMsgCount = res . Count ;
2025-02-05 14:05:04 +03:00
}
2025-02-06 17:59:39 +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
}
}
}
}
Console . ForegroundColor = ConsoleColor . Green ;
Console . WriteLine ( "[DONE]" ) ;
Console . ForegroundColor = ConsoleColor . White ;
return new (
2025-02-11 21:13:47 +03:00
( float ) userMsgCount / targetMsgCount ,
( float ) userSymbolsCount / targetSymbolsCount ,
userMsgCount ,
targetMsgCount ,
userSymbolsCount ,
targetSymbolsCount ,
fullMsgCount ,
2025-02-05 14:48:24 +03:00
string . IsNullOrEmpty ( peer ? . username ? ? "" ) ? peer ? . id . ToString ( ) ? ? "unknown" : $"@{peer?.username}" ) ;
2025-02-05 14:05:04 +03:00
}
2025-02-05 14:48:24 +03:00
static void SaveAndAddStats ( List < CounterInfo > infos , string path = "results.txt" )
2025-02-05 14:05:04 +03:00
{
Console . ForegroundColor = ConsoleColor . Yellow ;
Console . Write ( "Saving results..." ) ;
string fileData = "" ;
float multiplier = 0 ;
foreach ( CounterInfo info in infos )
{
fileData + = "username: " + info . TargetUsername + "\n" +
2025-02-11 21:13:47 +03:00
"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 ;
2025-02-05 14:05:04 +03:00
}
multiplier / = infos . Count ;
Console . ForegroundColor = ConsoleColor . Green ;
Console . WriteLine ( "[DONE]" ) ;
Console . ForegroundColor = ConsoleColor . White ;
Console . WriteLine ( $"Middle result is: {multiplier}" ) ;
2025-02-05 14:48:24 +03:00
File . WriteAllText ( path , fileData ) ;
Console . WriteLine ( "Goodbye!" ) ;
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-05 14:48:24 +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 ;
}
}
}
}