Add user command support for sending private messages.

Can send to either the currently selected user (the %[userSID] keyword
substitution) or a given SID. To make the latter useful (e.g, for
commands sent to a bot) support for static SIDs is needed.
This commit is contained in:
Blair Bonnett 2012-08-02 21:13:34 +12:00
parent 66854bc204
commit 2608f6be76
4 changed files with 66 additions and 0 deletions

View File

@ -200,6 +200,7 @@ void plugin_register_callback_functions(struct plugin_handle* handle)
handle->hub.set_description = cbfunc_set_hub_description;
handle->hub.ucmd_create = cbfunc_ucmd_create;
handle->hub.ucmd_add_chat = cbfunc_ucmd_add_chat;
handle->hub.ucmd_add_pm = cbfunc_ucmd_add_pm;
handle->hub.ucmd_send = cbfunc_ucmd_send;
handle->hub.ucmd_free = cbfunc_ucmd_free;
}

View File

@ -145,6 +145,59 @@ int cbfunc_ucmd_add_chat(struct plugin_handle* plugin, struct plugin_ucmd* ucmd,
return 1;
}
int cbfunc_ucmd_add_pm(struct plugin_handle* plugin, struct plugin_ucmd* ucmd, const char* to, const char* message, int echo)
{
/* Double-escape the message - once for when the client sends it back, and
* then again to insert it into the user command message we send to them. */
char* temp = adc_msg_escape(message);
char* escmsg = adc_msg_escape(temp);
free(temp);
size_t msglen = strlen(escmsg);
/* If no target SID is given, use the keyword expansion %[userSID] for the
* client to fill in with the currently selected user. */
size_t tolen = (to == NULL) ? 10 : 4;
/* Format of an echoed PM: "EMSG\s%[mySID]\s<target SID>\s<double-escaped message>\sPM%[mySID]\n".
* Format of a non-echoed PM: "DMSG\s%[mySID]\s<target SID>\s<double-escaped message>\sPM%[mySID]\n". */
size_t required = 32 + tolen + msglen;
if(required > (ucmd->capacity - ucmd->length))
{
if(ucmd_expand_tt(ucmd, ucmd->capacity + required) == 0)
{
plugin->error_msg = "Could not expand memory to store private message.";
free(escmsg);
return 0;
}
}
/* Start with the appropriate ADC command plus the client SID placeholder. */
if(echo) strncpy(ucmd->tt + ucmd->length, "EMSG\\s%[mySID]\\s", 16);
else strncpy(ucmd->tt + ucmd->length, "DMSG\\s%[mySID]\\s", 16);
ucmd->length += 16;
/* Copy the target ID. */
if(to != NULL) strncpy(ucmd->tt + ucmd->length, to, tolen);
else strncpy(ucmd->tt + ucmd->length, "%[userSID]", tolen);
ucmd->length += tolen;
/* Space between target and message. */
ucmd->tt[ucmd->length++] = '\\';
ucmd->tt[ucmd->length++] = 's';
/* Message. */
strncpy(ucmd->tt + ucmd->length, escmsg, msglen);
ucmd->length += msglen;
free(escmsg);
/* Add the PM flag and final line break. */
strncpy(ucmd->tt + ucmd->length, "\\sPM%[mySID]\\n", 14);
ucmd->length += 14;
/* Done. */
return 1;
}
int cbfunc_ucmd_send(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_ucmd* ucmd)
{
/* Make sure we have a command. */

View File

@ -38,6 +38,16 @@ extern struct plugin_ucmd* cbfunc_ucmd_create(struct plugin_handle* plugin, cons
*/
extern int cbfunc_ucmd_add_chat(struct plugin_handle* plugin, struct plugin_ucmd* ucmd, const char* message, int me);
/* Add a private message to be sent when the user command is clicked.
* To: The SID of the user to send the message to. Leave it blank to send to
* the user that was right-clicked in the user list (i.e., a context-based
* message - only effective if the user command is in the user category).
* Echo: If true, the message is also echoed to the sending user as in a normal
* PM. If false, it is only sent to the target user and the sending user
* will only see any response.
*/
extern int cbfunc_ucmd_add_pm(struct plugin_handle* plugin, struct plugin_ucmd* ucmd, const char* to, const char* message, int echo);
/* Send the user command to a user. */
extern int cbfunc_ucmd_send(struct plugin_handle* plugin, struct plugin_user* user, struct plugin_ucmd* ucmd);

View File

@ -125,6 +125,7 @@ typedef void (*hfunc_set_hub_description)(struct plugin_handle*, const char*);
typedef struct plugin_ucmd* (*hfunc_ucmd_create)(struct plugin_handle*, const char*, size_t);
typedef int (*hfunc_ucmd_add_chat)(struct plugin_handle*, struct plugin_ucmd*, const char*, int);
typedef int (*hfunc_ucmd_add_pm)(struct plugin_handle*, struct plugin_ucmd*, const char*, const char*, int);
typedef int (*hfunc_ucmd_send)(struct plugin_handle*, struct plugin_user*, struct plugin_ucmd*);
typedef void (*hfunc_ucmd_free)(struct plugin_handle*, struct plugin_ucmd*);
@ -147,6 +148,7 @@ struct plugin_hub_funcs
hfunc_set_hub_description set_description;
hfunc_ucmd_create ucmd_create;
hfunc_ucmd_add_chat ucmd_add_chat;
hfunc_ucmd_add_pm ucmd_add_pm;
hfunc_ucmd_send ucmd_send;
hfunc_ucmd_free ucmd_free;
};