Implement message splitting
parent
be4283b8ff
commit
3bb3a11454
43
command.c
43
command.c
|
@ -14,6 +14,7 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -52,12 +53,48 @@ static void echoMessage(char *cmd, uint id, char *params) {
|
|||
handle(msg);
|
||||
}
|
||||
|
||||
static void splitMessage(char *cmd, uint id, char *params) {
|
||||
if (!params) return;
|
||||
// FIXME: Get USERLEN, HOSTLEN from ISUPPORT and assume worst case if
|
||||
// self.user and self.host are unset?
|
||||
const char *nick = self.nick;
|
||||
const char *user = (self.user ? self.user : "*");
|
||||
const char *host = (self.host ? self.host : "*");
|
||||
int overhead = snprintf(
|
||||
NULL, 0, ":%s!%s@%s %s %s :\r\n",
|
||||
nick, user, host, cmd, idNames[id]
|
||||
);
|
||||
assert(overhead > 0 && overhead < 512);
|
||||
int chunk = 512 - overhead;
|
||||
if (strlen(params) <= (size_t)chunk) {
|
||||
echoMessage(cmd, id, params);
|
||||
return;
|
||||
}
|
||||
|
||||
while (*params) {
|
||||
int len = 0;
|
||||
for (int n = 0; len + n <= chunk; len += n) {
|
||||
n = mblen(¶ms[len], 1 + strlen(¶ms[len]));
|
||||
if (n < 0) {
|
||||
n = 1;
|
||||
mblen(NULL, 0);
|
||||
}
|
||||
if (!n) break;
|
||||
}
|
||||
char ch = params[len];
|
||||
params[len] = '\0';
|
||||
echoMessage(cmd, id, params);
|
||||
params[len] = ch;
|
||||
params += len;
|
||||
}
|
||||
}
|
||||
|
||||
static void commandPrivmsg(uint id, char *params) {
|
||||
echoMessage("PRIVMSG", id, params);
|
||||
splitMessage("PRIVMSG", id, params);
|
||||
}
|
||||
|
||||
static void commandNotice(uint id, char *params) {
|
||||
echoMessage("NOTICE", id, params);
|
||||
splitMessage("NOTICE", id, params);
|
||||
}
|
||||
|
||||
static void commandMe(uint id, char *params) {
|
||||
|
@ -68,7 +105,7 @@ static void commandMe(uint id, char *params) {
|
|||
|
||||
static void commandMsg(uint id, char *params) {
|
||||
id = idFor(strsep(¶ms, " "));
|
||||
echoMessage("PRIVMSG", id, params);
|
||||
splitMessage("PRIVMSG", id, params);
|
||||
}
|
||||
|
||||
static void commandJoin(uint id, char *params) {
|
||||
|
|
Loading…
Reference in New Issue