From 4c73f414b03c4c71538937e5f2b779fa1e6719c9 Mon Sep 17 00:00:00 2001 From: norayr Date: Fri, 14 Apr 2017 19:30:13 +0400 Subject: [PATCH] changes --- IRC.Mod | 164 +++++++++++++++++++++++++++++++++++++++++++-------- Internet.Mod | 6 ++ test.Mod | 46 ++++----------- 3 files changed, 155 insertions(+), 61 deletions(-) diff --git a/IRC.Mod b/IRC.Mod index 5ad8771..695238a 100644 --- a/IRC.Mod +++ b/IRC.Mod @@ -3,45 +3,99 @@ IMPORT Internet, Out, Strings := ooc2Strings, types; CONST msgLen* = 512; (* message length not more than 512 characters *) - ping* = "PING"; - pong* = "PONG"; + cmdPing* = "PING"; + cmdPong* = "PONG"; zzo* = "001"; - mode* = "MODE"; - join* = "JOIN"; + cmdMode* = "MODE"; + cmdJoin* = "JOIN"; + cmdUser* = "USER"; + cmdNick* = "NICK"; + CR* = 0DX; + LF* = 0AX; + + TYPE + chn* = ARRAY 32 OF CHAR; + chnlist* = POINTER TO ARRAY OF chn; + VAR connection : Internet.Socket; 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 - str0, str1: ARRAY 255 OF CHAR; - b : BOOLEAN; + found: 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 (* "USER test 0 * :test\r\n" *) -(* "NICK test\r\n\000\060 :test\r\n"*) - - - COPY("USER ", str0); - Strings.Append(user, str0); - Strings.Append(" 0 * :", str0); - Strings.Append(owner, str0); + COPY(cmdUser, result); + Strings.Append(" ", result); + Strings.Append(user, result); + Strings.Append(" 0 * :", result); + Strings.Append(owner, result); (* by the spec the command is terminated by \r\n *) - Strings.Append(eol, str0); + Strings.Append(eol, result); +END formUserLine; - Strings.Append ("NICK ", str0); - Strings.Append (nick, str0); - Strings.Append(eol, str0); - Strings.Append(0X, str0); +PROCEDURE formNickLine(VAR nick, result: ARRAY OF CHAR); +BEGIN +(* "NICK test\r\n\000\060 :test\r\n"*) + COPY (cmdNick, result); + Strings.Append(" ", result); + Strings.Append (nick, result); + Strings.Append(eol, result); +END formNickLine; - Out.String("sending:"); Out.Ln; - Out.String(str0); Out.Ln; - b := Internet.Write(connection, str0); +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(userRequest); Out.Ln; + + b := Internet.Write(connection, userRequest); IF b THEN Out.String("wrote!"); Out.Ln ELSE Out.String("write failed"); Out.Ln END; - RETURN b + 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; + + RETURN b END Auth; PROCEDURE Receive*(VAR str: ARRAY OF CHAR): BOOLEAN; @@ -80,15 +134,73 @@ BEGIN RETURN res END Connect; -PROCEDURE Loop*; - +PROCEDURE Disconnect*; 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; BEGIN - eol[0] := 0AX; eol[1] := 0DX; eol[2] := 0X; + eol[0] := LF; eol[1] := CR; eol[2] := 0X; END IRC. diff --git a/Internet.Mod b/Internet.Mod index cf089c2..3a4e48e 100644 --- a/Internet.Mod +++ b/Internet.Mod @@ -92,5 +92,11 @@ BEGIN END Connect; +PROCEDURE Disconnect*(VAR fd: Socket); +VAR + i : INTEGER; +BEGIN +i := Platform.Close(fd); +END Disconnect; END Internet. diff --git a/test.Mod b/test.Mod index 541b37e..434e75c 100644 --- a/test.Mod +++ b/test.Mod @@ -8,47 +8,23 @@ owner, user, nick, host, port, channel: ARRAY 32 OF CHAR; PROCEDURE testBot; VAR - b, b2: BOOLEAN; - patternFound : BOOLEAN; - patternPos: INTEGER; - str, str2, str3: ARRAY 512 OF CHAR; + b: BOOLEAN; + channels : IRC.chnlist; BEGIN -IF IRC.Connect(host, port) # FALSE THEN - - b := IRC.Auth(user, nick, owner); - REPEAT - 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; - UNTIL ~b; -END; + NEW(channels, 1); + channels[0] := channel; + IRC.setChannelList(channels); + + IF IRC.Connect(host, port) # FALSE THEN + b := IRC.Auth(user, nick, owner); + IRC.Loop; + END; END testBot; BEGIN owner := "norayr_tanakian"; user := "norayr_tanakian"; -nick := "arnet_am"; +nick := "vocbot"; host := "irc.freenode.net"; port := "6667"; channel := "#oberon";