struct CitContext *ContextList = NULL;
int ScheduledShutdown = 0;
int do_defrag = 0;
-int (*CtdlSendExpressMessageFunc) (char *, char *, char *) = NULL;
/*
* Various things that need to be initialized at startup
int CtdlGetDynamicSymbol(void);
extern int do_defrag;
-int (*CtdlSendExpressMessageFunc) (char *, char *, char *);
struct CleanupFunctionHook *CleanupHookTable = NULL;
struct SessionFunctionHook *SessionHookTable = NULL;
struct UserFunctionHook *UserHookTable = NULL;
+struct XmsgFunctionHook *XmsgHookTable = NULL;
struct ProtoFunctionHook {
void (*handler) (char *cmdbuf);
}
+void CtdlRegisterXmsgHook(int (*fcn_ptr) (char *, char *, char *) )
+{
+
+ struct XmsgFunctionHook *newfcn;
+
+ newfcn = (struct XmsgFunctionHook *)
+ mallok(sizeof(struct XmsgFunctionHook));
+ newfcn->next = XmsgHookTable;
+ newfcn->h_function_pointer = fcn_ptr;
+ XmsgHookTable = newfcn;
+
+ lprintf(5, "Registered a new x-msg function\n");
+}
+
+
void PerformSessionHooks(int EventType)
{
struct SessionFunctionHook *fcn;
}
}
}
+
+int PerformXmsgHooks(char *sender, char *recp, char *msg)
+{
+ struct XmsgFunctionHook *fcn;
+ int total_sent = 0;
+
+ for (fcn = XmsgHookTable; fcn != NULL; fcn = fcn->next) {
+ total_sent +=
+ (*fcn->h_function_pointer) (sender, recp, msg);
+ }
+ return total_sent;
+}
void PerformLogHooks(int loglevel, char *logmsg);
void PerformSessionHooks(int EventType);
void PerformUserHooks(char *username, long usernum, int EventType);
+int PerformXmsgHooks(char *, char *, char *);
void CtdlRegisterProtoHook(void (*handler)(char *), char *cmd, char *desc);
void CtdlRegisterUserHook(void (*fcn_ptr)(char*, long), int EventType);
+void CtdlRegisterXmsgHook(int (*fcn_ptr)(char *, char *, char *));
char *Dynamic_Module_Init(void);
char *Dynamic_Module_Init(void)
{
- CtdlSendExpressMessageFunc = send_express_message;
-
CtdlRegisterProtoHook(cmd_chat, "CHAT", "Begin real-time chat");
CtdlRegisterProtoHook(cmd_pexp, "PEXP", "Poll for express messages");
CtdlRegisterProtoHook(cmd_gexp, "GEXP", "Get express messages");
CtdlRegisterProtoHook(cmd_sexp, "SEXP", "Send an express message");
CtdlRegisterSessionHook(delete_express_messages, EVT_STOP);
+ CtdlRegisterXmsgHook(send_express_message);
return "$Id$";
}
}
/* This loop handles text-transfer pages */
if (!strcmp(x_msg, "-")) {
- message_sent = send_express_message(lun, x_user, "");
+ message_sent = PerformXmsgHooks(lun, x_user, "");
if (message_sent == 0) {
cprintf("%d No user '%s' logged in.\n", ERROR, x_user);
return;
strcat(x_big_msgbuf, "\n");
strcat(x_big_msgbuf, x_msg);
}
- send_express_message(lun, x_user, x_big_msgbuf);
+ PerformXmsgHooks(lun, x_user, x_big_msgbuf);
phree(x_big_msgbuf);
/* This loop handles inline pages */
} else {
- message_sent = send_express_message(lun, x_user, x_msg);
+ message_sent = PerformXmsgHooks(lun, x_user, x_msg);
if (message_sent > 0) {
if (strlen(x_msg) > 0)
const char *msg) {
char from[256];
- char nick[256];
+ int num_delivered;
sprintf(from, "%ld@icq", uin);
- if (CtdlSendExpressMessageFunc) {
- CtdlSendExpressMessageFunc(from, CC->curr_user, msg);
- lprintf(9, "Converted incoming message.\n");
- } else {
- lprintf(7, "Hmm, no CtdlSendExpressMessageFunc defined!\n");
- }
+ num_delivered = PerformXmsgHooks(from, CC->curr_user, msg);
+ lprintf(9, "Delivered to %d users\n", num_delivered);
}
+
+/* send an icq */
+
+int CtdlICQ_Send_Msg(char *from, char *recp, char *msg) {
+ int is_icq = 0;
+ int i;
+
+ /* Return quietly if this isn't an ICQ page */
+ for (i=0; i<strlen(recp); ++i)
+ if (!strcasecmp(&recp[i], "@icq")) is_icq = 1;
+ if (atol(recp)==0L) is_icq = 0;
+ if (is_icq == 0) return(0);
+
+ if (strlen(msg) > 0) icq_SendMessage(atol(recp), msg);
+ return(1);
+}
+
+
+
+
+
+
char *Dynamic_Module_Init(void)
{
/* Make sure we've got a valid ThisICQ for each session */
CtdlRegisterSessionHook(CtdlICQ_session_login_hook, EVT_LOGIN);
CtdlRegisterSessionHook(CtdlICQ_after_cmd_hook, EVT_CMD);
CtdlRegisterProtoHook(cmd_icql, "ICQL", "Log on to ICQ");
+ CtdlRegisterXmsgHook(CtdlICQ_Send_Msg);
/* Tell the code formerly known as icqlib about our callbacks */
icq_Log = CtdlICQlog;
};
+
/* Structures and declarations for function hooks of various types */
struct LogFunctionHook {
extern struct CleanupFunctionHook *CleanupHookTable;
+
+
/*
* SessionFunctionHook extensions are used for any type of hook for which
* the context in which it's being called (which is determined by the event
#define EVT_CMD 6 /* Called after each server command */
+
+
+
/*
* UserFunctionHook extensions are used for any type of hook which implements
* an operation on a user or username (potentially) other than the one
#define EVT_OUTPUTMSG 101 /* Outputting a message */
+
+
+/*
+ * ExpressMessageFunctionHook extensions are used for hooks which implement
+ * the sending of an express message through various channels. Any function
+ * registered should return the number of recipients to whom the message was
+ * successfully transmitted.
+ */
+struct XmsgFunctionHook {
+ struct XmsgFunctionHook *next;
+ int (*h_function_pointer) (char *, char *, char *);
+};
+extern struct XmsgFunctionHook *XmsgHookTable;
+
+
+
+
+
+
/* Defines the relationship of a user to a particular room */
struct visit {
long v_roomnum;