about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2020-07-10 15:26:16 -0400
committerJune McEnroe <june@causal.agency>2020-07-10 15:26:16 -0400
commit1d82d8219b4018cfe02ec871a900059470666a35 (patch)
tree52ca53000fc865f55a465ffacceb9e1231e1be50
parentImplement partial table output of events (diff)
downloadscooper-1d82d8219b4018cfe02ec871a900059470666a35.tar.gz
scooper-1d82d8219b4018cfe02ec871a900059470666a35.zip
Add IRC colors and implement nick coloring
-rw-r--r--Makefile4
-rw-r--r--color.css304
-rw-r--r--html.c23
3 files changed, 328 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index 56f5f15..cd9f014 100644
--- a/Makefile
+++ b/Makefile
@@ -26,8 +26,8 @@ ${OBJS}: server.h
 
 server.o: default.css.h
 
-default.css.h: default.css
-	file2c < default.css > $@
+default.css.h: default.css color.css
+	cat default.css color.css | file2c > $@
 
 test: .test
 
diff --git a/color.css b/color.css
new file mode 100644
index 0000000..f51630c
--- /dev/null
+++ b/color.css
@@ -0,0 +1,304 @@
+:root {
+	--irc00: #ffffff;
+	--irc01: #000000;
+	--irc02: #00007f;
+	--irc03: #009300;
+	--irc04: #ff0000;
+	--irc05: #7f0000;
+	--irc06: #9c009c;
+	--irc07: #fc7f00;
+	--irc08: #ffff00;
+	--irc09: #00fc00;
+	--irc10: #009393;
+	--irc11: #00ffff;
+	--irc12: #0000fc;
+	--irc13: #ff00ff;
+	--irc14: #7f7f7f;
+	--irc15: #d2d2d2;
+	--irc16: #470000;
+	--irc17: #472100;
+	--irc18: #474700;
+	--irc19: #324700;
+	--irc20: #004700;
+	--irc21: #00472c;
+	--irc22: #004747;
+	--irc23: #002747;
+	--irc24: #000047;
+	--irc25: #2e0047;
+	--irc26: #470047;
+	--irc27: #47002a;
+	--irc28: #740000;
+	--irc29: #743a00;
+	--irc30: #747400;
+	--irc31: #517400;
+	--irc32: #007400;
+	--irc33: #007449;
+	--irc34: #007474;
+	--irc35: #004074;
+	--irc36: #000074;
+	--irc37: #4b0074;
+	--irc38: #740074;
+	--irc39: #740045;
+	--irc40: #b50000;
+	--irc41: #b56300;
+	--irc42: #b5b500;
+	--irc43: #7db500;
+	--irc44: #00b500;
+	--irc45: #00b571;
+	--irc46: #00b5b5;
+	--irc47: #0063b5;
+	--irc48: #0000b5;
+	--irc49: #7500b5;
+	--irc50: #b500b5;
+	--irc51: #b5006b;
+	--irc52: #ff0000;
+	--irc53: #ff8c00;
+	--irc54: #ffff00;
+	--irc55: #b2ff00;
+	--irc56: #00ff00;
+	--irc57: #00ffa0;
+	--irc58: #00ffff;
+	--irc59: #008cff;
+	--irc60: #0000ff;
+	--irc61: #a500ff;
+	--irc62: #ff00ff;
+	--irc63: #ff0098;
+	--irc64: #ff5959;
+	--irc65: #ffb459;
+	--irc66: #ffff71;
+	--irc67: #cfff60;
+	--irc68: #6fff6f;
+	--irc69: #65ffc9;
+	--irc70: #6dffff;
+	--irc71: #59b4ff;
+	--irc72: #5959ff;
+	--irc73: #c459ff;
+	--irc74: #ff66ff;
+	--irc75: #ff59bc;
+	--irc76: #ff9c9c;
+	--irc77: #ffd39c;
+	--irc78: #ffff9c;
+	--irc79: #e2ff9c;
+	--irc80: #9cff9c;
+	--irc81: #9cffdb;
+	--irc82: #9cffff;
+	--irc83: #9cd3ff;
+	--irc84: #9c9cff;
+	--irc85: #dc9cff;
+	--irc86: #ff9cff;
+	--irc87: #ff94d3;
+	--irc88: #000000;
+	--irc89: #131313;
+	--irc90: #282828;
+	--irc91: #363636;
+	--irc92: #4d4d4d;
+	--irc93: #656565;
+	--irc94: #818181;
+	--irc95: #9f9f9f;
+	--irc96: #bcbcbc;
+	--irc97: #e2e2e2;
+	--irc98: #ffffff;
+	--irc99: inherit;
+}
+
+.fg00 { color: var(--irc00); }
+.fg01 { color: var(--irc01); }
+.fg02 { color: var(--irc02); }
+.fg03 { color: var(--irc03); }
+.fg04 { color: var(--irc04); }
+.fg05 { color: var(--irc05); }
+.fg06 { color: var(--irc06); }
+.fg07 { color: var(--irc07); }
+.fg08 { color: var(--irc08); }
+.fg09 { color: var(--irc09); }
+.fg10 { color: var(--irc10); }
+.fg11 { color: var(--irc11); }
+.fg12 { color: var(--irc12); }
+.fg13 { color: var(--irc13); }
+.fg14 { color: var(--irc14); }
+.fg15 { color: var(--irc15); }
+.fg16 { color: var(--irc16); }
+.fg17 { color: var(--irc17); }
+.fg18 { color: var(--irc18); }
+.fg19 { color: var(--irc19); }
+.fg20 { color: var(--irc20); }
+.fg21 { color: var(--irc21); }
+.fg22 { color: var(--irc22); }
+.fg23 { color: var(--irc23); }
+.fg24 { color: var(--irc24); }
+.fg25 { color: var(--irc25); }
+.fg26 { color: var(--irc26); }
+.fg27 { color: var(--irc27); }
+.fg28 { color: var(--irc28); }
+.fg29 { color: var(--irc29); }
+.fg30 { color: var(--irc30); }
+.fg31 { color: var(--irc31); }
+.fg32 { color: var(--irc32); }
+.fg33 { color: var(--irc33); }
+.fg34 { color: var(--irc34); }
+.fg35 { color: var(--irc35); }
+.fg36 { color: var(--irc36); }
+.fg37 { color: var(--irc37); }
+.fg38 { color: var(--irc38); }
+.fg39 { color: var(--irc39); }
+.fg40 { color: var(--irc40); }
+.fg41 { color: var(--irc41); }
+.fg42 { color: var(--irc42); }
+.fg43 { color: var(--irc43); }
+.fg44 { color: var(--irc44); }
+.fg45 { color: var(--irc45); }
+.fg46 { color: var(--irc46); }
+.fg47 { color: var(--irc47); }
+.fg48 { color: var(--irc48); }
+.fg49 { color: var(--irc49); }
+.fg50 { color: var(--irc50); }
+.fg51 { color: var(--irc51); }
+.fg52 { color: var(--irc52); }
+.fg53 { color: var(--irc53); }
+.fg54 { color: var(--irc54); }
+.fg55 { color: var(--irc55); }
+.fg56 { color: var(--irc56); }
+.fg57 { color: var(--irc57); }
+.fg58 { color: var(--irc58); }
+.fg59 { color: var(--irc59); }
+.fg60 { color: var(--irc60); }
+.fg61 { color: var(--irc61); }
+.fg62 { color: var(--irc62); }
+.fg63 { color: var(--irc63); }
+.fg64 { color: var(--irc64); }
+.fg65 { color: var(--irc65); }
+.fg66 { color: var(--irc66); }
+.fg67 { color: var(--irc67); }
+.fg68 { color: var(--irc68); }
+.fg69 { color: var(--irc69); }
+.fg70 { color: var(--irc70); }
+.fg71 { color: var(--irc71); }
+.fg72 { color: var(--irc72); }
+.fg73 { color: var(--irc73); }
+.fg74 { color: var(--irc74); }
+.fg75 { color: var(--irc75); }
+.fg76 { color: var(--irc76); }
+.fg77 { color: var(--irc77); }
+.fg78 { color: var(--irc78); }
+.fg79 { color: var(--irc79); }
+.fg80 { color: var(--irc80); }
+.fg81 { color: var(--irc81); }
+.fg82 { color: var(--irc82); }
+.fg83 { color: var(--irc83); }
+.fg84 { color: var(--irc84); }
+.fg85 { color: var(--irc85); }
+.fg86 { color: var(--irc86); }
+.fg87 { color: var(--irc87); }
+.fg88 { color: var(--irc88); }
+.fg89 { color: var(--irc89); }
+.fg90 { color: var(--irc90); }
+.fg91 { color: var(--irc91); }
+.fg92 { color: var(--irc92); }
+.fg93 { color: var(--irc93); }
+.fg94 { color: var(--irc94); }
+.fg95 { color: var(--irc95); }
+.fg96 { color: var(--irc96); }
+.fg97 { color: var(--irc97); }
+.fg98 { color: var(--irc98); }
+.fg99 { color: var(--irc99); }
+
+.bg00 { background-color: var(--irc00); }
+.bg01 { background-color: var(--irc01); }
+.bg02 { background-color: var(--irc02); }
+.bg03 { background-color: var(--irc03); }
+.bg04 { background-color: var(--irc04); }
+.bg05 { background-color: var(--irc05); }
+.bg06 { background-color: var(--irc06); }
+.bg07 { background-color: var(--irc07); }
+.bg08 { background-color: var(--irc08); }
+.bg09 { background-color: var(--irc09); }
+.bg10 { background-color: var(--irc10); }
+.bg11 { background-color: var(--irc11); }
+.bg12 { background-color: var(--irc12); }
+.bg13 { background-color: var(--irc13); }
+.bg14 { background-color: var(--irc14); }
+.bg15 { background-color: var(--irc15); }
+.bg16 { background-color: var(--irc16); }
+.bg17 { background-color: var(--irc17); }
+.bg18 { background-color: var(--irc18); }
+.bg19 { background-color: var(--irc19); }
+.bg20 { background-color: var(--irc20); }
+.bg21 { background-color: var(--irc21); }
+.bg22 { background-color: var(--irc22); }
+.bg23 { background-color: var(--irc23); }
+.bg24 { background-color: var(--irc24); }
+.bg25 { background-color: var(--irc25); }
+.bg26 { background-color: var(--irc26); }
+.bg27 { background-color: var(--irc27); }
+.bg28 { background-color: var(--irc28); }
+.bg29 { background-color: var(--irc29); }
+.bg30 { background-color: var(--irc30); }
+.bg31 { background-color: var(--irc31); }
+.bg32 { background-color: var(--irc32); }
+.bg33 { background-color: var(--irc33); }
+.bg34 { background-color: var(--irc34); }
+.bg35 { background-color: var(--irc35); }
+.bg36 { background-color: var(--irc36); }
+.bg37 { background-color: var(--irc37); }
+.bg38 { background-color: var(--irc38); }
+.bg39 { background-color: var(--irc39); }
+.bg40 { background-color: var(--irc40); }
+.bg41 { background-color: var(--irc41); }
+.bg42 { background-color: var(--irc42); }
+.bg43 { background-color: var(--irc43); }
+.bg44 { background-color: var(--irc44); }
+.bg45 { background-color: var(--irc45); }
+.bg46 { background-color: var(--irc46); }
+.bg47 { background-color: var(--irc47); }
+.bg48 { background-color: var(--irc48); }
+.bg49 { background-color: var(--irc49); }
+.bg50 { background-color: var(--irc50); }
+.bg51 { background-color: var(--irc51); }
+.bg52 { background-color: var(--irc52); }
+.bg53 { background-color: var(--irc53); }
+.bg54 { background-color: var(--irc54); }
+.bg55 { background-color: var(--irc55); }
+.bg56 { background-color: var(--irc56); }
+.bg57 { background-color: var(--irc57); }
+.bg58 { background-color: var(--irc58); }
+.bg59 { background-color: var(--irc59); }
+.bg60 { background-color: var(--irc60); }
+.bg61 { background-color: var(--irc61); }
+.bg62 { background-color: var(--irc62); }
+.bg63 { background-color: var(--irc63); }
+.bg64 { background-color: var(--irc64); }
+.bg65 { background-color: var(--irc65); }
+.bg66 { background-color: var(--irc66); }
+.bg67 { background-color: var(--irc67); }
+.bg68 { background-color: var(--irc68); }
+.bg69 { background-color: var(--irc69); }
+.bg70 { background-color: var(--irc70); }
+.bg71 { background-color: var(--irc71); }
+.bg72 { background-color: var(--irc72); }
+.bg73 { background-color: var(--irc73); }
+.bg74 { background-color: var(--irc74); }
+.bg75 { background-color: var(--irc75); }
+.bg76 { background-color: var(--irc76); }
+.bg77 { background-color: var(--irc77); }
+.bg78 { background-color: var(--irc78); }
+.bg79 { background-color: var(--irc79); }
+.bg80 { background-color: var(--irc80); }
+.bg81 { background-color: var(--irc81); }
+.bg82 { background-color: var(--irc82); }
+.bg83 { background-color: var(--irc83); }
+.bg84 { background-color: var(--irc84); }
+.bg85 { background-color: var(--irc85); }
+.bg86 { background-color: var(--irc86); }
+.bg87 { background-color: var(--irc87); }
+.bg88 { background-color: var(--irc88); }
+.bg89 { background-color: var(--irc89); }
+.bg90 { background-color: var(--irc90); }
+.bg91 { background-color: var(--irc91); }
+.bg92 { background-color: var(--irc92); }
+.bg93 { background-color: var(--irc93); }
+.bg94 { background-color: var(--irc94); }
+.bg95 { background-color: var(--irc95); }
+.bg96 { background-color: var(--irc96); }
+.bg97 { background-color: var(--irc97); }
+.bg98 { background-color: var(--irc98); }
+.bg99 { background-color: var(--irc99); }
diff --git a/html.c b/html.c
index 9f929e6..c1e4b15 100644
--- a/html.c
+++ b/html.c
@@ -237,15 +237,36 @@ static enum kcgi_err eventContext(struct khtmlreq *html, struct Event event) {
 	return error;
 }
 
