program pepsi;
{$APPTYPE CONSOLE}
uses
SysUtils, ScktComp;
type
TEvents = class
public
procedure ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientConnecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
end;
var
Events : TEvents;
input: String;
Client: TClientSocket;
{------------------------------------------------------------------------------}
procedure connect();
begin
if Client = nil then
begin
Client := TClientSocket.Create(nil);
// Client.ClientType := ctNonBlocking;
Client.OnConnect := Events.ClientConnect;
Client.OnConnecting := Events.ClientConnecting;
Client.OnDisconnect := Events.ClientDisconnect;
Client.OnError := Events.ClientError;
Client.OnRead := Events.ClientRead;
end;
Client.Host := '192.168.0.3';
Client.Port := 6667;
if Client.Active = false then
begin
Client.Active := true;
end
else
begin
writeln('already connected, disconnect first');
end;
end;
procedure disconnect();
begin
if client <> nil then
begin
if Client.Active = true then
begin
try
begin
client.Active := false;
end;
except
writeln('cannot disconnect');
end;
end
else
begin
writeln('not connected, connect first');
end;
end
else writeln('ahm, are u drunk?');
end;
procedure sendout(data: String);
begin
try
begin
Client.Socket.SendText(data +#13+#10);
end;
except
writeln('cannot send to host...');
end;
end;
function GetToken(Src: string; Index: integer; Delimiter: char): string;
var
I: integer;
J: integer;
Count: integer;
S: string;
begin
Result := '';
if Index = 0 then
begin
Result := Src;
Exit;
end
else
if Index < 0 then
begin
Index := -Index;
J := 1;
for I := 1 to Length(Src) do
begin
if Src[I] = Delimiter then
Inc(J);
if J >= Index then
Break;
end;
if J = 1 then
begin
Result := Src;
Exit;
end;
Result := Copy(Src, I + 1, Length(Src)); // MaxInt
Exit;
end;
S := Src;
I := 0;
Count := 1;
while (I <= (Index - 2)) do
begin
J := Pos(Delimiter, S);
if J = 0 then
Break;
Delete(S, 1, J);
Inc(I);
end;
for I := 1 to Length(Src) do
if Src[I] = Delimiter then
Inc(Count);
if Index > Count then
Exit;
J := Pos(Delimiter, S);
if J = 0 then
begin
J := Length(S);
Result := Copy(S, 1, J);
end
else
Result := Copy(S, 1, J - 1);
end;
{------------------------------------------------------------------------------}
procedure TEvents.ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
//OnConnect
writeln('connection established');
Client.Socket.SendText('NICK vogel');
Client.Socket.SendText('USER vogel
localhost '+ Client.Host +' :masta vogel');
{
client.write('NICK vogel' +#13+#10);
client.write('USER vogel
localhost '+ client.Host +' :masta vogel' +3+#10);
}
end;
procedure TEvents.ClientConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
//OnConnecting
writeln('connecting...');
end;
procedure TEvents.ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
//OnDisconnect
writeln('disconnected');
end;
procedure TEvents.ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
//OnError
writeln('Error Code: ' + inttostr(ErrorCode));
end;
procedure TEvents.ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
incoming: String;
begin
//OnRead
incoming := Socket.ReceiveText;
writeln(incoming);
{ping event reply}
if Copy(incoming,1,4) = 'PING' then
begin
sendout('PONG '+Copy(incoming,7,length(incoming)-6));
writeln('ping replied');
end;
end;
{------------------------------------------------------------------------------}
begin
{ TODO -oUser -cConsole Main : Insert code here }
{------------------------------------------------------------------------------}
{main code here}
writeln('Pepsi
IRC Service v0.1*');
{------------------------------------------------------------------------------}
{catch commands}
while (lowercase(input) <> '/quit') do
begin
readln(input);
if (lowercase(Copy(input,1,5)) = '/quit') then
begin
writeln('good bye');
end
else
if (lowercase(Copy(input,1,8)) = '/connect') then
begin
connect;
end
else
if (lowercase(copy(input,1,11)) = '/disconnect') then
begin
disconnect;
end
else
if (Copy(input,1,1) = '.') then
begin
if Copy(input,2,length(input)-1) <> '' then
begin
sendout(Copy(input,2,length(input)-1));
end
else
begin
writeln('Syntax: .<text>');
end;
end
else
begin
writeln('not a command');
end;
end;
end.