parsing and several events; -- noch

This commit is contained in:
norayr 2017-05-18 03:55:31 +04:00
parent 1cac25c181
commit 3d496ea58d
2 changed files with 79 additions and 24 deletions

53
IRC.Mod
View file

@ -28,9 +28,9 @@ CONST
chnlist* = POINTER TO ARRAY OF chn; chnlist* = POINTER TO ARRAY OF chn;
msg* = ARRAY msgLen OF CHAR; msg* = ARRAY msgLen OF CHAR;
cbMessage* = PROCEDURE(VAR msg : ARRAY OF CHAR); (* cb stands for callback *) cbMessage* = PROCEDURE(VAR msg : ARRAY OF CHAR); (* cb stands for callback *)
cbPrivateMessage* = PROCEDURE (VAR msg, fromUser, fromIdent, ip: ARRAY OF CHAR); cbPrivateMessage* = PROCEDURE (VAR msg, user, ident, host: ARRAY OF CHAR);
cbPublicMessage* = PROCEDURE (VAR msg, fromUser, fromIdent, room, ip: ARRAY OF CHAR); cbPublicMessage* = PROCEDURE (VAR msg, user, ident, rcpt, host: ARRAY OF CHAR);
cbPublicMessageWithMention* = PROCEDURE(VAR msg, fromUser, fromIdent, room, ip: ARRAY OF CHAR); cbPublicMessageWithMention* = PROCEDURE(VAR msg, user, ident, rcpt, host: ARRAY OF CHAR); (* rcpt is usually the room in case of public messages *)
instance* = RECORD instance* = RECORD
@ -458,6 +458,25 @@ BEGIN
RETURN b; RETURN b;
END getHost; 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);
Out.String("str: "); Out.String(str); Out.Ln;
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 parse(VAR inst: instance; VAR line: ARRAY OF CHAR); PROCEDURE parse(VAR inst: instance; VAR line: ARRAY OF CHAR);
VAR VAR
message: ARRAY msgLen OF CHAR; message: ARRAY msgLen OF CHAR;
@ -466,32 +485,32 @@ VAR
messagetype: ARRAY 16 OF CHAR; messagetype: ARRAY 16 OF CHAR;
rcpt: ARRAY 64 OF CHAR; rcpt: ARRAY 64 OF CHAR;
b: BOOLEAN; b: BOOLEAN;
mn: BOOLEAN;
BEGIN BEGIN
b := getUser(line, user); b := getUser(line, user);
b := getMsgType(line, messagetype); b := getMsgType(line, messagetype);
b := getRecipient(line, rcpt); b := getRecipient(line, rcpt);
b := getMsg(line, message); b := getMsg(line, message);
IF messagetype = msgPRIVMSG THEN IF messagetype = msgPRIVMSG THEN
b := getUserName(user, username); b := getUserName(user, username);
b := getIdentName(user, identname); b := getIdentName(user, identname);
b := getHost(user, host); b := getHost(user, host);
Out.String("username: "); Out.String(username); Out.String("|"); Out.Ln;
Out.String("identname: "); Out.String(identname); Out.String("|"); Out.Ln;
Out.String("host: "); Out.String(host); Out.String("|"); Out.Ln;
END; END;
Out.String("user: "); Out.String(user); Out.String("|"); Out.Ln; IF rcpt = inst.nick THEN (* private message *)
Out.String("message type: "); Out.String(messagetype); Out.String("|"); Out.Ln; inst.callbackPrivate(message, username, identname, host);
Out.String("recipient: "); Out.String(rcpt); Out.String("|"); Out.Ln; ELSE
Out.String("message: "); Out.String(message); Out.String("|"); Out.Ln; mn := isMention(inst.nick, message);
IF mn THEN
inst.callbackSimple(line); cutMentionFromMessage(inst.nick, message);
inst.callbackPublicMention(message, username, identname, rcpt, host);
ELSE
inst.callbackPublic(message, username, identname, rcpt, host);
END;
END;
END parse; END parse;
@ -508,7 +527,7 @@ BEGIN
b := FALSE; b := FALSE;
ELSE ELSE
IF serverMsg(line) THEN (* string starts with ':' *) IF serverMsg(line) THEN (* string starts with ':' *)
IF rplWelcome(line) THEN (* strting contains '001' *) IF rplWelcome(line) THEN (* string contains '001' *)
ModeAndJoin(inst); ModeAndJoin(inst);
ELSE ELSE
parse(inst, line); parse(inst, line);

View file

@ -3,13 +3,46 @@ MODULE test;
IMPORT IRC, Out, Strings := ooc2Strings; IMPORT IRC, Out, Strings := ooc2Strings;
PROCEDURE clbk(VAR msg : ARRAY OF CHAR); PROCEDURE onMessage(VAR msg : ARRAY OF CHAR);
BEGIN BEGIN
Out.String("callback procedure is running, youhoo!"); Out.Ln; Out.String("callback procedure is running, youhoo!"); Out.Ln;
Out.String("input:"); Out.Ln; Out.String("input:"); Out.Ln;
Out.String(msg); Out.String("|"); Out.Ln; Out.String(msg); Out.String("|"); Out.Ln;
Out.Ln; Out.Ln;
END clbk; END onMessage;
PROCEDURE onPrivateMessage(VAR msg, 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("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;
END onPrivateMessage;
PROCEDURE onPublicMessage(VAR msg, 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("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 onPublicMessage;
PROCEDURE onPublicMessageWithMention(VAR msg, 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("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 testBot; PROCEDURE testBot;
VAR VAR
@ -22,7 +55,10 @@ BEGIN
inst.nick := "vocbot"; inst.nick := "vocbot";
inst.host := "irc.freenode.net"; inst.host := "irc.freenode.net";
inst.port := "6667"; inst.port := "6667";
inst.callbackSimple := clbk; inst.callbackSimple := onMessage;
inst.callbackPrivate := onPrivateMessage;
inst.callbackPublic := onPublicMessage;
inst.callbackPublicMention := onPublicMessageWithMention;