ref: 15f05a0ca14c062e2f718cff0af2f097c6e6d228
dir: /wircrc/
#!/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