alias irc_chat { window -aek0 @irc | background @irc 5 }
on 1:sockopen:irc:{
if ($sockerr > 0) { irc_wr 7Cannot connect to server. :((( | halt }
irc_wr 7Connected.
bset &proto 1 5
bset &proto 2 9
bset &proto 3 25
bset &proto 4 38
bset &proto 5 1
bset &proto 6 20
bset &proto 7 50
sockwrite -n irc &proto
}
on 1:sockread:irc:{
sockread %data
tokenize 32 %data
if ($1 === NICK) irc_wr 12Use 7/nick 12to set your nickname.
elseif ($1 === PRINT) irc_wr $2-
elseif ($1 === JOIN) irc_wr 12 $+ $2 $+ 7has joined the chat.
elseif ($1 === PART) irc_wr 12 $+ $2 $+ 7has left the chat.
elseif ($1 === CHGNICK) irc_wr 12 $+ $2 $+ 7is now known as12 $3 $+ .
elseif ($1 === MSG) aline @irc 12<4 $+ $2 $+ 12> 7 $+ $3- $+
}
alias irc_wr {
if ($window(@irc)) aline @irc 9*** $1-
}
on 1:input:@irc:{
if ($1 == /conn) {
if (!$2) { irc_wr 12Syntax: /conn <ip> | halt }
if ($sock(irc)) irc_wr 12Already connected to a server Use /quit first.
else { sockopen irc $2 5238 | irc_wr 7Connecting to 12 $+ $2 $+ ... }
}
elseif ($1 == /quit) {
if ($sock(irc)) {
sockclose irc
irc_wr 4Disconnected.
}
else irc_wr 4Not connected.
haltdef
}
elseif ($1 == /nick) { sockwrite -n irc NICK $2 | haltdef }
elseif ($mid($1,1,1) == /) irc_wr 12 $+ $1 $+ : Unknown command.
else {
if ($sock(irc)) sockwrite -n irc MSG $1-
else irc_wr 12Not connected.
}
}
alias irc_server {
if ($sock(ircserver)) echo -a Server already opened.
else socklisten ircserver 5238
}
on 1:socklisten:ircserver:{
var %sockid = ircserver- $+ $ticks $+ - $+ $r(1000,9999)
sockaccept %sockid
sockmark %sockid proto
}
on 1:sockread:ircserver-*:{
sockread &data
var %data = $remove($bvar(&data,1-).text,$cr,$lf)
tokenize 32 %data
var %status = $gettok($sock($sockname).mark,1,32)
var %nick = $gettok($sock($sockname).mark,2,32)
if (%status == proto) {
;if ($bvar(&data,1-) != 5 9 25 38 1 20 50) { sockwrite -n $sockname PRINT 12Invalid protocol. Disconnecting... | sockclose $sockname }
if (0) haltdef
else { sockmark $sockname nick | sockwrite -n $sockname NICK }
halt
}
if (%status == nick) {
if ($1 != NICK) { sockwrite -n $sockname PRINT 12Register first. }
elseif ($inuse($2)) sockwrite -n $sockname PRINT 12Nickname in use.
else {
if ($len($2) > 12) || (!$regex($2,/^[-a-zA-Z0-9^_`]+$/)) sockwrite -n $sockname PRINT Invalid nick.
else { sockmark $sockname conn $2 | sockwrite -n $sockname PRINT 12Welcome. | ircserv_massmsg JOIN $2 }
}
}
if (%status == conn) {
if ($1 === NICK) {
if ($len($2) > 12) || (!$regex($2,/^[-a-zA-Z0-9^_`]+$/)) sockwrite -n $sockname PRINT Invalid nick.
elseif (%nick == $2) haltdef
elseif ($inuse($2)) sockwrite -n $sockname PRINT 12Nickname in use.
else { sockwrite -n $sockname CHGNICK %nick $2 | sockmark $sockname conn $2 }
}
if ($1 === MSG) {
if ($len($2-) > 500) sockwrite -n $sockname PRINT 12Line too long.
elseif ($2 == LUSERS) {
sockwrite -n $sockname MSG ULIST Users list:
var %i = 1
while ($sock(ircserver-*,%i)) {
var %s = $gettok($sock($ifmatch).mark,1,32)
var %n = $gettok($sock($ifmatch).mark,2,32)
var %a = $ifmatch
if (%s == conn) sockwrite -n $sockname MSG ULIST %n $iif($3 == sock,%a)
inc %i
}
sockwrite -n $sockname MSG ULIST $str(-,12)
}
else ircserv_massmsg MSG %nick $2-
}
}
}
on 1:sockclose:ircserver-*:if ($gettok($sock($sockname).mark,1,32)) ircserv_massmsg PART $gettok($sock($sockname).mark,2,32)
alias inuse {
var %i = 1
while ($gettok($sock(ircserver-*,%i).mark,2,32)) {
var %nick = $ifmatch
if (%nick == $1) return 1
inc %i
}
return 0
}
alias ircserv_massmsg {
var %i = 1
while ($sock(ircserver-*,%i)) {
var %b = $sock($ifmatch).mark
var %s = $ifmatch
if ($gettok(%b,1,32) == conn) sockwrite -n %s $1-
inc %i
}
}