mirror of
https://github.com/vishapoberon/vipak.git
synced 2026-04-05 20:42:26 +00:00
changes
This commit is contained in:
parent
340de3824b
commit
4c73f414b0
3 changed files with 155 additions and 61 deletions
162
IRC.Mod
162
IRC.Mod
|
|
@ -3,45 +3,99 @@ IMPORT Internet, Out, Strings := ooc2Strings, types;
|
||||||
|
|
||||||
CONST
|
CONST
|
||||||
msgLen* = 512; (* message length not more than 512 characters *)
|
msgLen* = 512; (* message length not more than 512 characters *)
|
||||||
ping* = "PING";
|
cmdPing* = "PING";
|
||||||
pong* = "PONG";
|
cmdPong* = "PONG";
|
||||||
zzo* = "001";
|
zzo* = "001";
|
||||||
mode* = "MODE";
|
cmdMode* = "MODE";
|
||||||
join* = "JOIN";
|
cmdJoin* = "JOIN";
|
||||||
|
cmdUser* = "USER";
|
||||||
|
cmdNick* = "NICK";
|
||||||
|
CR* = 0DX;
|
||||||
|
LF* = 0AX;
|
||||||
|
|
||||||
|
TYPE
|
||||||
|
chn* = ARRAY 32 OF CHAR;
|
||||||
|
chnlist* = POINTER TO ARRAY OF chn;
|
||||||
|
|
||||||
|
|
||||||
VAR
|
VAR
|
||||||
connection : Internet.Socket;
|
connection : Internet.Socket;
|
||||||
eol* : ARRAY 3 OF CHAR;
|
eol* : ARRAY 3 OF CHAR;
|
||||||
|
channelList: chnlist;
|
||||||
|
|
||||||
PROCEDURE Auth*(user, nick, owner: ARRAY OF CHAR): BOOLEAN;
|
PROCEDURE setChannelList*(VAR chnl: chnlist);
|
||||||
|
BEGIN
|
||||||
|
channelList := chnl;
|
||||||
|
END setChannelList;
|
||||||
|
|
||||||
|
(* cuts line, takes the part till the eol *)
|
||||||
|
PROCEDURE cutLine(VAR src, dst: ARRAY OF CHAR);
|
||||||
VAR
|
VAR
|
||||||
str0, str1: ARRAY 255 OF CHAR;
|
found: BOOLEAN;
|
||||||
b : BOOLEAN;
|
pos : INTEGER;
|
||||||
|
i : INTEGER;
|
||||||
|
pattern : ARRAY 1 OF CHAR;
|
||||||
|
BEGIN
|
||||||
|
pattern[0] := LF;
|
||||||
|
COPY("", dst);
|
||||||
|
Strings.FindNext(pattern, src, 0, found, pos);
|
||||||
|
IF found THEN
|
||||||
|
i := 0;
|
||||||
|
REPEAT
|
||||||
|
dst[i] := src[i];
|
||||||
|
INC(i);
|
||||||
|
UNTIL i = pos;
|
||||||
|
dst[i] := src[i];
|
||||||
|
INC(i);
|
||||||
|
dst[i] := 0X;
|
||||||
|
END;
|
||||||
|
END cutLine;
|
||||||
|
|
||||||
|
|
||||||
|
PROCEDURE formUserLine(VAR user, owner, result: ARRAY OF CHAR);
|
||||||
BEGIN
|
BEGIN
|
||||||
(* "USER test 0 * :test\r\n" *)
|
(* "USER test 0 * :test\r\n" *)
|
||||||
(* "NICK test\r\n\000\060 :test\r\n"*)
|
COPY(cmdUser, result);
|
||||||
|
Strings.Append(" ", result);
|
||||||
|
Strings.Append(user, result);
|
||||||
COPY("USER ", str0);
|
Strings.Append(" 0 * :", result);
|
||||||
Strings.Append(user, str0);
|
Strings.Append(owner, result);
|
||||||
Strings.Append(" 0 * :", str0);
|
|
||||||
Strings.Append(owner, str0);
|
|
||||||
(* by the spec the command is terminated by \r\n *)
|
(* by the spec the command is terminated by \r\n *)
|
||||||
Strings.Append(eol, str0);
|
Strings.Append(eol, result);
|
||||||
|
END formUserLine;
|
||||||
|
|
||||||
Strings.Append ("NICK ", str0);
|
PROCEDURE formNickLine(VAR nick, result: ARRAY OF CHAR);
|
||||||
Strings.Append (nick, str0);
|
BEGIN
|
||||||
Strings.Append(eol, str0);
|
(* "NICK test\r\n\000\060 :test\r\n"*)
|
||||||
Strings.Append(0X, str0);
|
COPY (cmdNick, result);
|
||||||
|
Strings.Append(" ", result);
|
||||||
|
Strings.Append (nick, result);
|
||||||
|
Strings.Append(eol, result);
|
||||||
|
END formNickLine;
|
||||||
|
|
||||||
|
PROCEDURE Auth*(user, owner, nick: ARRAY OF CHAR): BOOLEAN;
|
||||||
|
VAR
|
||||||
|
userRequest, nickRequest: ARRAY 255 OF CHAR;
|
||||||
|
b : BOOLEAN;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
formUserLine(user, owner, userRequest);
|
||||||
|
|
||||||
Out.String("sending:"); Out.Ln;
|
Out.String("sending:"); Out.Ln;
|
||||||
Out.String(str0); Out.Ln;
|
Out.String(userRequest); Out.Ln;
|
||||||
b := Internet.Write(connection, str0);
|
|
||||||
|
b := Internet.Write(connection, userRequest);
|
||||||
|
|
||||||
|
IF b THEN Out.String("wrote!"); Out.Ln ELSE Out.String("write failed"); Out.Ln END;
|
||||||
|
|
||||||
|
formNickLine(nick, nickRequest);
|
||||||
|
|
||||||
|
Out.String("sending:"); Out.Ln;
|
||||||
|
Out.String(nickRequest); Out.Ln;
|
||||||
|
|
||||||
IF b THEN Out.String("wrote!"); Out.Ln ELSE Out.String("write failed"); Out.Ln END;
|
IF b THEN Out.String("wrote!"); Out.Ln ELSE Out.String("write failed"); Out.Ln END;
|
||||||
|
|
||||||
RETURN b
|
RETURN b
|
||||||
|
|
||||||
END Auth;
|
END Auth;
|
||||||
|
|
||||||
PROCEDURE Receive*(VAR str: ARRAY OF CHAR): BOOLEAN;
|
PROCEDURE Receive*(VAR str: ARRAY OF CHAR): BOOLEAN;
|
||||||
|
|
@ -80,15 +134,73 @@ BEGIN
|
||||||
RETURN res
|
RETURN res
|
||||||
END Connect;
|
END Connect;
|
||||||
|
|
||||||
PROCEDURE Loop*;
|
PROCEDURE Disconnect*;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
|
Internet.Disconnect(connection);
|
||||||
|
END Disconnect;
|
||||||
|
|
||||||
|
PROCEDURE isPing(VAR line: ARRAY OF CHAR): BOOLEAN;
|
||||||
|
VAR
|
||||||
|
tmp: ARRAY 5 OF CHAR;
|
||||||
|
BEGIN
|
||||||
|
Strings.Extract(line, 0, 4, tmp);
|
||||||
|
IF Strings.Equal(tmp, cmdPing) THEN
|
||||||
|
RETURN TRUE
|
||||||
|
ELSE
|
||||||
|
RETURN FALSE
|
||||||
|
END
|
||||||
|
END isPing;
|
||||||
|
|
||||||
|
PROCEDURE Pong(VAR line: ARRAY OF CHAR);
|
||||||
|
VAR
|
||||||
|
tmp: ARRAY msgLen OF CHAR;
|
||||||
|
b : BOOLEAN;
|
||||||
|
BEGIN
|
||||||
|
cutLine(line, tmp);
|
||||||
|
tmp[1] := 'O'; (* replace "PING" by "PONG" *)
|
||||||
|
b := Send(tmp);
|
||||||
|
END Pong;
|
||||||
|
|
||||||
|
PROCEDURE processResponse(VAR line: ARRAY OF CHAR);
|
||||||
|
BEGIN
|
||||||
|
IF isPing(line) THEN Pong(line) END;
|
||||||
|
(*
|
||||||
|
IF line[0] = ':' THEN
|
||||||
|
IF contains001(line) THEN
|
||||||
|
sendMode(line);
|
||||||
|
sendJoin;
|
||||||
|
END;
|
||||||
|
Strings.FindNext(IRC.zzo, str, 0, patternFound, patternPos);
|
||||||
|
IF patternFound THEN
|
||||||
|
Out.String("001 found"); Out.Ln;
|
||||||
|
COPY ("MODE ", str3);
|
||||||
|
Strings.Append(nick, str3);
|
||||||
|
Strings.Append(" +B", str3);
|
||||||
|
Strings.Append(eol, str3);
|
||||||
|
Strings.Append(0X, str3);
|
||||||
|
b2 := IRC.Send(str3);
|
||||||
|
COPY("JOIN ", str3);
|
||||||
|
Strings.Append("#oberon", str3);
|
||||||
|
Strings.Append(eol, str3);
|
||||||
|
Strings.Append(0X, str3);
|
||||||
|
b2 := IRC.Send(str3);
|
||||||
|
END;
|
||||||
|
END;*)
|
||||||
|
END processResponse;
|
||||||
|
|
||||||
|
PROCEDURE Loop*;
|
||||||
|
VAR
|
||||||
|
b : BOOLEAN;
|
||||||
|
str : ARRAY msgLen OF CHAR;
|
||||||
|
BEGIN
|
||||||
|
REPEAT
|
||||||
|
b := Receive(str);
|
||||||
|
processResponse(str);
|
||||||
|
UNTIL ~b;
|
||||||
END Loop;
|
END Loop;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
eol[0] := 0AX; eol[1] := 0DX; eol[2] := 0X;
|
eol[0] := LF; eol[1] := CR; eol[2] := 0X;
|
||||||
|
|
||||||
|
|
||||||
END IRC.
|
END IRC.
|
||||||
|
|
|
||||||
|
|
@ -92,5 +92,11 @@ BEGIN
|
||||||
|
|
||||||
END Connect;
|
END Connect;
|
||||||
|
|
||||||
|
PROCEDURE Disconnect*(VAR fd: Socket);
|
||||||
|
VAR
|
||||||
|
i : INTEGER;
|
||||||
|
BEGIN
|
||||||
|
i := Platform.Close(fd);
|
||||||
|
END Disconnect;
|
||||||
|
|
||||||
END Internet.
|
END Internet.
|
||||||
|
|
|
||||||
40
test.Mod
40
test.Mod
|
|
@ -8,47 +8,23 @@ owner, user, nick, host, port, channel: ARRAY 32 OF CHAR;
|
||||||
|
|
||||||
PROCEDURE testBot;
|
PROCEDURE testBot;
|
||||||
VAR
|
VAR
|
||||||
b, b2: BOOLEAN;
|
b: BOOLEAN;
|
||||||
patternFound : BOOLEAN;
|
channels : IRC.chnlist;
|
||||||
patternPos: INTEGER;
|
|
||||||
str, str2, str3: ARRAY 512 OF CHAR;
|
|
||||||
BEGIN
|
BEGIN
|
||||||
IF IRC.Connect(host, port) # FALSE THEN
|
NEW(channels, 1);
|
||||||
|
channels[0] := channel;
|
||||||
|
IRC.setChannelList(channels);
|
||||||
|
|
||||||
|
IF IRC.Connect(host, port) # FALSE THEN
|
||||||
b := IRC.Auth(user, nick, owner);
|
b := IRC.Auth(user, nick, owner);
|
||||||
REPEAT
|
IRC.Loop;
|
||||||
b := IRC.Receive(str);
|
|
||||||
Strings.Extract(str, 0, 4, str2);
|
|
||||||
IF Strings.Equal(str2, IRC.ping) THEN
|
|
||||||
(*b := IRC.Send(IRC.pong);*)
|
|
||||||
str[1] := 'O'; (* replace "PING" by "PONG" *)
|
|
||||||
b2 := IRC.Send(str);
|
|
||||||
ELSIF str[0] = ':' THEN
|
|
||||||
Out.String("':' found"); Out.Ln;
|
|
||||||
Strings.FindNext(IRC.zzo, str, 0, patternFound, patternPos);
|
|
||||||
IF patternFound THEN
|
|
||||||
Out.String("001 found"); Out.Ln;
|
|
||||||
COPY ("MODE ", str3);
|
|
||||||
Strings.Append(nick, str3);
|
|
||||||
Strings.Append(" +B", str3);
|
|
||||||
Strings.Append(IRC.eol, str3);
|
|
||||||
Strings.Append(0X, str3);
|
|
||||||
b2 := IRC.Send(str3);
|
|
||||||
COPY("JOIN ", str3);
|
|
||||||
Strings.Append("#oberon", str3);
|
|
||||||
Strings.Append(IRC.eol, str3);
|
|
||||||
Strings.Append(0X, str3);
|
|
||||||
b2 := IRC.Send(str3);
|
|
||||||
END;
|
END;
|
||||||
END;
|
|
||||||
UNTIL ~b;
|
|
||||||
END;
|
|
||||||
END testBot;
|
END testBot;
|
||||||
|
|
||||||
BEGIN
|
BEGIN
|
||||||
owner := "norayr_tanakian";
|
owner := "norayr_tanakian";
|
||||||
user := "norayr_tanakian";
|
user := "norayr_tanakian";
|
||||||
nick := "arnet_am";
|
nick := "vocbot";
|
||||||
host := "irc.freenode.net";
|
host := "irc.freenode.net";
|
||||||
port := "6667";
|
port := "6667";
|
||||||
channel := "#oberon";
|
channel := "#oberon";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue