//////////////////////////////////////////////////////////////////////////////// // HexKey, Secks now plx // //////////////////////////////////////////////////////////////////////////////// {.include StringLib.scar} const TYPE_MODE = 1; // MODE event TYPE_NICK = 2; // NICK event TYPE_JOIN = 3; // JOIN event TYPE_PART = 4; // PART event TYPE_QUIT = 5; // QUIT event TYPE_TOPIC = 6; // TOPIC EVENT TYPE_PRIVMSG = 7; // PRIVMSG EVENT TYPE_NOTICE = 8; // NOTICE EVENT TYPE_CTCP = 9; // Is CTCP just PRIVMSG? I cbf'd to open my java lib. TYPE_DISCONNECT = 10; // We've been disconnected. TYPE_ERROR = 11; // There was some internal error. type IRCEvent = record id: Integer; serverMessageId: Integer; nick, host, name, content, recipient, target: String; end; type IRCConnection = record host, nick, name, login, fullname, linebuffer: String; sock, port: Integer; events: array of IRCEvent; end; procedure fireEvent(var con: IRCConnection; e: IRCEvent); var size: Integer; begin; size:= GetArrayLength(con.events); SetArrayLength(con.events, size + 1); con.events[size]:= e; end; procedure writeLine(var con: IRCConnection; line: String); var error: IRCEvent; begin; if(con.sock = -1) then begin error.id:= TYPE_ERROR; error.content:= 'Could not send line: Not connected to server'; fireEvent(con, error); end else SendConnectionData(con.sock, line + Chr(13) + Chr(10)); end; function connect(host: String; port: Integer; nick, name, login, fullname: String): IRCConnection; var error: IRCEvent; begin; Result.host:= host; Result.port:= port; Result.sock:= OpenConnection(host,port, 1000); if not (Result.sock = -1) then begin Result.nick:= nick; Result.name:= name; Result.login:= login; Result.fullname:= fullname; writeLine(Result, 'USER ' + name + ' ' + login + ' * :' + fullname); writeLine(Result, 'NICK ' + nick); end else begin error.id:= TYPE_ERROR; error.content:= 'Could not connect to ' + host + ':' + IntToStr(port); fireEvent(Result, error); end; end; procedure handleCrap(con: IRCConnection); var s: String; event: IRCEvent; idx, x : Integer; lines: Array of String; begin if ReadConnectionData(con.sock, s) then begin con.linebuffer:= con.linebuffer + s; idx:= lastIndexOf(Chr(13) + Chr(10), con.linebuffer); if idx > -1 then begin s:= copy(con.linebuffer, 0, idx); con.linebuffer:= copy(con.linebuffer, idx, 2); lines:= split(Chr(13) + Chr(10), s); for x:= 0 to GetArrayLength(lines) - 1 do writeln('Line:' + lines[x]); end; end else begin con.sock:= -1; event.id:= TYPE_ERROR; event.content:= 'Could not read from ' + con.host + ':' + IntToStr(con.port); fireEvent(con, event); end; end; // Test library var con: IRCConnection; begin con:= connect('irc.freenode.net', 6667, 'SCARIRC', 'Imkul', 'lolr', 'Made with love <3'); if(GetArrayLength(con.events) > 0) then begin writeln(con.events[0].content); terminateScript; end; writeLine(con, 'JOIN #lungexpress'); while con.sock > -1 do handleCrap(con); end.