From: Art Cancro Date: Sat, 31 Jul 1999 07:17:07 +0000 (+0000) Subject: ICQ changes X-Git-Tag: v7.86~7585 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=0e46236bf34e80bb9b59daab42b65b743cf0b9ba ICQ changes --- diff --git a/citadel/citserver.c b/citadel/citserver.c index e0785b680..c5cc618a4 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -41,7 +41,6 @@ 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 diff --git a/citadel/citserver.h b/citadel/citserver.h index c19e13e14..0db931cb8 100644 --- a/citadel/citserver.h +++ b/citadel/citserver.h @@ -29,4 +29,3 @@ void CtdlAllocUserData(unsigned long requested_sym, size_t num_bytes); int CtdlGetDynamicSymbol(void); extern int do_defrag; -int (*CtdlSendExpressMessageFunc) (char *, char *, char *); diff --git a/citadel/dynloader.c b/citadel/dynloader.c index 4b3b5d995..2fe4a9e52 100644 --- a/citadel/dynloader.c +++ b/citadel/dynloader.c @@ -37,6 +37,7 @@ struct LogFunctionHook *LogHookTable = NULL; struct CleanupFunctionHook *CleanupHookTable = NULL; struct SessionFunctionHook *SessionHookTable = NULL; struct UserFunctionHook *UserHookTable = NULL; +struct XmsgFunctionHook *XmsgHookTable = NULL; struct ProtoFunctionHook { void (*handler) (char *cmdbuf); @@ -193,6 +194,21 @@ void CtdlRegisterUserHook(void (*fcn_ptr) (char *, long), int EventType) } +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; @@ -225,3 +241,15 @@ void PerformUserHooks(char *username, long usernum, int EventType) } } } + +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; +} diff --git a/citadel/dynloader.h b/citadel/dynloader.h index 2f4e36050..3091896b4 100644 --- a/citadel/dynloader.h +++ b/citadel/dynloader.h @@ -7,6 +7,8 @@ void CtdlRegisterSessionHook(void (*fcn_ptr)(void), int EventType); 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); diff --git a/citadel/serv_chat.c b/citadel/serv_chat.c index 451123702..b340575c5 100644 --- a/citadel/serv_chat.c +++ b/citadel/serv_chat.c @@ -44,13 +44,12 @@ extern struct CitContext *ContextList; 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$"; } @@ -550,7 +549,7 @@ void cmd_sexp(char *argbuf) } /* 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; @@ -567,12 +566,12 @@ void cmd_sexp(char *argbuf) 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) diff --git a/citadel/serv_icq.c b/citadel/serv_icq.c index a4802d566..7832300db 100644 --- a/citadel/serv_icq.c +++ b/citadel/serv_icq.c @@ -1995,15 +1995,11 @@ void CtdlICQ_Incoming_Message(DWORD uin, BYTE hour, BYTE minute, 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); } @@ -2018,6 +2014,28 @@ CtdlICQ_InfoReply(unsigned long uin, const char *nick, + +/* 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 0) icq_SendMessage(atol(recp), msg); + return(1); +} + + + + + + char *Dynamic_Module_Init(void) { /* Make sure we've got a valid ThisICQ for each session */ @@ -2030,6 +2048,7 @@ char *Dynamic_Module_Init(void) 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; diff --git a/citadel/server.h b/citadel/server.h index 6f1093fd5..85fb36930 100644 --- a/citadel/server.h +++ b/citadel/server.h @@ -180,6 +180,7 @@ struct cdbdata { }; + /* Structures and declarations for function hooks of various types */ struct LogFunctionHook { @@ -196,6 +197,8 @@ struct CleanupFunctionHook { 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 @@ -222,6 +225,9 @@ extern struct SessionFunctionHook *SessionHookTable; #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 @@ -238,6 +244,25 @@ extern struct UserFunctionHook *UserHookTable; #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;