diff --git a/IRC.Mod b/IRC.Mod index 9e8a92b..5ad8771 100644 --- a/IRC.Mod +++ b/IRC.Mod @@ -1,10 +1,17 @@ MODULE IRC; -IMPORT Internet, Out, Strings, types; +IMPORT Internet, Out, Strings := ooc2Strings, types; -CONST msgLen = 512; (* message length not more than 512 characters *) +CONST + msgLen* = 512; (* message length not more than 512 characters *) + ping* = "PING"; + pong* = "PONG"; + zzo* = "001"; + mode* = "MODE"; + join* = "JOIN"; VAR connection : Internet.Socket; + eol* : ARRAY 3 OF CHAR; PROCEDURE Auth*(user, nick, owner: ARRAY OF CHAR): BOOLEAN; VAR @@ -14,26 +21,57 @@ BEGIN (* "USER test 0 * :test\r\n" *) (* "NICK test\r\n\000\060 :test\r\n"*) - str1[0] := 0AX; str1[1] := 0DX; str1[2] := 0X; COPY("USER ", str0); Strings.Append(user, str0); - Strings.Append(" 0 0 :", str0); + Strings.Append(" 0 * :", str0); Strings.Append(owner, str0); (* by the spec the command is terminated by \r\n *) - Strings.Append(str1, str0); + Strings.Append(eol, str0); + + Strings.Append ("NICK ", str0); + Strings.Append (nick, str0); + Strings.Append(eol, str0); + Strings.Append(0X, str0); + Out.String("sending:"); Out.Ln; Out.String(str0); Out.Ln; - b := Internet.Write(connection, str0, Strings.Length(str0)); - IF b THEN Out.String("wrote!"); Out.Ln ELSE Out.String("write failed"); Out.Ln END; - COPY ("NICK ", str0); - Strings.Append (nick, str0); - Strings.Append(str1, str0); + b := Internet.Write(connection, str0); + 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; +VAR + b: BOOLEAN; +BEGIN + b := Internet.Read(connection, str); + IF b THEN + Out.String("received:"); Out.Ln; + Out.String(str); Out.Ln; + ELSE + Out.String("receive failed"); Out.Ln; + END; + RETURN b +END Receive; + +PROCEDURE Send*(str: ARRAY OF CHAR): BOOLEAN; +VAR + b : BOOLEAN; +BEGIN + b := Internet.Write(connection, str); + IF b THEN + Out.String("sent:"); Out.Ln; + Out.String(str); Out.Ln; + ELSE + Out.String("sending failed"); Out.Ln; + END; + RETURN b +END Send; + PROCEDURE Connect*(host, port: ARRAY OF CHAR): BOOLEAN; VAR res: BOOLEAN; @@ -42,4 +80,15 @@ BEGIN RETURN res END Connect; +PROCEDURE Loop*; + +BEGIN + + +END Loop; + +BEGIN + eol[0] := 0AX; eol[1] := 0DX; eol[2] := 0X; + + END IRC. diff --git a/Internet.Mod b/Internet.Mod index 529c605..a8988b9 100644 --- a/Internet.Mod +++ b/Internet.Mod @@ -1,5 +1,5 @@ MODULE Internet; -IMPORT sockets, netdb, Platform, types, Out, SYSTEM; +IMPORT sockets, netdb, types, Strings, Out, Platform, SYSTEM; TYPE @@ -9,12 +9,14 @@ TYPE Int32 = types.Int32; Int64 = types.Int64; -PROCEDURE Write*(fd: Socket; VAR buf: ARRAY OF CHAR; len: LONGINT): BOOLEAN; +PROCEDURE Write*(fd: Socket; VAR buf: ARRAY OF CHAR): BOOLEAN; VAR l: SYSTEM.ADDRESS; r: INTEGER; + len: LONGINT; BEGIN l := SYSTEM.ADR(buf); + len := Strings.Length(buf)-1; r := Platform.Write(fd, l, len); IF r = -1 THEN (*Out.String("write() failed."); Out.Ln;*) @@ -25,6 +27,18 @@ BEGIN END; END Write; +PROCEDURE Read*(fd: Socket; VAR buf: ARRAY OF CHAR): BOOLEAN; +VAR + p: SYSTEM.ADDRESS; + l, f: LONGINT; + r: INTEGER; +BEGIN + p := SYSTEM.ADR(buf); + l := LEN(buf); + f := 0; + r := Platform.Read(fd, p, l, f); + +END Read; PROCEDURE Connect*(host, port: ARRAY OF CHAR; VAR conn: Socket): BOOLEAN; VAR diff --git a/test.Mod b/test.Mod index b1f242a..541b37e 100644 --- a/test.Mod +++ b/test.Mod @@ -1,25 +1,54 @@ MODULE test; -IMPORT IRC, Out; +IMPORT IRC, Out, Strings := ooc2Strings; VAR owner, user, nick, host, port, channel: ARRAY 32 OF CHAR; PROCEDURE testBot; -VAR b : BOOLEAN; +VAR + b, b2: BOOLEAN; + patternFound : BOOLEAN; + patternPos: INTEGER; + str, str2, str3: ARRAY 512 OF CHAR; 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; END testBot; BEGIN owner := "norayr_tanakian"; -user := "norayr"; -nick := "arnet"; +user := "norayr_tanakian"; +nick := "arnet_am"; host := "irc.freenode.net"; port := "6667"; channel := "#oberon";