/* Do not remove the headers from this file! see /USAGE for more info. */
#include <triggers.h>
inherit "/std/object/msg_recipient";
void respond(string);
class pattern {
string pattern;
mixed action;
string left, right;
int type_to_listen;
}
private int counter = 1;
private mapping patterns = ([ 0 : ({}) ]);
varargs void add_pattern(string pattern, mixed action, mixed left, mixed right,int type) {
class pattern pat = new(class pattern);
pat->pattern = pattern;
pat->action = action;
pat->left = left;
pat->right = right;
pat->type_to_listen=type;
patterns[0] += ({ pat });
}
varargs void add_sub_pattern(mixed rule, string pattern, mixed action,
mixed left, mixed right) {
class pattern pat = new(class pattern);
pat->pattern = pattern;
pat->action = action;
pat->left = left;
pat->right = right;
if (patterns[rule])
patterns[rule] += ({ pat });
else
patterns[rule] = ({ pat });
}
mixed try_to_match(string str, string rule) {
class pattern pat;
mixed left, right;
if (!str || !rule || !patterns[rule])
return str;
foreach (pat in patterns[rule]) {
if (!pat->pattern
|| str == pat->pattern || sscanf(str, pat->pattern, left, right)) {
left = try_to_match(left, pat->left);
right = try_to_match(right, pat->right);
return evaluate(pat->action, left, right);
}
}
return str;
}
varargs void check_msg(string str,int type) {
class pattern pat;
mixed left, right;
mixed ret;
str = terminal_colour(str, ANSI_D->query_translations()[1], sizeof(str));
// strip trailing newline and whitespace
while (str != "" && member_array(str[<1], " \t\n") != -1)
str = str[0..<2];
foreach (pat in patterns[0]) {
if(pat->type_to_listen&&
!(type&pat->type_to_listen))
continue;
if (!pat->pattern ||
str == pat->pattern ||
sscanf(str, pat->pattern, left, right))
{
left = try_to_match(left, pat->left);
right = try_to_match(right, pat->right);
if (stringp(pat->action))
ret = pat->action;
else {
ret = evaluate(pat->action, left, right);
if (!stringp(ret)) continue;
}
respond(ret);
return;
}
}
}
varargs void
receive_inside_msg(string msg,object array exclude,int message_type,mixed other)
{
::receive_inside_msg(msg,exclude,message_type,other);
check_msg(msg,LISTEN_INSIDE);
}
varargs void
receive_outside_msg(string msg, object array exclude,int message_type,mixed other)
{
::receive_outside_msg(msg,exclude,message_type,other);
check_msg(msg,LISTEN_OUTSIDE);
}
varargs void
receive_private_msg(string msg, int message_type, mixed other)
{
::receive_private_msg(msg,message_type,other);
check_msg(msg,LISTEN_PRIVATE);
}