shithub: rc

Download patch

ref: 62a138c2d03cd012f11ca3cee47d2b98ae2efdda
parent: 374de2252e8f8e797ed93fcd853216c2e6fd3264
author: qwx <qwx@sciops.net>
date: Thu Jan 9 10:45:00 EST 2020

add swedish wircrc fork

--- /dev/null
+++ b/wircrc
@@ -1,0 +1,315 @@
+#!/bin/rc
+wins=()
+cons=()
+server=irc.freenode.net
+port=6667
+tls=0
+pass=()
+srvpass=()
+chans=()
+realname='<nil>'
+nick=$user
+
+while (~ $1 -*) {
+	switch ($1) {
+	case -c
+		chans=`{echo $2 | sed 's/,/ /'}
+		shift
+	case -n
+		nick=$2
+		shift
+	case -p
+		port=$2
+		shift
+	case -r
+		realname=$2
+		shift
+	case -T
+		tls=1
+	case -*
+		echo 'usage: wircrc [-c chans] [-n nick] [-p port] [-r realname] [-T] [server]' >[1=2]
+		exit 'usage'	
+	}
+	shift
+}
+if(~ $#* 1)
+	server=$1
+
+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 | tr -d \x0a >$d/label
+			echo wnew $id $d $p
+			if(! ~ $#* 1)
+				echo cmsg $id $*(2-)
+			<$d/cons {
+				while(line=`{read}){
+					~ $line '' || echo wtype $id $line
+				}
+			}
+		}
+		echo wclose $id
+	}
+	exit
+}
+
+fn etime {
+	date -t | sed 's/-//g;s/^..(.*)T(..):(..).*/\1:\2\3/'
+}
+
+fn wio {
+	if(~ $1 $wins){
+		d=wd$1
+		d=$$d
+		@{echo `{etime} $*(2-) | tee -a /tmp/irc.^$1 >$d/cons}
+	}
+}
+
+fn sio {
+	d=$1
+	if(~ $d *!*)
+		d=`{echo $d | awk -F'!' '{print $1}'}
+	if(~ $d $cons){
+		d=cd$d
+		d=$$d
+		@{echo $*(2-) >$d/data}
+		@{echo $*(2-) | sed -n 's/^PRIVMSG [^ ]+ :/'^`{etime}^' '^$nick^' ⇒ /p' >>/tmp/irc^.$1}
+	}
+}
+
+fn wctl {
+	if(~ $1 $wins){
+		d=wd$1
+		d=$$d
+		shift
+		@{echo $* >$d/wctl}
+	}
+}
+
+fn hangup {
+	if(~ $1 $cons){
+		d=cpid$1
+		d=$$d
+		@{echo kill >/proc/$d/notepg}
+	}
+}
+
+fn getkey {
+	a=`{auth/userpasswd 'server='^$1^' service=irc user='^$nick >[2]/dev/null}
+	if(~ $#a 2)
+		pass=$a(2)
+	a=`{auth/userpasswd 'server='^$1^' service=ircsrv user='^$nick >[2]/dev/null}
+	if(~ $#a 2)
+		srvpass=$a(2)
+	a=()
+}
+
+fn dial {
+	c=/n/wircrc.$1
+	bind '#|' $c
+	if(~ $2 1){
+		tlsclient $1 <>$c/data1 >[1=0] &
+	}
+	if not{
+		aux/trampoline $1 <>$c/data1 >[1=0] &
+	}
+	<>/$c/data >[1=0]{
+		$*(3-) $c $apid
+		exit
+	}
+}
+
+fn irc {
+	>[3]/n/wircrc/data1 {
+		echo cnew $* >[1=3]
+		tr -d '\x2\x8\xd\x1f' | @{
+			while(line=`{read}){
+				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/^:([^!]+)[^ ]+ (KICK) (#[^ ]+) ([^ ]+:?)(.*)/xmsg '$1'!\3 \2 \1 \4 \5/g;
+s/^:([^!]+)[^ ]+ ([0-9]+)[^:]+:?(.*)/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;
+s/^:(.*) (PONG) [^ ]+[^:]+:(.*)/cmsg '$1'!\1 \1 \2/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} &
+	}
+	{}>/n/wircrc/data
+}
+
+fn sighup {
+	shutdown
+}
+
+fn sigint {
+	shutdown
+}
+
+wmk $server &
+dial tcp!$server!$port $tls irc $server &
+
+</n/wircrc/data {
+	while(a=`{read}){
+		id=$a(2)
+		switch($a(1)){
+		case cnew
+			cd$id=$a(3)
+			cpid$id=$a(4)
+			cons=($id $cons)
+			getkey $id
+			if(! ~ $#srvpass 0)
+				sio $id PASS $srvpass
+			sio $id USER $user foo bar :$realname
+			sio $id NICK $nick
+			if(! ~ $#pass 0)
+				sio $id nickserv identify $pass
+			pass=()
+			srvpass=()
+			for(i in $chans){
+				if(~ $i $id!'#'*){
+					wmk $i &
+					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 $wins2)
+				echo $a >/n/wircrc/data1
+			if not if(! ~ $id *!'#'*){
+				wmk $id $a(3-) &
+				wins2=($id $wins2)
+			}
+		case wtype
+			switch($a(3)){
+			case /x
+				shutdown
+			case /s
+				server=$a(4)
+				if(! ~ $server '' && ! ~ $server $cons){
+					if(! ~ $server $wins)
+						wmk $server &
+					if(~ $a(5) port)
+						port=$a(6)
+					dial tcp!$server!$port $tls 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(4) $cons)
+					id=$a(4)
+				hangup `{echo $id | awk -F'!' '{print $1}'}
+			case /n
+				nick = $a(4)
+				server=`{echo $id | awk -F'!' '{print $1}'}
+				sio $server NICK $a(4)
+			case /p
+				server=`{echo $id | awk -F'!' '{print $1}'}
+				sio $server PING $server
+			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