Refactor colorMentions to be seprintf-like
parent
34c4407797
commit
8d654bc3a4
82
handle.c
82
handle.c
|
@ -1255,42 +1255,37 @@ static bool isMention(const struct Message *msg) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void colorMentions(char *buf, size_t cap, uint id, struct Message *msg) {
|
static char *colorMentions(char *ptr, char *end, uint id, const char *msg) {
|
||||||
*buf = '\0';
|
// Consider words before a colon, or only the first two.
|
||||||
|
const char *split = strstr(msg, ": ");
|
||||||
char *split = strstr(msg->params[1], ": ");
|
|
||||||
if (!split) {
|
if (!split) {
|
||||||
split = strchr(msg->params[1], ' ');
|
split = strchr(msg, ' ');
|
||||||
if (split) split = strchr(&split[1], ' ');
|
if (split) split = strchr(&split[1], ' ');
|
||||||
}
|
}
|
||||||
if (!split) split = &msg->params[1][strlen(msg->params[1])];
|
if (!split) split = &msg[strlen(msg)];
|
||||||
for (char *ch = msg->params[1]; ch < split; ++ch) {
|
// Bail if there is existing formatting.
|
||||||
if (iscntrl(*ch)) return;
|
for (const char *ch = msg; ch < split; ++ch) {
|
||||||
|
if (iscntrl(*ch)) goto rest;
|
||||||
}
|
}
|
||||||
char delimit = *split;
|
|
||||||
char *mention = msg->params[1];
|
|
||||||
msg->params[1] = (delimit ? &split[1] : split);
|
|
||||||
*split = '\0';
|
|
||||||
|
|
||||||
char *ptr = buf, *end = &buf[cap];
|
while (msg < split) {
|
||||||
while (*mention) {
|
size_t skip = strspn(msg, ",:<> ");
|
||||||
size_t skip = strspn(mention, ",<> ");
|
ptr = seprintf(ptr, end, "%.*s", (int)skip, msg);
|
||||||
ptr = seprintf(ptr, end, "%.*s", (int)skip, mention);
|
msg += skip;
|
||||||
mention += skip;
|
|
||||||
|
|
||||||
size_t len = strcspn(mention, ",<> ");
|
size_t len = strcspn(msg, ",:<> ");
|
||||||
char punct = mention[len];
|
char *p = seprintf(ptr, end, "%.*s", (int)len, msg);
|
||||||
mention[len] = '\0';
|
enum Color color = completeColor(id, ptr);
|
||||||
enum Color color = completeColor(id, mention);
|
|
||||||
if (color != Default) {
|
if (color != Default) {
|
||||||
ptr = seprintf(ptr, end, "\3%02d%s\3", color, mention);
|
ptr = seprintf(ptr, end, "\3%02d%.*s\3", color, (int)len, msg);
|
||||||
} else {
|
} else {
|
||||||
ptr = seprintf(ptr, end, "%s", mention);
|
ptr = p;
|
||||||
}
|
}
|
||||||
mention[len] = punct;
|
msg += len;
|
||||||
mention += len;
|
|
||||||
}
|
}
|
||||||
seprintf(ptr, end, "%c", delimit);
|
|
||||||
|
rest:
|
||||||
|
return seprintf(ptr, end, "%s", msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handlePrivmsg(struct Message *msg) {
|
static void handlePrivmsg(struct Message *msg) {
|
||||||
|
@ -1314,7 +1309,8 @@ static void handlePrivmsg(struct Message *msg) {
|
||||||
bool notice = (msg->cmd[0] == 'N');
|
bool notice = (msg->cmd[0] == 'N');
|
||||||
bool action = !notice && isAction(msg);
|
bool action = !notice && isAction(msg);
|
||||||
bool highlight = !mine && isMention(msg);
|
bool highlight = !mine && isMention(msg);
|
||||||
enum Heat heat = filterCheck((highlight || query ? Hot : Warm), id, msg);
|
enum Heat heat = (!notice && (highlight || query) ? Hot : Warm);
|
||||||
|
heat = filterCheck(heat, id, msg);
|
||||||
if (heat > Warm && !mine && !query) highlight = true;
|
if (heat > Warm && !mine && !query) highlight = true;
|
||||||
if (!notice && !mine && heat > Ice) {
|
if (!notice && !mine && heat > Ice) {
|
||||||
completeTouch(id, msg->nick, hash(msg->user));
|
completeTouch(id, msg->nick, hash(msg->user));
|
||||||
|
@ -1322,34 +1318,34 @@ static void handlePrivmsg(struct Message *msg) {
|
||||||
if (heat > Ice) urlScan(id, msg->nick, msg->params[1]);
|
if (heat > Ice) urlScan(id, msg->nick, msg->params[1]);
|
||||||
|
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
char *ptr = buf, *end = &buf[sizeof(buf)];
|
||||||
if (notice) {
|
if (notice) {
|
||||||
if (id != Network) {
|
if (id != Network) {
|
||||||
logFormat(id, tagTime(msg), "-%s- %s", msg->nick, msg->params[1]);
|
logFormat(id, tagTime(msg), "-%s- %s", msg->nick, msg->params[1]);
|
||||||
}
|
}
|
||||||
uiFormat(
|
ptr = seprintf(
|
||||||
id, filterCheck(Warm, id, msg), tagTime(msg),
|
ptr, end, "\3%d-%s-\3%d\t",
|
||||||
"\3%d-%s-\3%d\t%s",
|
hash(msg->user), msg->nick, LightGray
|
||||||
hash(msg->user), msg->nick, LightGray, msg->params[1]
|
|
||||||
);
|
);
|
||||||
} else if (action) {
|
} else if (action) {
|
||||||
logFormat(id, tagTime(msg), "* %s %s", msg->nick, msg->params[1]);
|
logFormat(id, tagTime(msg), "* %s %s", msg->nick, msg->params[1]);
|
||||||
colorMentions(buf, sizeof(buf), id, msg);
|
ptr = seprintf(
|
||||||
uiFormat(
|
ptr, end, "%s\35\3%d* %s\17\35\t",
|
||||||
id, heat, tagTime(msg),
|
(highlight ? "\26" : ""), hash(msg->user), msg->nick
|
||||||
"%s\35\3%d* %s\17\35\t%s%s",
|
|
||||||
(highlight ? "\26" : ""), hash(msg->user), msg->nick,
|
|
||||||
buf, msg->params[1]
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
logFormat(id, tagTime(msg), "<%s> %s", msg->nick, msg->params[1]);
|
logFormat(id, tagTime(msg), "<%s> %s", msg->nick, msg->params[1]);
|
||||||
colorMentions(buf, sizeof(buf), id, msg);
|
ptr = seprintf(
|
||||||
uiFormat(
|
ptr, end, "%s\3%d<%s>\17\t",
|
||||||
id, heat, tagTime(msg),
|
(highlight ? "\26" : ""), hash(msg->user), msg->nick
|
||||||
"%s\3%d<%s>\17\t%s%s",
|
|
||||||
(highlight ? "\26" : ""), hash(msg->user), msg->nick,
|
|
||||||
buf, msg->params[1]
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if (notice) {
|
||||||
|
ptr = seprintf(ptr, end, "%s", msg->params[1]);
|
||||||
|
} else {
|
||||||
|
ptr = colorMentions(ptr, end, id, msg->params[1]);
|
||||||
|
}
|
||||||
|
uiWrite(id, heat, tagTime(msg), buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handlePing(struct Message *msg) {
|
static void handlePing(struct Message *msg) {
|
||||||
|
|
Loading…
Reference in New Issue