+static int hash(const char *str) {
+	if (*str == '~') str++;
+	uint32_t hash = 0;
+	for (; *str; ++str) {
+		hash = (hash << 5) | (hash >> 27);
+		hash ^= *str;
+		hash *= 0x27220A95;
+	}
+	return 2 + hash % 74;
+}
+
 static enum kcgi_err eventNick(struct khtmlreq *html, struct Event event) {
+	char color[sizeof("fg99")];
+	snprintf(color, sizeof(color), "fg%02d", hash(event.user));
+
 	char *mask = NULL;
 	asprintf(&mask, "%s!%s@%s", event.nick, event.user, event.host);
 	if (!mask) err(EX_OSERR, "asprintf");
+
 	enum kcgi_err error = 0
 		|| khtml_attr(html, KELEM_TD, KATTR_CLASS, "nick", KATTR__MAX)
-		|| khtml_attr(html, KELEM_SPAN, KATTR_TITLE, mask, KATTR__MAX)
+		|| khtml_attr(
+			html, KELEM_SPAN,
+			KATTR_CLASS, color,
+			KATTR_TITLE, mask,
+			KATTR__MAX
+		)
 		|| khtml_puts(html, event.nick)
 		|| khtml_closeelem(html, 2);
+
 	free(mask);
 	return error;
 }