diff --git a/FileManager.Mod b/FileManager.Mod new file mode 100644 index 0000000..2696d7d --- /dev/null +++ b/FileManager.Mod @@ -0,0 +1,13 @@ +MODULE FileManager; + +PROCEDURE Read(); +BEGIN + +END Read; + +PROCEDURE Write(); +BEGIN + +END Write; + +END FileManager. \ No newline at end of file diff --git a/IRC.Mod b/IRC.Mod deleted file mode 100644 index 0d3440a..0000000 --- a/IRC.Mod +++ /dev/null @@ -1,671 +0,0 @@ -MODULE IRC; (*noch 23.2.2017 / 19.5.2017*) -IMPORT Internet, Out, Files, Strings := ooc2Strings, sh := stringHelpers, types, time; - -CONST - msgLen* = 512; (* message length not more than 512 characters *) - (* irc commands *) - cmdPing* = "PING"; - cmdPong* = "PONG"; - cmdMode* = "MODE"; - cmdJoin* = "JOIN"; - cmdUser* = "USER"; - cmdNick* = "NICK"; - msgPRIVMSG* = "PRIVMSG"; - msgNOTICE* = "NOTICE"; - msgQUIT* = "QUIT"; - msgJOIN* = "JOIN"; - msgPART* = "PART"; - ctcpChar* = 01X; - msgACTION* = "ACTION"; - (* irc replies rfc1459 from https://www.alien.net.au/irc/irc2numerics.html *) - rplWelcome = "001"; - rplYourHost = "002"; - rplCreated = "003"; - rplMyInfo = "004"; - rplBounce = "005"; - rplNameReply = "353"; - rplEndOfNames = "366"; - - CR* = 0DX; - LF* = 0AX; - - eofMOTD="End of /MOTD"; - errClosingLink = "ERROR :Closing Link:"; - - TYPE - chn* = ARRAY 32 OF CHAR; - - Channel* = RECORD - channel* : chn; - logfile : Files.File; - rider : Files.Rider; - END; - - Channels* = POINTER TO ARRAY OF Channel; - - msg* = ARRAY msgLen OF CHAR; - (*cbMessage* = PROCEDURE(VAR msg : ARRAY OF CHAR);*) (* cb stands for callback *) - cbPrivateMessage* = PROCEDURE (VAR msg, msgtype, user, ident, host: ARRAY OF CHAR); - cbPublicMessage* = PROCEDURE (VAR msg, msgtype, user, ident, rcpt, host: ARRAY OF CHAR); - cbPublicMessageWithMention* = PROCEDURE(VAR msg, msgtype, user, ident, rcpt, host: ARRAY OF CHAR); (* rcpt is usually the room in case of public messages *) - - instance* = RECORD - owner*, user*, nick*, host*, port*: chn; - connection*: Internet.Socket; - channelList*: Channels; - callbackPrivate*: cbPrivateMessage; - callbackPublic*: cbPublicMessage; - callbackPublicMention*: cbPublicMessageWithMention; - doLog : BOOLEAN; - END; - - -VAR - eol- : ARRAY 3 OF CHAR; - debug: BOOLEAN; - -PROCEDURE setLogging*(VAR inst: instance; state: BOOLEAN); -BEGIN - inst.doLog := state; -END setLogging; - -PROCEDURE formUserNickLine(VAR user, owner, nick, res: ARRAY OF CHAR); -VAR - l : INTEGER; -BEGIN - COPY(cmdUser, res); - Strings.Append(" ", res); - Strings.Append(user, res); - Strings.Append(" 0 * :", res); - Strings.Append(owner, res); - (* by the spec the command is terminated by \r\n *) - - l := Strings.Length(res); - res[l] := LF; - res[l+1] := CR; - res[l+2] := 0X; - (*Strings.Append(eol, res);*) - - Strings.Append (cmdNick, res); - Strings.Append(" ", res); - Strings.Append (nick, res); - Strings.Append(eol, res); - -END formUserNickLine; - -PROCEDURE formModeLine(VAR str, nick: ARRAY OF CHAR); -BEGIN - COPY (cmdMode, str); - Strings.Append(" ", str); - Strings.Append(nick, str); - Strings.Append(" +C", str); - Strings.Append(eol, str); -END formModeLine; - -PROCEDURE formJoinLine(VAR ln, chan: ARRAY OF CHAR); -BEGIN - COPY(cmdJoin, ln); - Strings.Append(" ", ln); - Strings.Append(chan, ln); - Strings.Append(eol, ln); -END formJoinLine; - -PROCEDURE formModeJoinLine(VAR str, nick: ARRAY OF CHAR; channels: Channels); -VAR - i: LONGINT; -BEGIN - COPY (cmdMode, str); - Strings.Append(" ", str); - Strings.Append(nick, str); - Strings.Append(" +i", str); - sh.appendLFCR(str); - (*Strings.Append(eol, str);*) - - i := 0; - REPEAT - Strings.Append(cmdJoin, str); - Strings.Append(" ", str); - Strings.Append(channels^[i].channel, str); - INC(i); - IF i = LEN(channels^) THEN - Strings.Append(eol, str); - ELSE - sh.appendLFCR(str); - END; - UNTIL i = LEN(channels^); -END formModeJoinLine; - -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 isServerMsg(VAR line: ARRAY OF CHAR): BOOLEAN; -BEGIN - IF line[0] = ':' THEN RETURN TRUE ELSE RETURN FALSE END -END isServerMsg; - -PROCEDURE error(VAR line: ARRAY OF CHAR): BOOLEAN; -VAR - b : BOOLEAN; - pos: INTEGER; -BEGIN - Strings.FindNext(errClosingLink, line, 0, b, pos); - RETURN b -END error; - -(* instance functions *) - -PROCEDURE initChannelList*(VAR inst: instance; VAR channels: Channels); -VAR - i : INTEGER; -BEGIN - IF inst.doLog THEN - i := 0; - REPEAT - channels^[i].logfile := Files.Old(channels^[i].channel); - IF channels^[i].logfile = NIL THEN - channels^[i].logfile := Files.New(channels^[i].channel); - Files.Set(channels^[i].rider, channels^[i].logfile, 0); - ELSE - Files.Set(channels^[i].rider, channels^[i].logfile, Files.Length(channels^[i].logfile)); - END; - INC(i); - UNTIL i = LEN(channels^); - END; - inst.channelList := channels; -END initChannelList; - -PROCEDURE Receive*(VAR inst: instance; VAR str: ARRAY OF CHAR): BOOLEAN; -VAR - b: BOOLEAN; -BEGIN - sh.zeroStr(str); - b := Internet.Read(inst.connection, str); - IF b THEN - Out.String("received: '"); - Out.String(str); Out.String("'"); Out.Ln; - ELSE - Out.String("receive failed"); Out.Ln; - END; - RETURN b -END Receive; - -PROCEDURE Send*(VAR inst: instance; str: ARRAY OF CHAR): BOOLEAN; -VAR - b : BOOLEAN; -BEGIN - b := Internet.Write(inst.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 Auth*(inst: instance): BOOLEAN; -VAR - line: ARRAY 255 OF CHAR; - b : BOOLEAN; -BEGIN - formUserNickLine(inst.user, inst.owner, inst.nick, line); - - b := Internet.Write(inst.connection, line); - - RETURN b -END Auth; - -PROCEDURE Connect*(VAR inst: instance): BOOLEAN; -VAR - res: BOOLEAN; -BEGIN - res := Internet.Connect(inst.host, inst.port, inst.connection); - RETURN res -END Connect; - -PROCEDURE Disconnect*(VAR inst: instance); -BEGIN - Internet.Disconnect(inst.connection); -END Disconnect; - -PROCEDURE Pong(VAR inst: instance; VAR line: ARRAY OF CHAR); -VAR - tmp: ARRAY msgLen OF CHAR; - b : BOOLEAN; -BEGIN - sh.cutLine(line, tmp); - tmp[1] := 'O'; (* replace "PING" by "PONG" *) - b := Send(inst, tmp); -END Pong; - -PROCEDURE Mode*(VAR inst: instance); -VAR - str : ARRAY msgLen OF CHAR; - b : BOOLEAN; -BEGIN - sh.zeroStr(str); - formModeLine(str, inst.nick); - b := Send(inst, str); -END Mode; - -PROCEDURE ModeAndJoin*(VAR inst : instance); -VAR str: ARRAY msgLen OF CHAR; - b: BOOLEAN; -BEGIN - sh.zeroStr(str); - formModeJoinLine(str, inst.nick, inst.channelList); - b := Send(inst, str); -END ModeAndJoin; - -PROCEDURE Join*(VAR inst: instance); -VAR - str: ARRAY msgLen OF CHAR; - b: BOOLEAN; -BEGIN - sh.zeroStr(str); - formJoinLine(str, inst.channelList^[0].channel); - Out.String("SENDING JOIN LINE"); Out.Ln; - b := Send(inst, str); -END Join; - -PROCEDURE getUser(VAR line, user: ARRAY OF CHAR): BOOLEAN; -VAR - pos: INTEGER; - found: BOOLEAN; -BEGIN - sh.zeroStr(user); - Strings.FindNext(" ", line, 1, found, pos); - IF found THEN - Strings.Extract(line, 1, pos - 1, user); - END; - RETURN found -END getUser; - -PROCEDURE getMsgType(VAR line, mtype: ARRAY OF CHAR): BOOLEAN; -VAR - pos0, pos1: INTEGER; - found: BOOLEAN; -BEGIN - sh.zeroStr(mtype); - Strings.FindNext(" ", line, 0, found, pos0); - IF found THEN - Strings.FindNext(" ", line, pos0+1, found, pos1); - IF found THEN - Strings.Extract(line, pos0 + 1, pos1 - pos0 - 1, mtype); - END; - END; - RETURN found -END getMsgType; - -PROCEDURE getRecipient(VAR line, room: ARRAY OF CHAR): BOOLEAN; -VAR - pos0, pos1: INTEGER; - found: BOOLEAN; -BEGIN - sh.zeroStr(room); - Strings.FindNext(" ", line, 0, found, pos1); - IF found THEN - Strings.FindNext(" ", line, pos1+1, found, pos0); - IF found THEN - sh.getNextWord(line, pos0, room); - END; - END; - RETURN found -END getRecipient; - -PROCEDURE getMsg(VAR line, msg: ARRAY OF CHAR): BOOLEAN; -VAR - pos0, pos1: INTEGER; - found: BOOLEAN; -BEGIN - sh.zeroStr(msg); - Strings.FindNext(" ", line, 0, found, pos0); - IF found THEN - Strings.FindNext(" ", line, pos0+1, found, pos1); - IF found THEN - Strings.FindNext(" ", line, pos1+1, found, pos0); - sh.getTillEOL(line, pos0+1, msg); - END; - END; - RETURN found -END getMsg; - -PROCEDURE getUserName(VAR user, username: ARRAY OF CHAR): BOOLEAN; -VAR - i: INTEGER; - b: BOOLEAN; -BEGIN - sh.zeroStr(username); - Strings.FindNext("!", user, 0, b, i); - IF b THEN - Strings.Extract(user, 0, i, username); - END; - RETURN b -END getUserName; - -PROCEDURE getIdentName(VAR user, ident: ARRAY OF CHAR): BOOLEAN; -VAR - i, j: INTEGER; - b: BOOLEAN; -BEGIN - sh.zeroStr(ident); - Strings.FindNext("~", user, 0, b, i); - IF b THEN - Strings.FindNext("@", user, i, b, j); - IF b THEN - Strings.Extract(user, i+1, j-i-1, ident); - END; - END; - RETURN b; -END getIdentName; - -PROCEDURE getHost(VAR user, host: ARRAY OF CHAR): BOOLEAN; -VAR - i: INTEGER; - b: BOOLEAN; -BEGIN - sh.zeroStr(host); - Strings.FindNext("@", user, 0, b, i); - IF b THEN - Strings.Extract(user, i+1, Strings.Length(user)-i-1, host); - END; - RETURN b; -END getHost; - -PROCEDURE isMention(VAR nick, line: ARRAY OF CHAR): BOOLEAN; -VAR - i : INTEGER; - str: ARRAY 32 OF CHAR; -BEGIN - Strings.Extract(line, 0, Strings.Length(nick), str); - IF str = nick THEN - RETURN TRUE - ELSE - RETURN FALSE - END; -END isMention; - -PROCEDURE cutMentionFromMessage(VAR nick, msg: ARRAY OF CHAR); -BEGIN - Strings.Delete(msg, 0, Strings.Length(nick) + 2); -END cutMentionFromMessage; - - -PROCEDURE formTimeString(VAR str: ARRAY OF CHAR); -VAR - year, month, day, hour, minute, second: LONGINT; - syear, smonth, sday, shour, sminute, ssecond: ARRAY 8 OF CHAR; -BEGIN - - time.Now(year, month, day, hour, minute, second); - sh.IntToStr(year, syear); - sh.IntToStr(month, smonth); - sh.IntToStr(day, sday); - sh.IntToStr(hour, shour); - sh.IntToStr(minute, sminute); - sh.IntToStr(second, ssecond); - - COPY(syear, str); - Strings.Append("-", str); - Strings.Append(smonth, str); - Strings.Append("-", str); - Strings.Append(sday, str); - Strings.Append(" (", str); - Strings.Append(shour, str); - Strings.Append(":", str); - Strings.Append(sminute, str); - Strings.Append(":", str); - Strings.Append(ssecond, str); - Strings.Append(") ", str); -END formTimeString; - -PROCEDURE log(VAR inst: instance; message, messagetype, username, identname, rcpt: ARRAY OF CHAR); -VAR - i : INTEGER; - b : BOOLEAN; - str: ARRAY msgLen OF CHAR; - tmp: ARRAY 16 OF CHAR; - (* for searching for ACTION *) - b0: BOOLEAN; - j: INTEGER; - str0: ARRAY msgLen OF CHAR; -BEGIN - IF inst.doLog THEN - sh.zeroStr(str); - Out.String("logging about: "); Out.String(username); Out.String(", "); Out.String(messagetype); Out.String(", "); Out.String(rcpt); Out.Ln; - i := 0; b := FALSE; - REPEAT - Out.String("is "); Out.String(inst.channelList^[i].channel); Out.String("="); Out.String(rcpt); Out.String("?"); Out.Ln; - IF inst.channelList^[i].channel = rcpt THEN b := TRUE END; - INC(i); - UNTIL (i = LEN(inst.channelList^)) OR b; - IF b THEN Out.String("yes!") ELSE Out.String("no!") END; Out.Ln; - IF b OR (messagetype = msgPART) THEN (* we don't know from which channel user quits so we only write to log about it when he parts. *) - DEC(i); - formTimeString(str); - IF messagetype = msgPRIVMSG THEN - b0 := FALSE; - Strings.FindNext(msgACTION, message, 1, b0, j); - IF b0 THEN (* handle actions *) - Strings.Append("***", str); - Strings.Append(username, str); - Strings.Append(" ", str); - sh.getTillEOL(message, j+Strings.Length(msgACTION), str0); - Strings.Append(str0, str); - ELSE - Strings.Append(username, str); - tmp := ": "; - Strings.Append(tmp, str); - Strings.Append(message, str); - END; - ELSIF messagetype = msgJOIN THEN - Strings.Append(username, str); - tmp := " joined "; - Strings.Append (tmp, str); - Strings.Append (rcpt, str); - ELSIF (messagetype = msgPART) THEN - Strings.Append(username, str); - tmp := " has quit"; - Strings.Append(tmp, str); - END; - Out.String("writing to "); Out.String(rcpt); Out.String(" log: "); Out.String(str); Out.Ln; - Files.WriteString(inst.channelList^[i].rider, str); - Files.Set(inst.channelList^[i].rider, inst.channelList^[i].logfile, Files.Pos(inst.channelList^[i].rider)-1); Files.Write(inst.channelList^[i].rider, 0AX); - Files.Register(inst.channelList^[i].logfile); - END; - END; (* if do log *) -END log; - -PROCEDURE finalize*(VAR inst: instance); -VAR - i: INTEGER; - l: LONGINT; - b: BOOLEAN; - msg: ARRAY 23 OF CHAR; -BEGIN - IF inst.doLog THEN - i := 0; - REPEAT - Out.String("flushing "); Out.String(inst.channelList^[i].channel); Out.String(" file."); Out.Ln; - Files.Register(inst.channelList^[i].logfile); - Files.Close(inst.channelList^[i].logfile); - INC(i) - UNTIL i = LEN(inst.channelList^); - END; - Out.String("quitting."); Out.Ln; - msg := "QUIT :interrupt"; - l := Strings.Length(msg); - msg[l] := LF; - msg[l+1] := CR; - msg[l+2] := 0X; - Out.String("closing connection."); Out.Ln; - b := Send(inst, msg); - Disconnect(inst); - Out.String("exiting."); Out.Ln; -END finalize; - -PROCEDURE sendMsgToDst*(VAR inst: instance; VAR dst: ARRAY OF CHAR; msg: ARRAY OF CHAR); -VAR - s: POINTER TO ARRAY OF CHAR; - i, j: LONGINT; - b: BOOLEAN; -BEGIN - i := Strings.Length(msg); - j := Strings.Length(dst); - NEW(s, i + j + Strings.Length(msgPRIVMSG) + 6(* to fit a colon and two spaces and eol *)); - COPY(msgPRIVMSG, s^); - Strings.Append(' ', s^); - Strings.Append(dst, s^); - Strings.Append(' :', s^); - Strings.Append(msg, s^); - sh.appendLFCR(s^); - Out.String("sending: "); Out.String(s^); Out.Ln; - b := Send(inst, s^); -END sendMsgToDst; - -PROCEDURE processFurther(VAR inst: instance; VAR line: ARRAY OF CHAR); -VAR - message: ARRAY msgLen OF CHAR; - userpart, username, identname : ARRAY 64 OF CHAR; - host: ARRAY 64 OF CHAR; - messagetype: ARRAY 16 OF CHAR; - rcpt: ARRAY 64 OF CHAR; - b: BOOLEAN; - mn: BOOLEAN; - i: INTEGER; -BEGIN - i := 0; mn := FALSE; b := FALSE; - b := getUser(line, userpart); - b := getMsgType(line, messagetype); - - IF (messagetype = msgNOTICE) OR (messagetype = msgJOIN) OR - (messagetype = msgQUIT) OR (messagetype = msgPRIVMSG) OR - (messagetype = msgPART) THEN - - IF messagetype = msgPRIVMSG THEN - b := getUserName(userpart, username); - b := getIdentName(userpart, identname); - b := getHost(userpart, host); - b := getRecipient(line, rcpt); - b := getMsg(line, message); - END; - - IF messagetype = msgNOTICE THEN - username := ""; - identname := ""; - host := userpart; - Strings.Delete(host, 0, 1); - b := getRecipient(line, rcpt); - b := getMsg(line, message); - END; - - IF messagetype = msgJOIN THEN - b := getUserName(userpart, username); - b := getIdentName(userpart, identname); - b := getHost(userpart, host); - b := getRecipient(line, rcpt); - message := ""; - END; - - IF (messagetype = msgQUIT) THEN - b := getUserName(userpart, username); - b := getIdentName(userpart, identname); - b := getHost(userpart, host); - rcpt := ""; - message := ""; - Strings.FindNext(":", line, 1, b, i); - sh.getTillEOL(line, i, message); - END; - - IF (messagetype = msgPART) THEN - b := getUserName(userpart, username); - b := getIdentName(userpart, identname); - b := getHost(userpart, host); - b := getRecipient(line, rcpt); - message := ""; - END; - - IF rcpt = inst.nick THEN (* private message *) - inst.callbackPrivate(message, messagetype, username, identname, host); - ELSE - mn := isMention(inst.nick, message); - IF mn THEN - log(inst, message, messagetype, username, identname, rcpt); - cutMentionFromMessage(inst.nick, message); - inst.callbackPublicMention(message, messagetype, username, identname, rcpt, host); - ELSE - log(inst, message, messagetype, username, identname, rcpt); - inst.callbackPublic(message, messagetype, username, identname, rcpt, host); - END; - END; - ELSE - Out.String("unknown msg type: '"); Out.String(messagetype); Out.String("' - ignoring!"); Out.Ln; - END; -END processFurther; - -PROCEDURE processLineByLine(VAR inst: instance; VAR text: ARRAY OF CHAR); -VAR - i : INTEGER; - pstrs: sh.pstrings; -BEGIN - pstrs := sh.textToPstrings(text); - i := 0; - REPEAT - Out.Int(i, 0); Out.String(": '"); Out.String(pstrs^[i]^); Out.String("'"); Out.Ln; - processFurther(inst, pstrs^[i]^); - INC(i) - UNTIL i = LEN(pstrs^); -END processLineByLine; - -PROCEDURE processResponse(VAR inst: instance; VAR text: ARRAY OF CHAR): BOOLEAN; -VAR - b : BOOLEAN; -BEGIN - b := TRUE; - IF isPing(text) THEN - Pong(inst, text); - END; - IF error(text) THEN - finalize(inst); - b := FALSE; - ELSE - IF isServerMsg(text) THEN (* string starts with ':' *) - IF sh.contains1(text, rplWelcome) THEN (* string contains '001' *) - ModeAndJoin(inst); - ELSE - processLineByLine(inst, text); - END; - END; - END; - RETURN b; -END processResponse; - -PROCEDURE Loop*(VAR inst: instance); -VAR - b, b2 : BOOLEAN; - txt : ARRAY msgLen OF CHAR; -BEGIN - REPEAT - b := Receive(inst, txt); - b2 := processResponse(inst, txt); - UNTIL ~b OR ~b2; -END Loop; - -PROCEDURE setDebug*(state: BOOLEAN); -BEGIN - debug := state -END setDebug; - -BEGIN - eol[0] := LF; eol[1] := CR; - debug := FALSE; -END IRC. diff --git a/JsonParser.Mod b/JsonParser.Mod new file mode 100644 index 0000000..c733d88 --- /dev/null +++ b/JsonParser.Mod @@ -0,0 +1,3 @@ +MODULE JsonParser; +PROCEDURE +END JsonParser. \ No newline at end of file diff --git a/http.Mod b/http.Mod index e5c1f07..0fcf715 100644 --- a/http.Mod +++ b/http.Mod @@ -1,5 +1,5 @@ MODULE http; -IMPORT Internet, Out; +IMPORT Internet, Logger; VAR buff: ARRAY 1000 OF CHAR; PROCEDURE get(host, port: ARRAY OF CHAR; VAR buff: ARRAY OF CHAR); @@ -24,6 +24,5 @@ END get; BEGIN get("voto.am", "80", buff); - Out.String(buff); - Out.Ln; + Logger.Log(buff); END http. \ No newline at end of file diff --git a/logger.Mod b/logger.Mod new file mode 100644 index 0000000..0ef60aa --- /dev/null +++ b/logger.Mod @@ -0,0 +1,26 @@ +MODULE Logger; +IMPORT time, Out; + +PROCEDURE Log*(buff: ARRAY OF CHAR); +VAR + year, month, day, hour, min, sec: LONGINT; +BEGIN + time.Now(year, month, day, hour, min, sec); + + Out.Int(year, 4); + Out.String("/"); + Out.Int(month, 2); + Out.String("/"); + Out.Int(day, 2); + Out.String(" "); + Out.Int(hour, 2); + Out.String("-"); + Out.Int(min, 2); + Out.String("-"); + Out.Int(sec, 2); + Out.String(" "); + Out.String(buff); + Out.Ln; +END Log; + +END Logger. \ No newline at end of file diff --git a/makefile b/makefile index 1e3cddb..32755ac 100644 --- a/makefile +++ b/makefile @@ -5,14 +5,14 @@ all: $(VOC) -s types.Mod sockets.Mod netdb.Mod Internet.Mod stringHelpers.Mod time.Mod IRC.Mod test.Mod -m http: - $(VOC) -s types.Mod sockets.Mod netdb.Mod Internet.Mod http.Mod -m + $(VOC) -s types.Mod sockets.Mod netdb.Mod Internet.Mod time.Mod logger.Mod http.Mod -m clean: - rm *.h - rm *.c - rm *.o - rm *.sym - rm http + rm *.h & + rm *.c & + rm *.o & + rm *.sym & + rm http & -test: http +test: clean http ./http \ No newline at end of file diff --git a/test.Mod b/test.Mod deleted file mode 100644 index 8ba4b8e..0000000 --- a/test.Mod +++ /dev/null @@ -1,91 +0,0 @@ -MODULE test; (* noch 13.4.2017 / 18.5.2017*) - -IMPORT IRC, Out, Strings := ooc2Strings, Platform; - -(* i am moving these to global section to make possible for interrupt handler to access instance *) -VAR - inst: IRC.instance; - channels : IRC.Channels; - b: BOOLEAN; - - -(* -PROCEDURE onMessage(VAR msg : ARRAY OF CHAR); -BEGIN - Out.String("callback procedure is running, youhoo!"); Out.Ln; - Out.String("input:"); Out.Ln; - Out.String(msg); Out.String("|"); Out.Ln; - Out.Ln; -END onMessage; -*) -PROCEDURE onPrivateMessage(VAR msg, msgtype, user, ident, host: ARRAY OF CHAR); -BEGIN - Out.String("*** private message ***"); Out.Ln; - Out.String("message: '"); Out.String(msg); Out.Char("'"); Out.Ln; - Out.String("message type: '"); Out.String(msgtype); Out.Char("'"); Out.Ln; - Out.String("user: '"); Out.String(user); Out.Char("'"); Out.Ln; - Out.String("ident: '"); Out.String(ident); Out.Char("'"); Out.Ln; - Out.String("host: '"); Out.String(host); Out.Char("'"); Out.Ln; - Out.String("*** that's it ***"); Out.Ln; - IRC.sendMsgToDst(inst, user, "hello, nice to meet you"); -END onPrivateMessage; - -PROCEDURE onPublicMessage(VAR msg, msgtype, user, ident, rcpt, host: ARRAY OF CHAR); -BEGIN - Out.String("*** public message ***"); Out.Ln; - Out.String("message: '"); Out.String(msg); Out.Char("'"); Out.Ln; - Out.String("message type: '"); Out.String(msgtype); Out.Char("'"); Out.Ln; - Out.String("user: '"); Out.String(user); Out.Char("'"); Out.Ln; - Out.String("ident: '"); Out.String(ident); Out.Char("'"); Out.Ln; - Out.String("recipient: '"); Out.String(rcpt); Out.Char("'"); Out.Ln; - Out.String("host: '"); Out.String(host); Out.Char("'"); Out.Ln; - Out.String("*** that's it ***"); Out.Ln; - IF msgtype # IRC.msgJOIN THEN IRC.sendMsgToDst(inst, rcpt, "test back") END; -END onPublicMessage; - -PROCEDURE onPublicMessageWithMention(VAR msg, msgtype, user, ident, rcpt, host: ARRAY OF CHAR); -BEGIN - Out.String("*** public message, bot name mentioned ***"); Out.Ln; - Out.String("message: '"); Out.String(msg); Out.Char("'"); Out.Ln; - Out.String("message type: '"); Out.String(msgtype); Out.Char("'"); Out.Ln; - Out.String("user: '"); Out.String(user); Out.Char("'"); Out.Ln; - Out.String("ident: '"); Out.String(ident); Out.Char("'"); Out.Ln; - Out.String("recipient: '"); Out.String(rcpt); Out.Char("'"); Out.Ln; - Out.String("host: '"); Out.String(host); Out.Char("'"); Out.Ln; - Out.String("*** that's it ***"); Out.Ln; -END onPublicMessageWithMention; - -PROCEDURE interrupt(i: LONGINT); -BEGIN -(* here we need to flush files to disk before exiting. and probably close the irc connection *) - Out.String("interrupt caught."); Out.Ln; - IRC.finalize(inst); - HALT(0); -END interrupt; - -BEGIN - inst.owner := "norayr_tanakian"; - inst.user := "norayr_tanakian"; - inst.nick := "vocbot"; - inst.host := "irc.freenode.net"; - inst.port := "6667"; - inst.callbackPrivate := onPrivateMessage; - inst.callbackPublic := onPublicMessage; - inst.callbackPublicMention := onPublicMessageWithMention; - - - - NEW(channels, 2); - channels[0].channel := "#oberon-test"; - channels[1].channel := "#pascal-test"; - IRC.setLogging(inst, TRUE); - IRC.initChannelList(inst, channels); - - Platform.SetInterruptHandler(interrupt); - - IF IRC.Connect(inst) # FALSE THEN - b := IRC.Auth(inst); - IRC.Loop(inst); - END; - -END test.