Project

General

Profile

Scripting » History » Revision 169

Revision 168 (Per Amundsen, 08/02/2013 02:13 AM) → Revision 169/246 (Per Amundsen, 08/02/2013 02:19 AM)

h1. Scripting changes as of 1.9.1 

 h1. Implemented mIRC events so far: 

 <pre> 
 raw <numeric>:<matchtext>:<commands> 

 ctcp <level>:<matchtext>:<*|#|?>:<commands> 

 on 1:sockopen:name:commands 

 on 1:sockread:name:commands 

 on 1:socklisten:name:commands 

 on 1:sockclose:name:commands 

 on *:SIGNAL:name:command 

 on <level>:LOGON:*:<commands> 

 on <level>:DNS:<commands> 

 on <level>:CTCPREPLY:<matchtext>:<commands> 

 on <level>:OPEN|CLOSE:<?|@|=|!|*>:<matchtext>:<commands> 

 on <level>:ACTIVE:<*#?=!@>:<commands> 

 on <level>:HOTLINK:<matchtext>:<*#?=!@>:<commands> 

 on <level>:INVITE:<#[,#]>:<commands> 

 on <level>:TABCOMP:<*#?=!@>:<commands> 

 on <level>:WALLOPS:<matchtext>:<commands> 

 on <level>:ERROR:<matchtext>:<commands> 

 on <level>:RAWMODE:#:<commands> 

 on <level>:DEHELP:<#[,#]>:<commands> 

 on <level>:HELP:<#[,#]>:<commands> 

 on <level>:DEVOICE:<#[,#]>:<commands> 

 on <level>:VOICE:<#[,#]>:<commands> 

 on <level>:DEOP:<#[,#]>:<commands> 

 on <level>:OP:<#[,#]>:<commands> 

 on <level>:INPUT:<*#?=!@>:<commands> 

 on <level>:UNBAN:<#[,#]>:<commands> 

 on <level>:BAN:<#[,#]>:<commands> 

 on <level>:CHAT:<matchtext>:<commands> 

 on <level>:KICK:<#[,#]>:<commands> 

 on <level>:NOTIFY:<commands> 

 on <level>:UNNOTIFY:<commands> 

 on <level>:NICK:<commands> 

 on <level>:QUIT:<commands> 

 on <level>:LOAD:<commands> 

 on <level>:UNLOAD:<commands>' 

 on <level>:START:<commands> 

 on <level>:EXIT:<commands> 

 on <level>:DNS:<commands> 

 on <level>:CONNECTFAIL:<commands> 

 on <level>:CONNECT:<commands> 

 on <level>:DISCONNECT:<commands> 

 on <level>:TOPIC:<#[,#]>:<commands> 

 on <level>:USERMODE:<commands> 

 on <level>:MODE:<#[,#]>:<commands> 

 on <level>:PART:<#[,#]>:<commands> 

 on <level>:JOIN:<#[,#]>:<commands> 

 on <level>:SNOTICE:<matchtext>:<commands> 

 on <level>:NOTICE:<matchtext>:<*><?><#[,#]>:<commands> 

 on <level>:ACTION:<matchtext>:<*><?><#[,#]>:<commands> 

 on <level>:TEXT:<matchtext>:<*><?><#[,#]>:<commands> 

 This event is added as a replacement for OnSongChanged 
 on <level>:SONG:<commands> 

 </pre> 

 Supported prefixes so far are ^ to enable halt events (hide default text output from the event), ! to ignore events made by you, @ to only trigger if you have channel op, $ to indicate the wildcard text is a regular expression. 

 User access will come later.  

 h1. identifiers Functions added so far 

 <pre> 
 $0 $abs() 
 $abs $acos() 
 $acos $address() 
 $active $addtok() 
 $activeserver $addtokcs() 
 $activewid $and() 
 $adate $asc() 
 $address $asctime() 
 $addtok $asin() 
 $addtokcs $atan() 
 $adiircdir $audio() 
 $adiircexe $base() 
 $adiircini $bfind() 
 $album $bindip() 
 $and $bitoff() 
 $anick $biton() 
 $appactive $bvar() 
 $appstate $bytes() 
 $artist $calc() 
 $asc $cb() 
 $asctime $ceil() 
 $asin $chan() 
 $atan $char() 
 $audio $chat() 
 $away $chr() 
 $awaymsg $color() 
 $awaytime $colour() 
 $base $comchan() 
 $bfind $cos() 
 $bindip $count() 
 $bitoff $countcs() 
 $biton $crc() 
 $bitrate $ctime() 
 $bvar $datediff() 
 $bwdown $datematch() 
 $bwdownb $decode() 
 $bwname $decrypt() 
 $bwspeed $deltok() 
 $bwup $dialog() 
 $bwupb $did() 
 $bytes $didreg() 
 $calc $didtok() 
 $cb $didwm() 
 $ceil $disk() 
 $chan $diskmenu() 
 $chanmodes $dns() 
 $channel $duration() 
 $chantypes $editbox() 
 $chat $encode() 
 $chr $encodingmenu() 
 $cid $encrypt() 
 $clevel $eval() 
 $cmdline $exists() 
 $color $fdate() 
 $colour $fgetc() 
 $comchan $file() 
 $comment $fileexists() 
 $cos $fileloop() 
 $count $filerandom() 
 $countcs $finddir() 
 $cpucache $findfile() 
 $cpucount $findtok() 
 $cpuident $findtokcs() 
 $cpuload $fline() 
 $cpumhz $floop() 
 $cpuname $floor() 
 $cr $fopen() 
 $crc $formatdate() 
 $crlf $frand() 
 $ctime $fread() 
 $date $freadc() 
 $datediff $freadchar() 
 $datematch $getdir() 
 $day $getdot() 
 $daylight $gettok() 
 $decode $gfx() 
 $decrypt $gfxram() 
 $deltok $group() 
 $dialog $height() 
 $did $hfind() 
 $didreg $hget() 
 $didtok $host() 
 $didwm $ial() 
 $disk $ialchan() 
 $diskfree $ibl() 
 $diskmenu $ident() 
 $disktotal $iel() 
 $dlevel $ignore() 
 $dns $iil() 
 $dotnet $inellipse() 
 $duration $ini() 
 $editbox $inpoly() 
 $encode $input() 
 $encodingmenu $inrect() 
 $encrypt $insert() 
 $error $instok() 
 $event $int() 
 $exists $invitemenu() 
 $false $isalias() 
 $feof $isbit() 
 $ferr $isdir() 
 $fgetc $isfile() 
 $file $isid() 
 $finddir $islower() 
 $findfile $istok() 
 $findtok $istokcs() 
 $findtokcs $istype() 
 $fline $isupper() 
 $floop $left() 
 $floor $len() 
 $fopen $line() 
 $frand $lines() 
 $fread $log() 
 $frequency $longfn() 
 $fulladdress $longip() 
 $fulldate $lower() 
 $fulltitle $mask() 
 $genre $matchtok() 
 $getdir $matchtokcs() 
 $getdot $md5() 
 $gettok $mid() 
 $gfx $mkfn() 
 $gfxram $mklogfn() 
 $gmt $mknickfn() 
 $group $mp3() 
 $height $msfile() 
 $hfind $nick() 
 $hget $nofile() 
 $highlight $nopath() 
 $host $noqt() 
 $ial $not() 
 $ialchan $notify() 
 $ibl $numtok() 
 $ident $or() 
 $idle $ord() 
 $iel $pic() 
 $ignore $portfree() 
 $iil $pos() 
 $inellipse $poscs() 
 $ini $prop() 
 $inmidi $puttok() 
 $inpaste $qt() 
 $inpoly $query() 
 $input $r() 
 $inrect $rand() 
 $insert $read() 
 $insong $readini() 
 $instok $regex() 
 $int $regmatch() 
 $invitemenu $regml() 
 $inwave $regreplace() 
 $ip $regsub() 
 $isalias $regsubex() 
 $isbit $remove() 
 $isdir $removecs() 
 $isfile $remtok() 
 $isid $remtokcs() 
 $islower $repeat() 
 $istok $replace() 
 $istokcs $replacecs() 
 $istype $replacex() 
 $isupper $replacexcs() 
 $layer $reptok() 
 $left $reptokcs() 
 $len $rgb() 
 $length $right() 
 $lf $round() 
 $line $scid() 
 $lines $scon() 
 $log $screen() 
 $logdir $screenb() 
 $logstamp $screenh() 
 $logstampfmt $screenw() 
 $longfn $script() 
 $longip $sdir() 
 $lower $server() 
 $ltimer $sfile() 
 $maddress $sha1() 
 $mask $shortfn() 
 $matchkey $sin() 
 $matchtok $slapsmenu() 
 $matchtokcs $sline() 
 $md5 $snick() 
 $me $sock() 
 $memfree $sorttok() 
 $memfreep $sorttokcs() 
 $memtotal $sqrt() 
 $menu $str() 
 $mid $strip() 
 $mircdir $style() 
 $mircexec $substr() 
 $mircini $tan() 
 $mkfn $time() 
 $mklogfn $timer() 
 $mknickfn $tip() 
 $mnick $toolbar() 
 $mode $true() 
 $modespl $trust() 
 $motherboard $upper() 
 $mouse $uptime() 
 $mp3 $user() 
 $msfile $utfdecode() 
 $mversion $utfencode() 
 $myhost $var() 
 $myident $vol() 
 $network $width() 
 $newnick $wildtok() 
 $nick $wildtokcs() 
 $nofile $window() 
 $nopath $xor() 
 $noqt </pre> 

 h1. Variables added so far 

 <pre> 
 $not $0 
 $notify $active 
 $now $activeserver 
 $null $activewid 
 $numeric $adate 
 $numtok $address 
 $online $adiircdir 
 $or $adiircexe 
 $ord $adiircini 
 $os $album 
 $osbuild $anick 
 $osedition $appactive 
 $osinstalldate $appstate 
 $osmajor $artist 
 $osminor $audio 
 $osname $away 
 $osservicepack $awaymsg 
 $osversion $awaytime 
 $percentl $bitrate 
 $percentp $bwdown 
 $pic $bwdownb 
 $playcount $bwname 
 $player $bwspeed 
 $port $bwup 
 $portfree $bwupb 
 $pos $cb 
 $poscs $chan 
 $position $chanmodes 
 $prefix $channel 
 $progress $chantypes 
 $prop $cid 
 $puttok $clevel 
 $qt $cmdline 
 $query $comment 
 $r $cpucache 
 $r0 $cpucount 
 $rand $cpuident 
 $raw0 $cpuload 
 $rawbytes $cpumhz 
 $rawmsg $cpuname 
 $read $cr 
 $readini $crlf 
 $realname $ctime 
 $regex $date 
 $regml $day 
 $regsub $daylight 
 $regsubex $disk 
 $remove $diskfree 
 $removecs $disktotal 
 $remtok $dlevel 
 $remtokcs $duration 
 $replace $error 
 $replacecs $event 
 $replacex $false 
 $replacexcs $feof 
 $reptok $ferr 
 $reptokcs $frequency 
 $result $fulladdress 
 $rgb $fulldate 
 $right $fulltitle 
 $round $genre 
 $scid $getdir 
 $scon $gfx 
 $screen $gfxram 
 $screenb $gmt 
 $screenh $highlight 
 $screenw $host 
 $script $ial 
 $scriptdir $ident 
 $scriptline $idle 
 $sdir $ignore 
 $server $inmidi 
 $serverip $inpaste 
 $sfile $insong 
 $sha1 $inwave 
 $shortfn $ip 
 $show $isid 
 $sin $layer 
 $site $left 
 $size $length 
 $slapsmenu $logdir 
 $sline $logstamp 
 $snick $logstampfmt 
 $sock $lr 
 $sockbr $ltimer 
 $song $maddress 
 $sorttok $matchkey 
 $sorttokcs $me 
 $sqrt $memfree 
 $status $memfreep 
 $str $memtotal 
 $strip $mircdir 
 $style $mircexec 
 $submenu $mircini 
 $tan $mnick 
 $mode 
 $modespl 
 $motherboard 
 $mversion 
 $myhost 
 $myident 
 $network 
 $newnick 
 $nick 
 $now 
 $null 
 $numeric 
 $online 
 $os 
 $osbuild 
 $osedition 
 $osmajor 
 $osminor 
 $osname 
 $osservicepack 
 $osversion 
 $percentl 
 $percentp 
 $playcount 
 $player 
 $port 
 $position 
 $prefix 
 $progress 
 $r 
 $r0 
 $raw0 
 $rawbytes 
 $rawmsg 
 $result 
 $screen 
 $screenb 
 $screenh 
 $screenw 
 $script 
 $scriptdir 
 $scriptline 
 $server 
 $serverip 
 $show 
 $site 
 $size 
 $sockbr 
 $song 
 $status 
 $target 
 $ticks 
 $time 
 $timer 
 $timestamp 
 $timestampfmt 
 $timezone 
 $tip 
 $title 
 $token 
 $toolbar 
 $totaltracks 
 $track 
 $true 
 $trust 
 $ulevel 
 $updays 
 $uphours 
 $upmins 
 $upper 
 $uptime 
 $user 
 $usermode 
 $utfdecode 
 $utfencode 
 $var 
 $version 
 $vol 
 $volume 
 $volumeb 
 $volumep 
 $wid 
 $width 
 $wildsite 
 $wildtok 
 $wildtokcs 
 $window 
 $xor 
 $year 
 </pre> 

 All operaters are added. 

 h1. Example scripts 

 Simple kickcounter script: 

 <pre> 
 alias kick {  
	 if (!%kickcount) %kickcount = 0 

	 inc %kickcount 
		 
	 if (!$3) {  
		 kick # $$2 Kick number %kickcount 
		 halt 
	 }  
 } 
 </pre> 

 Kickban example 
 <pre> 
 alias kb { 
	 if (!$1) { 
		 echo /kb - Nick missing 
		 return 
	 } 

	 var %msg = $iif(#, $2-, $3-) 
	 var %chan = $iif(#, #, $2) 
		
	 ; Set this for default ban reason, or remove for no default reason 
	 ; Can be shortened to %msg = $iif(%msg, %msg, GTFO) 
	 if (!%msg) %msg = GTFO 

	 if ($me isop %chan) { 
		 MODE %chan +b $wildsite 
		 KICK %chan $1 %msg 
	 }  
	 else echo You are not oper on %chan 
 } 
 </pre> 

 Simple calculator script: 
 <pre> 
 alias calc { 
	 if (!$1) { 
		 echo /calc - Parameters missing 
		 return 
	 } 
		
	 ; typing /calc -p <expression> sends output to channel 
	 if ($1 == -p) { 
		 msg # Calculating : $2- 
		 msg # Result is : $calc($2-) 
	 } else { 
		 echo Calculating : $1- 
		 echo Result is : $calc($1-) 
	 } 
 } 
 </pre> 

 Colored version 
 <pre> 
 alias calc { 
	 if (!$1) { 
		 echo /calc - Parameters missing 
		 return 
	 } 
	
	 # typing /calc -p <expression> sends output to channel 
	 if ($1 == -p) { 
		 msg # $chr(3)4Calculating : $2- 
		 msg # $chr(3)4Result is : $calc($2-) 
	 } else { 
		 echo $chr(3)4Calculating : 4$1- 
		 echo $chr(3)4Result is : $calc($1-) 
	 } 
 } 
 </pre> 

 CTCP flood detection example 

 <pre> 
 CTCP *:*:*:{ 
	 if (!%count) set -u10 %count 1 
	 else inc -u10 %count 1 

	 if (%count > 4) ignore -tu30 $wildsite 
 } 
 </pre> 

 Mass mode example 

 <pre> 
 alias mass { 
	 if (!$2) { 
		 echo /mass - Parameters missing [+/-<mode> <nick> <nick> <nick>] 
		 return 
	 } 

	 %len = 2 
	
	 ; equal to while (%len <= $count(%1-, $chr(32))) 
	 while (%len <= $0) { 
		 if ($(%len) ison #) mode # $1 $($ $+ %len) 
		 inc %len 
	 } 
 } 
 </pre> 

 Shows info about servers, channels and users 
 <pre> 
 on *:JOIN:#: { 
	 var %s = $server(0), %c = 0, %u = 0, %t = 0, %c2 = 0; 
	
	 while (%t < %s) { 
		 inc %t 
		 setserver $server(%t); 
		 %c += $chan(0) 
	
		 %c2 = 0 
		 while (%c2 < $chan(0)) { 
			 in %c2 
			 %u += $user($chan(%c2), 0) 
		 } 
	 } 

	 /echo You are on ( $+ %s $+ ) servers, ( $+ %c $+ ) channels with ( $+ %u $+ ) users 
 } 
 </pre> 

 It is possible to use scripts as functions. 
 These functions are fully nested like the client functions. 

 Lets say you make a /mycalc like this. 
 <pre> 
 alias mycalc { 
	 return $calc($$1 + $$2); 
 } 
 </pre> 

 Then you can call this function with eiter /mycalc <number> <number> the normal way or $mycalc(<number, <number>) 
 Typing /testcalc will show the result. 
 <pre> 
 alias testcalc { 
	 echo -a $1 + $2 is $mycalc($1, $2); 
	 echo -a 5 + 4 is $mycalc(5, 4); 
 } 
 </pre> 

 Simple convert temperature C to F or F to C 
 /temp C 20 will print 68 F 

 <pre> 
 alias temp { 
	 if ($1 == C) echo $calc(($2 * 9/5) + 32) F 
	 else if ($1 == F) echo $round($calc(($2 - 32) * 5/9), 1) C 
	 else echo Temp missing 
 } 
 </pre> 

 Announce song changes in a channel or to a user 
 <pre> 
 On *:SONG:{  
	 nmsg <network> <channel/Nick> $1- 
 } 
 </pre> 

 Announce to several channels with: 
 <pre> 
 On *:SONG:{  
	 nmsg <network> <channel1/Nick>,<channel2/Nick> $1- 
	 nmsg <network2> <channel3/Nick> $1-  
 } 
 </pre> 

 Automatically find the summary of a imdb url 
 <pre> 
 On *:TEXT:*:#k: { 
     var %reg = $regex($1-, http://www\.imdb\.com(/title/[a-z0-9]+/)) 
     if (!%reg) { return } 
     sockclose imdb 
     unset %data 
     %imdb = $regml(1) $+ plotsummary 
     %imdbchan = # 
     sockopen imdb www.imdb.com 80 
 } 

 on *:sockopen:imdb: { 
     sockwrite -n imdb GET %imdb HTTP/1.1 
     sockwrite -n imdb Host: www.imdb.com 
     sockwrite -n imdb User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.24 Safari/536.5 
     sockwrite -n imdb Referer: http://www.imdb.com 
     sockwrite -n imdb Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1 
     sockwrite -n imdb Accept-Language: en-us, en;q=0.50 
     sockwrite -n imdb Connection: Close $+ $crlf $+ $crlf 
 } 

 on *:sockread:imdb:{ 
     sockread %text 
     %data = %data $+ %text  
 } 

 on *:sockclose:imdb: { 
     if ($regex(%data, <p class="plotpar">([\s\S]*?)<i>)) { 
         msg %imdbchan $regml(1) 
     } 

     unset %data 
 } 
 </pre>