ICQ changes
authorArt Cancro <ajc@citadel.org>
Sat, 31 Jul 1999 07:17:07 +0000 (07:17 +0000)
committerArt Cancro <ajc@citadel.org>
Sat, 31 Jul 1999 07:17:07 +0000 (07:17 +0000)
citadel/citserver.c
citadel/citserver.h
citadel/dynloader.c
citadel/dynloader.h
citadel/serv_chat.c
citadel/serv_icq.c
citadel/server.h

index e0785b680bb729f946f4ec316d73ccb299ee3b45..c5cc618a41f0dd3c467cb9453b8280ab59ab88b2 100644 (file)
@@ -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
index c19e13e14cce75a249ac719383311260764ee0c3..0db931cb89f6bed47a6338e99c31b533e30d2707 100644 (file)
@@ -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 *);
index 4b3b5d9959a19b0d2a61bc8528d0704f33a436ed..2fe4a9e52d47c8cd3d5dd1c303b1359a6f6d5851 100644 (file)
@@ -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;
+}
index 2f4e360504877e7eb450f6d0f9146e90e92a1944..3091896b4405981ba6881379fd738dbeb3f87e3d 100644 (file)
@@ -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);
index 4511237020f75b95b5157ed7ef92e683504ba86f..b340575c54b372fbc244e3232fa0474a07e31061 100644 (file)
@@ -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)
index a4802d566e970eba6412935c1882a16e89333a28..7832300db8ed4d25569b6acfaf3f7ed4bf75f1e7 100644 (file)
@@ -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<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 */
@@ -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;
index 6f1093fd52da6b31fe0ff3082b4e97c7bb01131f..85fb36930712ba0085ea8facf737e5365973fd5b 100644 (file)
@@ -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;