ref: 64b336b2488cbb42d73b2fead4222c6c20f598f5
parent: 5faaebfda65c44b6a87bd337ea5ee5fe80db98de
author: sl <sl@x1yg3>
date: Sat Jul 5 22:24:53 EDT 2025
add wircrc
--- a/INDEX
+++ b/INDEX
@@ -31,5 +31,6 @@
top - approximates the top command on unix (author unknown)
tpl - Create tangara playlists in matching directories under ../Playlists/.
trackpoint - Set preferred X11 mouse acceleration for ThinkPad trackpoint.
+wircrc - rio irc client (by cinap_lenrek)
vtb - run vt -b with proper size fonts
zombie - launch uxn/zombie.rom
--- /dev/null
+++ b/wircrc
@@ -1,0 +1,272 @@
+#!/bin/rc
+# by cinap_lenrek
+
+wins=()
+cons=()
+chans=()
+
+server=irc.oftc.net
+realname='<nil>'
+nick=$user
+
+bind '#|' /n/wircrc
+
+rfork en
+
+fn wmk {+ id=$1
+ >/n/wircrc/data1 {+ @{+ rfork s
+ d=/n/wircrc.$id
+ p=`{cat /dev/ppid}+ mount $wsys $d 'new -scroll -pid '^$p || exit
+ echo -n $id >$d/label
+ echo wnew $id $d $p
+ <$d/cons {+ while(line=`{read}){+ ~ $line '' || echo wtype $id $line
+ }
+ }
+ }
+ echo wclose $id
+ }
+ exit
+}
+
+fn wio {+ if(~ $1 $wins){+ d=wd$1
+ d=$$d
+ shift
+ @{echo $* >$d/cons}+ }
+}
+
+fn sio {+ d=$1
+ if(~ $d *!*)
+ d=`{echo $d | awk -F'!' '{print $1}'}+ if(~ $d $cons){+ d=cd$d
+ d=$$d
+ shift
+ @{echo $* >$d/data}+ }
+}
+
+fn wctl {+ if(~ $1 $wins){+ d=wd$1
+ d=$$d
+ shift
+ @{echo $* >$d/wctl}+ }
+}
+
+fn hangup {+ if(~ $1 $cons){+ d=cd$1
+ d=$$d
+ @{echo hangup >$d/ctl} &+ }
+}
+
+fn netdial { # insert tlsclient here+#cinap_lenrek → netdial gets called with some program args
+#cinap_lenrek → that it expects to be run with the network connection on stdin/stdout
+#cinap_lenrek → which is basically what tlsclient already does :)
+#cinap_lenrek → so instead of manually open tcp files and shit and writing connect and then redirecting data file
+#cinap_lenrek → you could just run tlsclient in there
+#cinap_lenrek → or do it in csdial
+#cinap_lenrek → its the same thing
+#cinap_lenrek → basically, csdial does the name resolution shit
+#cinap_lenrek → calling netdial with each address resolved
+#cinap_lenrek → it shouldnt be too hard to understand
+ <$1 {+ conn=`{basename -d $1}^/^`{read}+ echo -n connect $2 >$conn/ctl >[2]/dev/null || exit 'connect failed'
+ <$conn/data >$conn/data {+ shift
+ shift
+ $*
+ exit
+ }
+ }
+}
+fn csdial {+ echo $2 | ndb/csquery $1/cs | sed 's/> //g;/^$/d' |
+ while(l=`{read} && ~ $#l 2 && ! @{netdial $l $*(3-)}){+ status=failed
+ }
+}
+fn dial {+ csdial /net $* || csdial /net.alt $*
+}
+
+fn irc {+ >[3]/n/wircrc/data1 {+ echo cnew $1 $conn >[1=3]
+ tr -d '
' | @{+ while(line=`{read}){+ #echo xxx $line >/dev/cons
+ if(~ $line(1) PING)
+ echo PONG $line(2-)
+ if not {+ line=`{echo $line | sed '+s/^:([^!]+)[^\ ]+\ PRIVMSG\ (#[^\ ]+)[^:]+:(.*)$/cmsg '$1'!\2 \1 \3/g;
+s/^:([^!]+)[^\ ]+\ PRIVMSG\ :?([^\ ]+)[^:]+:(.*)$/cmsg '$1'!\1 \1 \3/g;
+s/^:([^!]+)[^\ ]+\ NOTICE\ \*[^:]+:(.*)$/cmsg '$1' \1 \2/g;
+s/^:([^!]+)[^\ ]+\ NOTICE\ ([^\ ]+)[^:]+:(.*)$/cmsg '$1'!\1 \1 \3/g;
+s/^:([^!]+)[^\ ]+\ ([0123456789]+)[^:]+:?(.*)$/xmsg '$1' \2 \3/g;
+s/^:([^!]+)[^\ ]+\ (MODE|TOPIC)\ (#[^\ ]+)\ :?(.*)$/xmsg '$1'!\3 \2 \4/g;
+s/^:([^!]+)[^\ ]+\ (QUIT|NICK)\ :(.*)$/xmsg '$1' \2 \1 \3/g;
+s/^:([^!]+)[^\ ]+\ (JOIN|PART)\ (#[^\ ]+).*$/xmsg '$1'!\3 \2 \1/g;
+'}
+ ~ $line '' || echo $line >[1=3]
+ }
+ }
+ }
+ echo cclose $1 >[1=3]
+ }
+}
+
+fn shutdown {+ for(i in $cons)
+ hangup $i
+ for(i in $wins){+ d=wp$i
+ d=$$d
+ @{echo hangup >/proc/$d/notepg} &+ }
+ exec cat /n/wircrc/data >/dev/null
+}
+
+fn sighup {+ shutdown
+}
+
+fn sigint {+ shutdown
+}
+
+wmk $server &
+dial tcp!$server!6667 irc $server &
+
+</n/wircrc/data {+ while(a=`{read}){+ id=$a(2)
+ switch($a(1)){+ case cnew
+ cd$id=$a(3)
+ cons=($id $cons)
+ sio $id USER $user foo bar :$realname
+ sio $id NICK $nick
+ for(i in $chans){+ if(~ $i $id!'#'*)
+ sio $id JOIN `{echo $i | awk -F'!' '{print $2}'}+ }
+ case cclose
+ d=cd$id
+ $d=()
+ oids=$cons
+ cons=()
+ for(i in $oids){+ if(! ~ $i $id)
+ cons=($i $cons)
+ }
+ for(i in $wins){+ if(~ $i $id || ~ $i $id!*)
+ wio $i HUNGUP $id
+ }
+ case wnew
+ wd$id=$a(3)
+ wp$id=$a(4)
+ wins=($id $wins)
+ wio $id '---' $id '---'
+ case wclose
+ d=wd$id
+ p=wp$id
+ unmount $$d
+ $d=()
+ $p=()
+ oids=$wins
+ wins=()
+ for(i in $oids){+ if(! ~ $i $id)
+ wins=($i $wins)
+ }
+ if(~ $id $chans){+ oids=$chans
+ chans=()
+ for(i in $oids){+ if(! ~ $i $id)
+ chans=($i $chans)
+ }
+ sio $id PART `{echo $id | awk -F'!' '{print $2}'}+ }
+ case xmsg
+ if(~ $id $wins)
+ wio $id $a(3-)
+ if not {+ for(i in $wins){+ if(~ $i $id!*)
+ wio $i $a(3-)
+ }
+ }
+ case cmsg
+ if(~ $id $wins)
+ wio $id $a(3) '→' $a(4-)
+ if not if(! ~ $id *!'#'*){+ id=`{echo $id | awk -F'!' '{print $1}'}+ for(i in $wins)
+ if(~ $i $id || ~ $i $id!*)
+ wio $i /t $a(3) '→' $a(4-)
+ }
+ case wtype
+ switch($a(3)){+ case /x
+ shutdown
+ case /s
+ server=$a(4)
+ if(! ~ $server '' && ! ~ $server $cons){+ if(! ~ $server $wins)
+ wmk $server &
+ dial tcp!$server!6667 irc $server &
+ }
+ case /j /t
+ target=$a(4)
+ server=`{echo $id | awk -F'!' '{print $1}'}+ if(! ~ $target '' && ~ $server $cons){+ id=$server!$target
+ if(~ $id $wins){+ wctl $id unhide
+ wctl $id current
+ }
+ if not {+ wmk $id &
+ }
+ if(~ $a(3) /j && ~ $target '#'*){+ if(! ~ $id $chans){+ chans=($id $chans)
+ sio $server JOIN $target
+ }
+ }
+ }
+ case /h
+ if(~ $a(3) $cons)
+ id=$a(3)
+ hangup `{echo $id | awk -F'!' '{print $1}'}+ case *
+ target=`{echo $id | awk -F'!' '{print $2}'}+ if(~ $target '')
+ sio $id $a(3-)
+ if not {+ a=$a(3-)
+ sio $id PRIVMSG $target ':'^$"a
+ }
+ }
+ }
+ }
+}
+shutdown
--
⑨