Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /////////////////////////// includes.h \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #pragma once
- #include<stdlib.h>
- #include<stdio.h>
- #include<string.h>
- #ifdef _WIN32
- #include<windows.h>
- #include<conio.h>
- #else
- #include <ncurses/curses.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <unistd.h>
- #include <termios.h>
- #include <pthread.h>
- #include <errno.h>
- #include <signal.h>
- #endif
- /////////////////////////// main.h \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #pragma once
- #include "includes.h"
- #include "terminaldisplay.h"
- #include<vector>
- #include<deque>
- extern int curroom;
- extern char rooms[64][200];
- extern int roomtotal;
- extern std::vector<char*>users[640];
- extern std::deque<int> keyqueue;
- extern bool keyqueuewriting;
- extern std::deque<char*> msgqueue;
- extern bool msgqueuewriting;
- void grabkey( void* in );
- void grabmsg( void* in );
- /////////////////////////// main.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #include "main.h"
- #include "network.h"
- #include "systemcalls.h"
- #include <vector>
- #define K_UP 18656
- #define K_DOWN 20704
- #define K_LEFT 19424
- #define K_RIGHT 19936
- #define K_BACKSPACE 8
- #define K_ENTER 13
- #define K_ESCAPE 27
- #define K_HOME 18400
- #define K_END 20448
- #define K_DELETE 21472
- #define K_INSERT 21216
- #define K_F1 15104
- #define K_PGUP 18912
- #define K_PGDWN 20960
- #define K_CTRLPGUP 34528
- #define K_CTRLPGDWN 30432
- #define K_CTRLHOME 30688
- #define K_CTRLEND 30176
- #define K_
- bool drawing = false;
- void inputloop( void* a );
- char globalnick[100] = "";
- int curroom = 0;
- char rooms[64][200];
- std::vector<char*> users[640];
- int roomtotal = 0;
- SOCKET globalsock;
- void remroom( int id )
- {
- for( int i = 0; i < users[id].size(); i++)
- {
- free( users[id][i] );
- }
- users[id].clear();
- if( id < roomtotal )
- for( int i = id; i < roomtotal; i++)
- {
- users[i] = users[i+1];
- strcpy( rooms[i], rooms[i+1] );
- }
- if( curroom > 0 ) curroom--;
- roomtotal--;
- updaterooms();
- }
- int main()
- {
- int t;
- /*while( 1 )
- {
- t = getch();
- if( t == 224 || t == 0 )
- {
- t += getch() << 8;
- }
- printf( "%i\t%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i\n", t,(t&32768)!=0,(t&16384)!=0,(t&8192)!=0,(t&4096)!=0,(t&2048)!=0,(t&1024)!=0,(t&512)!=0,(t&256)!=0,(t&128)!=0,(t&64)!=0,(t&32)!=0,(t&16)!=0,(t&8)!=0,(t&4)!=0,(t&2)!=0, (t&1)!=0);
- }
- //*/
- for( int k = 0; k < 64; k++ ) userpos[k] = 0;
- for( int k = 0; k < 64; k ++)
- for( int i = 0; i < BUFS; buffer[k][i++] = ' ' );
- int i;
- /*
- SMALL_RECT screenpos;
- screenpos.Top = 1;
- screenpos.Left = 1;
- screenpos.Bottom = SCREENHIG;
- screenpos.Left = 800;
- SetConsoleWindowInfo(hStdout, false, &screenpos );*/
- WSADATA globalWSAData;
- WSAStartup( MAKEWORD(2, 2), &globalWSAData );
- HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;
- COORD size = { 80, SCREENHIG+2 } ;
- SetConsoleScreenBufferSize( hStdout, size );
- gotoxy( 0, 0 );
- for( i = 0; i < 80*40; i ++ )
- {
- printf( " " );
- }
- gotoxy( 0, 0 );
- printf("Enter your nickname: ");
- gets( globalnick );
- char server[100];
- printf("Enter the server address: ");
- gets( server );
- SOCKET sock = connectTCP( resolveAddr( server ), 6667 );
- globalsock = sock;
- sendMsg( sock, "NICK %s", globalnick );
- sendMsg( sock, "USER %s %s %s :%s", globalnick, globalnick, globalnick, globalnick );
- callThread( grabkey, 0 );
- callThread( grabmsg, &sock );
- meclear();
- int scroll = 0;
- char input[1000] = {0};
- // int t;
- int pos = 0;
- int change = 0;
- int change2 = change;
- int bufprev = bufpos[curroom];
- int moremoove = 0;
- //inputloop( 0 );
- bool shouldsleep = true;
- while(1){
- if( shouldsleep )
- Sleep(50);
- shouldsleep = true;
- while( keyqueuewriting ){}
- keyqueuewriting = true;
- while( keyqueue.size() > 0 )
- {
- shouldsleep = false;
- int t = keyqueue.front();
- keyqueue.pop_front();
- switch( t )
- {
- case K_BACKSPACE:
- if( pos > 0 ){
- for( int i = pos-1; input[i] != 0; input[i] = input[++i] );
- movecursorback( 1 );
- pos -= 1;
- } break;
- case K_LEFT: if( pos > 0 ){ movecursorback( 1 ); pos -= 1; } break;
- case K_RIGHT: if( input[pos] != 0 ) {movecursorforward( 1 ); pos += 1;} break;
- case K_HOME: { gotoxy(0,SCREENHIG-1); pos = 0; } break;
- case K_END: { int a = strlen( input ); /*gotoxy( 79,39 );*/ pos = a;} break;
- case K_PGUP: { if( bufpos[curroom] < (BUFFERLINES-TFIELDH)-4 ) bufpos[curroom] += 5; else bufpos[curroom] = BUFFERLINES-TFIELDH; drawbuffer();savexy(); gotoxy(0,2); printf( "Line %i/%i ",bufpos[curroom], BUFFERLINES-TFIELDH ); returntosaved();} break;
- case K_PGDWN: { if( bufpos[curroom] > 4 ) bufpos[curroom] -= 5; else bufpos[curroom] = 0; drawbuffer(); savexy(); gotoxy(0,2); printf( "Line %i/%i ",bufpos[curroom], BUFFERLINES-TFIELDH ); returntosaved();} break;
- case K_CTRLEND: { bufpos[curroom] = BUFFERLINES-TFIELDH; drawbuffer();savexy(); gotoxy(0,2); printf( "Line %i/%i ",bufpos[curroom], BUFFERLINES-TFIELDH ); returntosaved();} break;
- case K_CTRLHOME: { bufpos[curroom] = 0; drawbuffer(); savexy(); gotoxy(0,2); printf( "Line %i/%i ",bufpos[curroom], BUFFERLINES-TFIELDH ); returntosaved();} break;
- case K_CTRLPGUP: { userpos[curroom] -= 1; if( userpos[curroom] < 0 ) userpos[curroom] = 0; updateusers(); } break;
- case K_CTRLPGDWN: { userpos[curroom] += 1; if( userpos[curroom] > (int)(users[curroom].size() - 25) ) userpos[curroom] = users[curroom].size() - 25; updateusers(); } break;
- case K_F1: { pushstring( "-------------------------- HELP --------------------------");
- pushstring( " Aslai's IRC Client version .01B ");
- pushstring( " ");
- pushstring( " Basic Controls:");
- pushstring( " Ctl + Q: Move channel selector backward");
- pushstring( " Ctl + W: Move channel selector forward");
- pushstring( " Page Up / Down: Scroll through chat history");
- pushstring( " Ctl + Home: Scroll to the beginning of the chat log");
- pushstring( " Ctl + End: Scroll to the end of the chat log");
- pushstring( " Ctl + Page Up / Down: Scroll through user list");
- pushstring( " F1: Show this info");
- pushstring( " ");
- pushstring( "----------------------------------------------------------");
- drawbuffer();
- lastnick[curroom][0] = 0;
- } break;
- case 3: exit(3); break;
- case K_ENTER:
- {
- if( input[0] == 0 ) continue;
- //pushstring( rooms[curroom] );
- if( (input[0] != '/' || (input[1] == '/' && input[0] == '/') ) && curroom != 0 )
- {
- if( input[0] == '/'){
- pushstringnick( input+1, globalnick );
- sendMsg( globalsock, "PRIVMSG %s :%s", rooms[curroom], input+1 );
- }
- else
- {
- pushstringnick( input, globalnick );
- sendMsg( globalsock, "PRIVMSG %s :%s", rooms[curroom], input );
- }
- }
- else if( input[0] == '/' && input[1] != '/' )
- {
- sendMsg( globalsock, "%s", input+1 );
- }
- pos = 0;
- input[0] = 0;
- //while( drawing == true ){};
- //draw = false;
- drawbuffer();
- gotoxy( 0, SCREENHIG-1 );
- printf( " ");
- gotoxy( 0, SCREENHIG-1 );
- } break;
- case 17: if( curroom > 0 ){ curroom --; newmsg[curroom] = false; drawbuffer(); updaterooms(); updateusers();}break;
- case 23: if( curroom < roomtotal ){ curroom++; newmsg[curroom] = false; drawbuffer(); updaterooms(); updateusers();}break;
- default: if( t >= 0x20 && t < 0x80 ){
- int a = strlen( input );
- if( a > 998 )
- a = 998;
- input[999] = 0;
- for( int i = a+1; i > pos; input[i] = input[--i]);
- input[ pos ] = t;
- //savexy();
- //printf( "%s ", input + pos );
- //returntosaved();
- movecursorforward( 1 );
- pos++;
- } break;
- }
- change = bufpos[curroom] - bufprev;
- if( pos > 998 ) pos = 998;
- if( pos - scroll < 1 ) {scroll += (pos-scroll-1); gotoxy( pos-scroll, SCREENHIG-1 );}
- if( pos - scroll > 78 ) {scroll += (pos-scroll-78); gotoxy( pos-scroll, SCREENHIG-1 );}
- if( scroll < 0 ) {scroll = 0; gotoxy( 0, SCREENHIG-1 ); }
- savexy();
- gotoxy( 0, SCREENHIG-1 );
- char y = (input+scroll)[79];
- (input+scroll)[79] = 0;
- printf( "%s ", input+scroll );
- (input+scroll)[79] = y;
- returntosaved();
- /*if( bufpos[curroom] != bufprev )
- {
- moremoove += bufpos[curroom] - bufprev;
- }
- else
- moremoove = 0;*/
- change2 = change;
- bufprev = bufpos[curroom];
- }
- keyqueuewriting = false;
- while( msgqueuewriting ){}
- msgqueuewriting = true;
- while( msgqueue.size() > 0 )
- {
- shouldsleep = false;
- char* recvbuf = msgqueue.front();
- msgqueue.pop_front();
- if( recvbuf == 0 )
- {
- pushstring("");
- pushstring("");
- pushstring( "Connection Closed");
- pushstring("");
- pushstring("");
- drawbuffer();
- Sleep(2000);
- exit(0);
- }
- if( recvbuf[0] == 0 ) { continue;}
- int g;
- for( g = 0; recvbuf[g] != '\r' && recvbuf[g] != 0; g ++);
- recvbuf[g] = 0;
- if( recvbuf[0] != ':' )
- {
- recvbuf[1] = 'O';
- sendMsg( sock, "%s", recvbuf );
- continue;
- }
- char* recvbuf2 = recvbuf;//[2000];
- //memcpy( recvbuf2, recvbuf, 2000 );
- char* nick = recvbuf+1;
- char* user = 0, * host = 0, * msg, *argsw[32], *args[32];
- int argc = 0;
- int t = 0;
- bool special = false;
- for( int i = 0; recvbuf[i] != 0; i ++, t++ )
- {
- if( recvbuf[i] == '!' )
- {
- recvbuf[i] = 0;
- user = recvbuf+1+i;
- }
- if( recvbuf[i] == '@' )
- {
- recvbuf[i] = 0;
- host = recvbuf+1+i;
- }
- if( recvbuf[i] == ' ' )
- {
- if (host == 0 )
- special = true;
- recvbuf[i] = 0;
- msg = recvbuf+1+i;
- break;
- }
- }
- t+=2;
- bool coloned = false;
- for( int i = 0; msg[i] != 0; i ++, t++ ){
- if( msg[i] == ' ' ){
- msg[i] = 0;
- args[0] = msg+1+i;
- argsw[0] = recvbuf2+t;
- if( *(msg+1+i) == ':' )
- {
- args[0]++;
- argsw[0]++;
- argc++;
- coloned = true;
- break;
- }
- break;
- }
- }
- t++;
- if( !coloned )
- {
- for( int i = 0; args[0][i] != 0; i ++, t++ ){
- if( args[0][i] == ' ' ){
- argc++;
- args[argc] = args[0]+1+i;
- args[0][i] = 0;
- argsw[argc] = recvbuf2+t;
- if( *(args[0]+1+i) == ':' )
- {
- args[argc]++;
- argsw[argc]++;
- break;
- }
- }
- }
- argc++;
- }
- /*char aa[2000];
- if( argc >= 3 )
- sprintf( aa, "*** msg = %s; argc = %i; args[0] = %s; args[1] = %s; args[2] = %s; args[3] = %s; args[4] = %s;", msg, argc,args[0], args[1],args[2],args[3],args[4] );
- else if( argc > 2 )
- sprintf( aa, "*** msg = %s; argc = %i; args[0] = %s; args[1] = %s; args[2] = %s;", msg, argc,args[0], args[1],args[2] );
- else if( argc > 1 )
- sprintf( aa, "*** msg = %s; argc = %i; args[0] = %s; args[1] = %s;", msg, argc,args[0], args[1] );
- else if( argc > 0 )
- sprintf( aa, "*** msg = %s; argc = %i; args[0] = %s;", msg, argc,args[0] );
- else sprintf( aa, "*** msg = %s; argc = %i;", msg, argc );
- pushstring( aa );*/
- if( (strcmp( "042", msg ) == 0 ||
- strcmp( "375", msg ) == 0 ||
- strcmp( "372", msg ) == 0 ||
- strcmp( "376", msg ) == 0 ||
- //strcmp( "352", msg ) == 0 ||
- strcmp( "251", msg ) == 0 ||
- strcmp( "252", msg ) == 0 ||
- strcmp( "254", msg ) == 0 ||
- strcmp( "255", msg ) == 0 ||
- strcmp( "265", msg ) == 0 ||
- strcmp( "266", msg ) == 0 ||
- //strcmp( "PRIVMSG", msg ) == 0 ||
- strcmp( "NOTICE", msg ) == 0 ) && argc == 2 )
- {
- pushstringnick( args[1] , nick );
- }
- if( (strcmp( "474", msg ) == 0 && argc == 3 ) )
- pushstringnick( args[2] , nick );
- if( strcmp( "JOIN", msg ) == 0 && strcmp( nick, globalnick ) == 0 && argc == 1 )
- {
- strcpy( rooms[++roomtotal], args[0] );
- curroom = roomtotal;
- //savexy();
- meclear();
- //returntosaved();
- //for( int i = 0; i < 70*38; buffer[curroom][i++] = ' ' );
- drawbuffer();
- updaterooms();
- sendMsg( sock, "NAMES %s", args[0] );
- }
- else if( strcmp( "JOIN", msg ) == 0 && argc == 1 )
- {
- for( i = 1; i <= roomtotal; i ++ )
- {
- if( strcmp( rooms[i], args[0] ) == 0 )
- {
- char b[1000];
- sprintf( b, "* %s has joined %s *", nick, args[0] );
- int bc = curroom;
- curroom = i;
- pushstring( b );
- curroom = bc;
- char* a = (char*) malloc(200);
- a[0] = ' ';
- strcpy( a+1, nick );
- users[i].push_back( a );
- updateusers();
- }
- }
- }
- if( strcmp( "PART", msg ) == 0 && strcmp( nick, globalnick ) == 0 && argc == 1 )
- {
- for( i = 1; i <= roomtotal; i ++ )
- {
- if( strcmp( rooms[i], args[0] ) == 0 )
- {
- remroom(i);
- if( curroom > roomtotal ) curroom--;
- }
- }
- }
- else if( strcmp( "PART", msg ) == 0 && (argc == 1 || argc == 2) )
- {
- for( i = 1; i <= roomtotal; i ++ )
- {
- if( strcmp( rooms[i], args[0] ) == 0 )
- {
- for( int k = 0; k < users[i].size(); k ++ )
- {
- if( strcmp( nick, users[i][k]+1) == 0)
- {
- char a[2000];
- sprintf( a, "* %s has left %s %s%s%s*", nick, args[0], argc==2?"(":"",argc==2?args[1]:"",argc==2?") ":"" );
- int b = curroom;
- curroom = i;
- pushstring( a );
- curroom = b;
- free(users[i][k]);
- users[i].erase(users[i].begin()+k);
- //users[i].pop_back();
- updateusers();
- }
- }
- break;
- }
- }
- }
- if( strcmp( "KICK", msg ) == 0 && (argc == 2 || argc == 3) )
- {
- for( i = 1; i <= roomtotal; i ++ )
- {
- if( strcmp( rooms[i], args[0] ) == 0 )
- {
- for( int k = 0; k < users[i].size(); k ++ )
- {
- if( strcmp( args[1], users[i][k]+1) == 0)
- {
- char a[2000];
- sprintf( a, "* %s has kicked %s %s%s%s*", nick, args[1], argc==3?"(":"",argc==3?args[2]:"",argc==3?") ":"" );
- int b = curroom;
- curroom = i;
- pushstring( a );
- curroom = b;
- if( strcmp( args[1], globalnick ) == 0 )
- {
- remroom(i);
- char aaa[1000];
- sprintf( aaa, "* You are no longer in %s *", args[0] );
- pushstring(aaa);
- break;
- }
- free(users[i][k]);
- users[i].erase(users[i].begin()+k);
- //users[i].pop_back();
- updateusers();
- }
- }
- break;
- }
- }
- }
- if( strcmp( "MODE", msg ) == 0 && (argc > 2) )
- {
- int modetype = 0;
- int modetrack = 0;
- for( i = 1; i <= roomtotal; i ++ )
- {
- if( strcmp( rooms[i], args[0] ) == 0 )
- {
- for( int j = 0; j < argc - 1 && args[1][modetrack] != 0; j ++, modetrack ++ )
- {
- while( args[1][modetrack] == '+' || args[1][modetrack] == '-' ){
- modetype = 0;
- if( args[1][modetrack] == '-' ) modetype = 1;
- modetrack++;}
- //for( int k = 0; k < users[i].size(); k ++ )
- //{
- //if( strcmp( args[j+2], users[i][k]+1) == 0)
- //{
- char a[2000];
- sprintf( a, "* %s sets mode %c%c on %s *", nick, modetype == 0 ? '+' : '-', args[1][modetrack], args[j+2] );
- int b = curroom;
- curroom = i;
- pushstring( a );
- curroom = b;
- /*char t = ' ';
- switch( args[1][modetrack] ){
- case 'v': }
- pushstring( a );
- curroom = i;
- free(users[i][k]);
- users[i].erase(users[i].begin()+k);*/
- //users[i].pop_back();
- //updateusers();
- sendMsg( sock, "whois %s", args[j+2] );
- //}
- //}
- }
- break;
- }
- }
- }
- if( strcmp( "QUIT", msg ) == 0 && (argc == 1 || argc == 0) )
- {
- for( i = 1; i <= roomtotal; i ++ )
- {
- for( int k = 0; k < users[i].size(); k ++ )
- {
- if( strcmp( nick, users[i][k]+1) == 0)
- {
- char a[2000];
- sprintf( a, "* %s has quit %s%s%s*", nick, argc==1?"(":"",argc==1?args[0]:"",argc==1?") ":"" );
- int aa = curroom;
- curroom = i;
- pushstring( a );
- curroom = aa;
- free(users[i][k]);
- users[i].erase(users[i].begin()+k);
- //users[i].pop_back();
- updateusers();
- }
- }
- }
- }
- if( (strcmp( "319", msg ) == 0 && argc == 3 ) )
- {
- int i;
- char* tmp = args[2];
- for( int k = 0; args[2][k] != 0; k++ )
- {
- if( args[2][k] == ' ' )
- {
- args[2][k] = 0;
- for( i = 1; i <= roomtotal; i ++ )
- {
- bool c = false;
- if( tmp[0] != '#' ) {tmp ++; c = true; }
- if( strcmp( tmp, rooms[i]) == 0 )
- {
- for( int j = 0; j < users[i].size(); j++ )
- {
- if( strcmp( users[i][j]+1, args[1] ) == 0 )
- {
- users[i][j][0] = ' ';
- if( c )
- users[i][j][0] = tmp[-1];
- }
- }
- }
- }
- tmp = args[2]+k+1;
- }
- }
- updateusers();
- }
- if( (strcmp( "353", msg ) == 0 && argc == 4 ) )
- {
- int i;
- for( i = 1; i <= roomtotal; i ++ )
- {
- if( strcmp( rooms[i], args[2] ) == 0 )
- {
- char* tmp = args[3];
- for( int k = 0; args[3][k-1] != 0 || k == 0; k++ )
- {
- if( args[3][k] == ' ' || args[3][k] == 0 )
- {
- args[3][k] = 0;
- char* a = (char*) malloc( 200 );
- if( tmp[0] != '~' && tmp[0] != '@' && tmp[0] != '%' && tmp[0] != '+' && tmp[0] != '&' )
- {
- a[0] = ' ';
- strcpy( a+1, tmp );
- }
- else
- {
- a[0] = tmp[0];
- int g = 0;
- while( tmp[g] == '~' || tmp[g] == '@' || tmp[g] == '%' || tmp[g] == '+' || tmp[g] == '&' ) g++;
- strcpy( a+1, tmp+g );
- }
- printf( "%s ", a );
- bool broken = false;
- for( int p = 0; p < users[i].size(); p++)
- {
- if( strcmp( users[i][p]+1, a+1 ) == 0 )
- {
- broken = true;
- users[i][p][0] = a[0];
- free( a );
- break;
- }
- }
- if( !broken )
- users[i].push_back( a );
- //printf( "%s", a );
- tmp = args[3] + k + 1;
- }
- }
- }
- }
- updateusers();
- }
- if( strcmp( "NICK", msg ) == 0 &&
- strcmp( nick, globalnick ) == 0
- && argc == 1 )
- {
- strcpy( globalnick, args[0] );
- char a[1000];
- sprintf( a, "* You are now known as %s *", globalnick );
- pushstring( a );
- }
- else if( strcmp( "NICK", msg ) == 0 && argc == 1 )
- {
- for( int i = 0; i <= roomtotal; i ++ )
- {
- for( int j = 0; j < users[i].size(); j ++ )
- {
- if( strcmp( users[i][j]+1, nick ) == 0 )
- {
- char a[1000];
- sprintf( a, "* %s is now known as %s *", nick, args[0] );
- int k = curroom;
- curroom = i;
- pushstring( a );
- curroom = k;
- strcpy( users[i][j]+1, args[0] );
- break;
- }
- }
- }
- updateusers();
- }
- if( strcmp( "PRIVMSG", msg ) == 0
- && argc == 2 )
- {
- if( args[1][0] == 1 )
- {
- //sendMsg( sock, "PRIVMSG %s :%cCTCP %c")
- }
- if( args[0][0] == '#' ){
- for( int i = 1; i <= roomtotal; i ++ )
- {
- if( strcmp( rooms[i], args[0] ) == 0 )
- {
- if( args[1][0] == 1 )
- {
- if( args[1][1] == 'A' && args[1][2] == 'C' && args[1][3] == 'T' && args[1][4] == 'I' && args[1][5] == 'O' && args[1][6] == 'N' && args[1][7] == ' ')
- {
- char b[1000];
- sprintf( b, "* %s %s *", nick, args[1] + 8 );
- int a = curroom;
- curroom = i;
- pushstringnick( b, nick );
- curroom = a;
- }
- }
- else
- {
- int a = curroom;
- curroom = i;
- pushstringnick( args[1], nick );
- curroom = a;
- }
- if( curroom != i )
- {
- newmsg[i] = true;
- updaterooms();
- }
- }
- }
- }
- else
- {
- char a[200];
- sprintf( a, "%s [PRIVATE]", nick );
- pushstringnick( args[1], a );
- }
- }
- drawbuffer();
- free( recvbuf );
- }
- msgqueuewriting = false;
- //if( recvbuf[0] == ':' )
- }
- }
- void inputloop( void* a )
- {
- int scroll = 0;
- char input[1000] = {0};
- int t;
- int pos = 0;
- int change = 0;
- int change2 = change;
- int bufprev = bufpos[curroom];
- int moremoove = 0;
- while(1){
- gotoxy( 0, SCREENHIG-1 );
- printf( " ");
- gotoxy( 0, SCREENHIG-1 );
- bool entered = false;
- while( !entered ){
- t = getch();
- if( t == 224 || t == 0 )
- {
- t += getch() << 8;
- }
- switch( t )
- {
- case K_BACKSPACE:
- if( pos > 0 ){
- for( int i = pos-1; input[i] != 0; input[i] = input[++i] );
- movecursorback( 1 );
- pos -= 1;
- } break;
- case K_LEFT: if( pos > 0 ){ movecursorback( 1 ); pos -= 1; } break;
- case K_RIGHT: if( input[pos] != 0 ) {movecursorforward( 1 ); pos += 1;} break;
- case K_HOME: { gotoxy(0,39); pos = 0; } break;
- case K_END: { int a = strlen( input ); /*gotoxy( 79,39 );*/ pos = a;} break;
- case K_PGUP: { if( bufpos[curroom] < (BUFFERLINES-TFIELDH)-4 ) bufpos[curroom] += 5; else bufpos[curroom] = BUFFERLINES-TFIELDH; drawbuffer();savexy(); gotoxy(0,2); printf( "Line %i/%i ",bufpos[curroom], BUFFERLINES-TFIELDH ); returntosaved();} break;
- case K_PGDWN: { if( bufpos[curroom] > 4 ) bufpos[curroom] -= 5; else bufpos[curroom] = 0; drawbuffer(); savexy(); gotoxy(0,2); printf( "Line %i/%i ",bufpos[curroom], BUFFERLINES-TFIELDH ); returntosaved();} break;
- case 3: exit(3); break;
- case K_ENTER: entered = true; break;
- case 17: if( curroom > 0 ){ curroom --; drawbuffer(); updaterooms(); updateusers();}break;
- case 23: if( curroom < roomtotal ){ curroom++; drawbuffer(); updaterooms(); updateusers();}break;
- default: if( t >= 0x20 && t < 0x80 || t == 7 ){
- int a = strlen( input );
- if( a > 998 )
- a = 998;
- input[999] = 0;
- for( int i = a+1; i > pos; input[i] = input[--i]);
- input[ pos ] = t;
- //savexy();
- //printf( "%s ", input + pos );
- //returntosaved();
- movecursorforward( 1 );
- pos++;
- } break;
- }
- change = bufpos[curroom] - bufprev;
- if( pos > 998 ) pos = 998;
- if( pos - scroll < 1 ) {scroll += (pos-scroll-1); gotoxy( pos-scroll, 39 );}
- if( pos - scroll > 78 ) {scroll += (pos-scroll-78); gotoxy( pos-scroll, 39 );}
- if( scroll < 0 ) {scroll = 0; gotoxy( 0, 39 ); }
- savexy();
- gotoxy( 0, 39 );
- printf( "%s ", input+scroll );
- returntosaved();
- /*if( bufpos[curroom] != bufprev )
- {
- moremoove += bufpos[curroom] - bufprev;
- }
- else
- moremoove = 0;*/
- change2 = change;
- bufprev = bufpos[curroom];
- }
- //while( draw == true ){};
- //draw = true;
- if( input[0] == 0 ) continue;
- //pushstring( rooms[curroom] );
- if( (input[0] != '/' || (input[1] == '/' && input[0] == '/') ) && curroom != 0 )
- {
- if( input[0] == '/'){
- pushstringnick( input+1, globalnick );
- sendMsg( globalsock, "PRIVMSG %s :%s", rooms[curroom], input+1 );
- }
- else
- {
- pushstringnick( input, globalnick );
- sendMsg( globalsock, "PRIVMSG %s :%s", rooms[curroom], input );
- }
- }
- else if( input[0] == '/' && input[1] != '/' )
- {
- sendMsg( globalsock, "%s", input+1 );
- }
- pos = 0;
- input[0] = 0;
- //while( drawing == true ){};
- //draw = false;
- drawbuffer();
- }
- }
- bool keyqueuewriting = false;
- std::deque<int> keyqueue;
- void grabkey( void* in )
- {
- int t;
- while( true ){
- t = getch();
- if( t == 224 || t == 0 )
- {
- t += getch() << 8;
- }
- while( keyqueuewriting ){}
- keyqueuewriting = true;
- keyqueue.push_back( t );
- keyqueuewriting = false;
- }
- }
- std::deque<char*> msgqueue;
- bool msgqueuewriting;
- void grabmsg( void* in )
- {
- SOCKET sock = *( (SOCKET*) in );
- char* recvbuf;
- while( true ){
- recvbuf = (char*) malloc( 1000 );
- if( recvbuf == 0 ) continue;
- char* a = getMessage(sock, recvbuf);
- if( a == 0 ){
- while( msgqueuewriting ){}
- msgqueuewriting = true;
- msgqueue.push_back( 0 );
- msgqueuewriting = false;}
- if( recvbuf[0] == 0 ) { free(recvbuf); continue;}
- while( msgqueuewriting ){}
- msgqueuewriting = true;
- msgqueue.push_back( recvbuf );
- msgqueuewriting = false;
- }
- }
- /////////////////////////// network.h \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #pragma once
- #include "includes.h"
- #ifdef _WIN32
- #include <windows.h>
- #include <winsock2.h>
- #include <ws2tcpip.h>
- #else
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netdb.h>
- #include <unistd.h>
- #include <termios.h>
- #include <pthread.h>
- #include <errno.h>
- #include <signal.h>
- #define SOCKET int
- #endif
- void senda( SOCKET sock, char* str );
- unsigned long resolveAddr( char* addr, int ind = -1 );
- SOCKET connectTCP( unsigned long ip, short int port );
- char* getMessage( SOCKET recvOn, char* buffer );
- void sendMsg( SOCKET tosend, const char* format, ... );
- /////////////////////////// network.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #include "network.h"
- void senda( SOCKET sock, char* str )
- {
- send( sock, str, strlen( str ), 0 );
- }
- unsigned long resolveAddr( char* addr, int ind )
- {
- hostent* host = gethostbyname( addr );
- if( host == 0 )
- {
- printf( "Failed to lookup %s.", addr );
- return 0;
- }
- if( ind > host->h_length ) return -1;
- unsigned long myhost = *((unsigned long*) host->h_addr);
- return myhost;
- }
- SOCKET connectTCP( unsigned long ip, short int port )
- {
- SOCKET ret;
- ret = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if( ret < 0 ) return 0;
- sockaddr_in clientService;
- clientService.sin_family = AF_INET;
- clientService.sin_addr.s_addr = ip;
- clientService.sin_port = htons( port );
- int result = connect( ret, (sockaddr*) &clientService, sizeof(clientService));
- if( result < 0 ) return 0;
- return ret;
- }
- char* getMessage( SOCKET recvOn, char* buffer )
- {
- char tmp = 0; int pos = 0; int val = 1;
- val = recv( recvOn, &tmp, 1, 0 );
- if( val == 0 ) {
- buffer[0] = 0;
- return (char*)1;
- }
- if( val < 0 ) {
- buffer[0] = 0;
- return 0;
- }
- while( tmp != '\n' && val > 0 ) {
- buffer[pos++] = tmp;
- val = recv( recvOn, &tmp, 1, 0 );
- if( val <= 0 ) {
- buffer[pos] = 0;
- return buffer;
- }
- }
- buffer[pos++] = 0;
- return buffer;
- }
- void sendMsg( SOCKET tosend, const char* format, ... )
- {
- char sendBuf[2000];
- va_list strt;
- va_start( strt, format );
- vsprintf( sendBuf, format, strt );
- va_end( strt );
- senda( tosend, sendBuf );
- senda( tosend, "\r\n" );
- }
- /////////////////////////// systemcalls.h \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #pragma once
- #include "includes.h"
- #ifdef _WIN32
- #include <process.h>
- unsigned long CURRENT_TIME();
- uintptr_t callThread( void(*func)(void*), void* args );
- #else
- int callThread( void(*func)(void*), void* args );
- #endif
- /////////////////////////// systemcalls.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #include "systemcalls.h"
- #ifdef _WIN32
- unsigned long CURRENT_TIME(){
- SYSTEMTIME t; GetSystemTime(&t); return t.wMilliseconds + t.wSecond * 1000 + t.wMinute * 60000 + t.wHour * 3600000 + t.wDay * 86400000 + t.wMonth * 2678400000;
- }
- uintptr_t callThread( void(*func)(void*), void* args )
- {
- return _beginthread( func, 0, args );
- }
- #else
- int callThread( void(*func)(void*), void* args )
- {
- pthread_t iThreadId;
- return pthread_create(&iThreadId, NULL, (void*(*)(void*))func, args);
- }
- #endif
- /////////////////////////// terminalcontrol.h \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #pragma once
- #include "includes.h"
- #ifdef _WIN32
- extern int cursorPosX;
- extern int cursorPosY;
- extern bool saved;
- #include<wincon.h>
- #endif
- void gotoxy( short x, short y );
- void savexy();
- void returntosaved();
- void invert( );
- void movecursorback( int a );
- void movecursorforward( int a );
- /////////////////////////// terminalcontrol.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #include "terminalcontrol.h"
- #ifdef _WIN32
- int cursorPosX=0;
- int cursorPosY=0;
- bool saved = false;
- void gotoxy( short x, short y )
- {
- HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;
- COORD position = { x, y } ;
- SetConsoleCursorPosition( hStdout, position ) ;
- }
- void savexy()
- {
- HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;
- CONSOLE_SCREEN_BUFFER_INFO buff;
- GetConsoleScreenBufferInfo( hStdout, &buff );
- cursorPosX=buff.dwCursorPosition.X;
- cursorPosY=buff.dwCursorPosition.Y;
- saved = true;
- }
- void returntosaved()
- {
- HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;
- COORD position = { cursorPosX, cursorPosY } ;
- SetConsoleCursorPosition( hStdout, position ) ;
- saved = false;
- }
- void movecursorback( int a )
- {
- HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;
- CONSOLE_SCREEN_BUFFER_INFO buff;
- GetConsoleScreenBufferInfo( hStdout, &buff );
- gotoxy( max( buff.dwCursorPosition.X - a, 0 ), buff.dwCursorPosition.Y );
- }
- void movecursorforward( int a )
- {
- HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;
- CONSOLE_SCREEN_BUFFER_INFO buff;
- GetConsoleScreenBufferInfo( hStdout, &buff );
- gotoxy( max( buff.dwCursorPosition.X + a, 0 ), buff.dwCursorPosition.Y );
- }
- /*void invert( )
- {
- HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE) ;
- SetConsoleTextAttribute( hStdout, );
- }*/
- #else
- void gotoxy( short x, short y )
- {
- //printf( "\027[%i;%iH", x, y );
- move(y, x);
- refresh();
- }
- void savexy()
- {
- printf( "\027[s" );
- }
- void returntosaved()
- {
- printf( "\027[8" );
- }
- /*void invert( )
- {
- printf( "\x1B[7m" );
- }*/
- void movecursorback( int a )
- {
- printf( "\027[%iD", a );
- }
- void movecursorforward( int a )
- {
- printf( "\027[%iC", a );
- }
- #endif
- /////////////////////////// terminaldisplay.h \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #pragma once
- #include "includes.h"
- #include "terminalcontrol.h"
- #include "main.h"
- #define SCREENHIG 48
- #define TFIELDW 60
- #define TFIELDH (SCREENHIG-4)
- #define BUFFERLINES 500
- #define BUFS (TFIELDW*BUFFERLINES)
- extern char buffer[64][BUFS];
- extern bool draw;
- extern int bufpos[64];
- extern int userpos[64];
- extern bool newmsg[64];
- extern char lastnick[64][100];
- void meclear( );
- void pushstring( const char* str );
- void pushstringnick( const char* str, const char* nick );
- void drawbuffer( );
- void updaterooms();
- void updateusers();
- /////////////////////////// terminaldisplay.cpp \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #include "terminaldisplay.h"
- char buffer[64][BUFS];
- char lastnick[64][100]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- int bufpos[64]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- int userpos[64]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- bool newmsg[64]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- bool draw = false;
- int scroll = 0;
- void meclear( )
- {
- //savexy();
- int i;
- //for( i = 0; i < 70*38; buffer[curroom][i++] = ' ' );
- gotoxy( 0, 0 );
- for( i = 0; i < 80*SCREENHIG; i ++ )
- {
- fputc( ' ', stdout );
- }
- for( i = 1; i < SCREENHIG -2; i++ )
- {
- gotoxy( TFIELDW+1, i );
- fputc( 0xBA, stdout );
- }
- gotoxy( 0, 1 );
- for( int i = 0; i < 80; i ++ ) fputc( 0xCD, stdout );
- gotoxy( TFIELDW+1, 1 );
- fputc( 0xCB, stdout );
- gotoxy( 0, SCREENHIG - 2);
- for( int i = 0; i < 80; i ++ ) fputc( 0xCD, stdout );
- gotoxy( TFIELDW+1, SCREENHIG-2 );
- fputc( 0xCA, stdout );
- updaterooms();
- gotoxy(0, SCREENHIG-1);
- //returntosaved();
- }
- void updateusers()
- {
- savexy();
- bool listsorted = (users[curroom].size() <= 1);
- int seeker1 = 0;
- int seeker2 = 1;
- char alpha[] = "~&@%+ ";
- char buf1[1000];
- char buf2[1000];
- char buf3[1000];
- /*while( !listsorted )
- {
- bool swap = false;
- strcpy( buf1, users[curroom][seeker1] );
- strcpy( buf2, users[curroom][seeker2] );
- int pos1=1000, pos2=1000;
- for( int i = 0; alpha[i] != 0; i ++ ){if(buf1[0] == alpha[i])pos1 = i; if(buf2[0] == alpha[i]) pos2 = i;}
- if( pos1 > pos2 )
- {
- strcpy( buf3, users[curroom][seeker1] );
- strcpy( users[curroom][seeker1], users[curroom][seeker2] );
- strcpy( users[curroom][seeker2], buf3 );
- seeker1 = 0; seeker2 = 1;
- continue;
- }
- if( pos1 == pos2 ){
- strupr( buf1 );
- strupr( buf2 );
- int i;
- for( i = 1; buf1[i] != 0 && buf2[i] != 0; i ++ )
- {
- if( buf1[i] < buf2[i] ) break;
- if( buf1[i] > buf2[i] )
- {
- strcpy( buf3, users[curroom][seeker1] );
- strcpy( users[curroom][seeker1], users[curroom][seeker2] );
- strcpy( users[curroom][seeker2], buf3 );
- swap = true;
- //seeker1 = 0; seeker2 = 1;
- break;
- }
- }
- }
- //if( swap ) continue;
- /*if( buf2[i] == 0 && buf1[i] != 0 && !swap )
- {
- strcpy( buf3, users[curroom][seeker1] );
- strcpy( users[curroom][seeker1], users[curroom][seeker2] );
- strcpy( users[curroom][seeker2], buf3 );
- seeker1 = 0; seeker2 = 1;
- }*//*
- seeker2++;
- if( seeker2 >= users[curroom].size() )
- {
- seeker1++;
- seeker2 = seeker1+1;
- }
- if( seeker2 >= users[curroom].size() )
- {
- listsorted = true;
- }
- }*/
- for( int i = 0; i < TFIELDH; i++ )
- {
- gotoxy( TFIELDW+2, i+2 );
- printf( " " );
- }
- if( userpos[curroom] < 0 ) userpos[curroom] = 0;
- for( int i = 0; i < (users[curroom].size()-userpos[curroom]) && i < TFIELDH; i++ )
- {
- gotoxy( TFIELDW+2, i+2 );
- printf( " " );
- gotoxy( TFIELDW+2, i+2 );
- //printf( "i=%i vs %i", i , (int)(users[curroom].size())-userpos[curroom] );
- if( i >= (int)(users[curroom].size())-userpos[curroom] ) break;
- if( users[curroom][i+userpos[curroom]] == 0 ) continue;
- printf( "%s", users[curroom][i+userpos[curroom]] );
- }
- returntosaved();
- }
- void pushstring( const char* str )
- {
- //while( draw ){}
- //draw = true;
- int len = strlen( str );
- int offset = ((len/TFIELDW+1)*TFIELDW<BUFS?(len/TFIELDW+1)*TFIELDW:BUFS );
- int i, k;
- for( i = 0; i < BUFS-offset; buffer[curroom][i]=buffer[curroom][(i++)+offset] );
- for( k = 0; str[k] != 0 && i < BUFS; ){ if(str[k++]>=0x20) buffer[curroom][i++] = str[k-1]; }
- for( ; i < BUFS; buffer[curroom][i++] = ' ' );
- //printf( "\n\nSTRING: %s\n\n ", buffer[curroom] );
- //draw = false;
- }
- void pushstringnick( const char* str, const char* nickky )
- {
- if( str[0] == 0 ) return;
- if( lastnick[curroom] == 0 || strcmp( nickky, lastnick[curroom] ) != 0 )
- {
- char b[200];
- //printf( nick );
- sprintf( b, "%s - ", nickky );
- //printf( nickky );
- pushstring( b );
- strcpy( lastnick[curroom], nickky );
- }
- char a[2000];
- sprintf( a, " %s", str );
- pushstring( a );
- }
- void drawbuffer( )
- {
- //while( draw ){}
- //draw = true;
- savexy();
- //while( draw ){}
- //draw = true;
- int i, j, t = BUFS-TFIELDW*(TFIELDH+bufpos[curroom]);
- for( j = 0; j < TFIELDH; j ++)
- {
- gotoxy( 0, 2+j );
- char a = buffer[curroom][t+TFIELDW*(j+1)];
- buffer[curroom][t+TFIELDW*(j+1)] = 0;
- printf( "%s", buffer[curroom]+(t+TFIELDW*j) );
- buffer[curroom][t+TFIELDW*(j+1)] = a;
- /*for( i = 0; i < TFIELDW; i ++ )
- {
- if( buffer[curroom][t] >= 0x20 )
- fputc( buffer[curroom][t], stdout );
- t++;
- }*/
- }
- returntosaved();
- //draw = false;
- //draw = false;
- }
- void updaterooms()
- {
- /*int poses[64];
- poses[0] = 0;
- printf( " Server|");
- int pos = 7;
- for( int i = 1; i < roomtotal; i ++ )
- {
- poses[i] = pos+1;
- pos += strlen( rooms[i] ) + 2;
- }*/
- char a[4000] = {0};
- char* b = a;
- b+=sprintf( b, 0==curroom?">":" ");
- b+=sprintf( b, "%s", "Server" );
- b+=sprintf( b, 0==curroom?"< - ":" - ");
- for( int i = 1; i <= roomtotal; i ++ )
- {
- b+=sprintf( b, i==curroom?">":(newmsg[i]?"~":" "));
- b+=sprintf( b, "%s", rooms[i]);
- b+=sprintf( b, i==curroom?"< - ":(newmsg[i]?"~ - ":" - "));
- if( i == curroom && (int)(b - a)-scroll > 80 )
- {
- scroll = (int)(b - a)-74;
- }
- if( i == curroom && (int)(b - a)-scroll < 0 )
- {
- scroll = (int)(b - a)-74 > 0?(int)(b - a)-74:0;
- }
- }
- b+=sprintf( b, " ");
- savexy();
- gotoxy(0, 0);
- a[scroll + 80] = 0;
- printf( "%s", a+scroll );
- returntosaved();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement