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
--
⑨