ref: 1484fc83f17c4b303eb7620479f7f87f781779fb
author: Kelly Glenn <bubstance@proton.me>
date: Sun Nov 10 23:38:12 EST 2024
initial commit
--- /dev/null
+++ b/LABEL
@@ -1,0 +1,6 @@
+#!/bin/rc
+# LABEL - persistent label
+# usage: LABEL name
+
+label $*
+bind /dev/null /dev/label
--- /dev/null
+++ b/chat
@@ -1,0 +1,48 @@
+#!/bin/rc
+# chat - a gridchat client
+# usage: chat
+# requires:
+# - chat-fmt
+# - mq (https://shithub.us/ori/mq/HEAD/info.html)
+# - newsrv
+# - LABEL
+
+if(~ $#nick 1)
+ user=$nick
+
+fn chatg{
+ label chatg
+ grep -i '[^a-z0-9]'$user'([^a-z0-9]|$)' /n/chatbuf/chat | grep -v '^'$user' →' | chat-fmt
+}
+
+fn chati{
+ label chati
+ while(){
+ echo -n '→ ' >> /dev/text
+ read | sed '1s/^/'$user' → /' >>/n/chat/chat
+ }
+}
+
+fn chatv{
+ label chatv
+ </n/chatbuf/chat chat-fmt
+}
+
+fn chatstart{
+ srv tcp!chat.tcp80.org!9990 chat.$pid
+ mount /srv/chat.$pid /n/chat tail:0
+
+ dims=`{read -c60 /dev/window}
+ height=`{echo $dims(5) - $dims(3) | hoc}
+ width=`{echo $dims(4) - $dims(2)| hoc}
+ hchat=`{echo $height - 200 | hoc}
+
+ mq -c -m /n/chatbuf -s mq.$pid
+ cat /n/chat/chat > /n/chatbuf/chat &
+ window -m -r 0 0 $width 100 -scroll rc -c chatg
+ window -m -r 0 100 $width $hchat -scroll rc -c chatv
+ window -m -r 0 $hchat $width $height -scroll rc -c chati
+}
+
+rfork ne
+window 880,40,1560,860 newsrv 'LABEL gridchat; rio -i ''rc -c chatstart'''
--- /dev/null
+++ b/chat-fmt.c
@@ -1,0 +1,58 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+#define LINELEN 80
+
+const Rune sep = L'→';
+
+void fatal(char *s) {
+ sysfatal(s);
+}
+
+int main(void) {
+ Biobuf *i;
+ Biobuf *o;
+ char *line;
+ char *tok;
+ int toklen;
+ int linelen;
+ int j;
+ int f;
+
+ i = Bfdopen(0, OREAD);
+ o = Bfdopen(1, OWRITE);
+
+ Blethal(i, fatal);
+ Blethal(o, fatal);
+
+ while((line = Brdstr(i, '\n', 1)) != nil) {
+ f = 1;
+ linelen = 0;
+ tok = line;
+ while((tok = strtok(tok, " ")) != 0) {
+ int nicklen = 0;
+ int toklen = strlen(tok);
+ if (f) {
+ nicklen = toklen;
+ linelen = nicklen + 2;
+ f = 0;
+ }
+ if (linelen + toklen + 1 > LINELEN) {
+ Bputc(o, '\n');
+ for(j = 0; j <= nicklen + 2; ++j, Bwrite(o, " ", 1));
+ linelen = nicklen + 3;
+ }
+ Bwrite(o, tok, toklen);
+ Bwrite(o, " ", 1);
+ linelen += toklen + 1;
+ tok = nil;
+ }
+ Bwrite(o, "\n", 1);
+ Bflush(o);
+ }
+ Bterm(i);
+ Bterm(o);
+
+ return 0;
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,19 @@
+</$objtype/mkfile
+
+BIN=/$objtype/bin
+TARG=chat-fmt
+OFILES=chat-fmt.$O
+
+UPDATE=\
+ mkfile\
+ chat\
+ chat-fmt.c
+
+</sys/src/cmd/mkmany
+
+install:V:
+ for (i in $TARG)
+ mk $MKFLAGS $i.install
+ cp chat /rc/bin/chat
+ cp newsrv /rc/bin/newsrv
+ cp LABEL /rc/bin/LABEL
--- /dev/null
+++ b/newsrv
@@ -1,0 +1,14 @@
+#!/bin/rc -x
+# newsrv - create a new /srv device
+# usage: newsrv command
+
+rfork ens
+
+<[3]/srv/clone{
+ id=`{<[0=3]read}
+ <[3=]@{ # close the clone fd
+ rfork n
+ bind -c /srv/$id /srv
+ rc -c $*
+ }
+}