You can try to learn from this IRC bot I made:
scar Code:
program IRCBot;
Type
BufferedReader = Record
Buffer : String;
Pos, Len: Integer;
UseSocket: Boolean;
End;
Var
Line, nicke, host, command, channel, args : String;
Sock_Fd : Integer;
Reader : BufferedReader;
Const
IRCNickname = 'SCARBot';
BotChans = '#cazax';
Procedure DBug(S : String; T : Integer);
Begin
Case T Of
1: Writeln('- ' + S);
2: Writeln('=> ' + S);
3: Writeln('<= ' + S);
End;
End;
Procedure SendData(Buf : String);
Begin
DBug(Buf, 2);
SendConnectionData(Sock_Fd, Buf + #10 + #13);
end;
Procedure FillReaderBuffer(Var Reader : BufferedReader);
Var
Buf : String;
Begin
Try
ReadConnectionData(Sock_Fd, Buf);
Reader.Pos := 1;
Reader.Len:= Length(Buf);
Reader.Buffer:= Buf;
Except End;
End;
function Connect : Integer;
begin
Result := OpenConnection('irc.rizon.net', 6667, 15000);
if(Result < 0)then
begin
DBug('Error connecting', 1);
Exit;
end;
ClearReport;
SendData('USER ' + IRCNickname + ' 8 * :' + IRCNickname);
SendData('NICK ' + IRCNickname);
SendData('MODE ' + IRCNickname + ' +i');
SendData('MODE ' + IRCNickname + ' +E');
SendData('MODE ' + IRCNickname + ' +C');
SendData('MODE ' + IRCNickname + ' +I');
SendData('MODE ' + IRCNickname + ' +Q');
SendData('JOIN ' + botchans);
end;
function ReadNextSegment(var reader: BufferedReader; c1, c2: char): string;
var
f: Integer;
begin
repeat
for f := reader.pos to reader.len do
if (reader.buffer[f] = c1) or (reader.buffer[f] = c2) then
begin
Result:= Copy(reader.buffer, reader.pos, f - reader.pos);
reader.pos:= f + 1;
Exit;
end;
if (reader.usesocket) then
FillReaderBuffer(reader)
else
Break;
until(False);
Result:= #0;
end;
function ReadNextLine(var reader: BufferedReader): string;
var
line: string;
c: char;
begin
try
line:= ReadNextSegment(reader, #10, #13);
c := reader.buffer[reader.pos];
except
exit;
end;
if (c = #13) or (c = #10) then
reader.pos := reader.pos + 1;
Result := line;
end;
Procedure IRCWake;
{Var
S : String;}
Begin
SetTimeout(25, 'IRCWake');
Line := ReadNextLine(Reader);
DBug(Line, 3);
If Pos(':', Line) > 0 Then
{Begin
writeln('wohoo');
}If Pos('PRIVMSG', Line) > 0 Then{
Exit;
If Pos('Cazax', Line) > 0 Then}
SendData('PRIVMSG #cazax :hi');
//end;
End;
begin
DBug('IRCBot is starting...', 1);
Sock_fd := Connect;
if(Sock_fd < 0)then
begin
DBug('Failed to connect', 1);
Exit;
end;
Reader.UseSocket := True;
FillReaderBuffer(reader);
IRCWake;
While True Do
Wait(10);
end.
It's based on Harry's IRC thingy.