[script] n0=; Knio's multiplayer whiteboard script! n1=; n2=; to load: /load -rs whiteboard.mrc n3=; to host: /wb host n4=; to connect: /wb connect 1.2.3.4 n5=; n6=; Right click the toolbar buttons! n7=; n8= n9=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n10=; main n11= n12=alias wb whiteboard $1- n13=alias whiteboard { n14= if (%wb) { n15= echo -a Whiteboard is already running. use /wb.close to close the whiteboard first n16= } n17= set %wb 1 n18= n19= window -pxD @whiteboard n20= drawrect -rnf @whiteboard $rgb(0,64,128) 0 0 0 4096 4096 n21= n22= ; draw buttons? n23= drawtext -rn @whiteboard $rgb(255,255,255) Fixedsys 8 27 0 Whiteboard n24= n25= wb.refresh n26= n27= toolbar -as wb.spacer n28= toolbar -a wb.title Whiteboard @whiteboard 0 0 128 16 /wb.menu @wb n29= ;toolbar -b wb.title n30= toolbar -a wb.color Color @whiteboard 0 16 16 16 /wb.color @wb.color n31= toolbar -a wb.size Size @whiteboard 0 32 16 16 /wb.size @wb.size n32= toolbar -a wb.style Style @whiteboard 0 48 16 16 /wb.style @wb.style n33= toolbar -as wb.spacer2 n34= toolbar -a wb.clear Clear @whiteboard 0 64 16 16 /wb.clear n35= ;toolbar -as wb.spacer3 n36= ;toolbar -a wb.close Close @whiteboard 0 80 16 16 /wb.close n37= n38= if (!%wb.size) set %wb.size 1 n39= if (!%wb.color) set %wb.color $rgb(255,255,255) n40= if (!%wb.style) set %wb.style F n41= n42= wb.clear1 n43= wb.refresh n44= n45= if ($1 == host) wb.server n46= if ($1 == connect) wb.client $2 n47= n48= window @whiteboard.debug n49= window -a @whiteboard n50= n51= n52=} n53=alias wb.close whiteboard.close $1- n54=alias whiteboard.close { n55= window -c @whiteboard n56= window -c @whiteboard.debug n57= toolbar -r n58= unset %wb n59= wb.server.close n60= wb.client.close n61=} n62= n63=alias wb.reload { n64= reload -rs $+(",$script,") n65=} n66=alias -l wb.save { n67= drawsave -b24 @whiteboard $+(",$sfile(C:\,Save Image,Save),") n68=} n69= n70=on *:CLOSE:@whiteboard:wb.close n71= n72=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n73=; menus n74= n75=menu @wb { n76= Hi!:; n77= - n78= Update:url http://prog.h4xn3t.zapto.org:8080/mirc/whiteboard.mrc n79= Reload:wb.reload n80= Connect:wb.client $$?="Server IP" n81= Save:wb.save n82= Close:wb.close n83=} n84= n85=menu @wb.color { n86= White: set %wb.color $rgb(255,255,255) n87= Black: set %wb.color $rgb(0,0,0) n88= Red: set %wb.color $rgb(255,0,0) n89= Green: set %wb.color $rgb(0,255,0) n90= Blue: set %wb.color $rgb(0,0,255) n91= Cyan: set %wb.color $rgb(0,255,255) n92= Magenta:set %wb.color $rgb(255,0,255) n93= Yellow: set %wb.color $rgb(255,255,0) n94=} n95= n96= n97=menu @wb.size { n98= 1 px:set %wb.size 1 n99= 2 px:set %wb.size 2 n100= 3 px:set %wb.size 3 n101= 4 px:set %wb.size 4 n102= 8 px:set %wb.size 8 n103= 16 px:set %wb.size 16 n104= 32 px:set %wb.size 32 n105=} n106= n107=menu @wb.style { n108= Freehand: set %wb.style F n109= Line: set %wb.style L n110= Dot: set %wb.style D n111= Rectangle: set %wb.style E n112= Circle: set %wb.style C n113=} n114= n115=menu @whiteboard { n116= mouse:mouse $1- n117= sclick:sclick n118= dclick:dclick n119= uclick:uclick n120= rclick:rclick n121= lbclick:lbclick n122= leave:leave n123= drop:drop n124=} n125=alias -l wb.menu { n126= window -a @whiteboard n127=} n128= n129=alias -l wb.style { n130= set %wb.style F n131=} n132= n133=alias -l wb.size { n134= set %wb.size 1 n135= n136=} n137=alias -l wb.color { n138= set %wb.color $rgb(255,255,255) n139=} n140= n141= n142=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n143=; utilities n144= n145=alias -l wb.clear { n146= if (!$?!="Clear whiteboard?") return n147= wb.client.send C n148= wb.clear1 n149=} n150=alias -l wb.clear1 { n151= drawrect -rnf @whiteboard $rgb(0,0,0) 0 0 0 4096 4096 n152= wb.refresh n153= if (%wb.server) { write -c wb.log } n154=} n155=alias -l wb.refresh { n156= drawdot @whiteboard n157=} n158= n159= n160= n161=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n162=; user input n163= n164=alias -l wb.begindraw { n165= set %wb.bx $mouse.x n166= set %wb.by $mouse.y n167= set %wb.lx $mouse.x n168= set %wb.ly $mouse.y n169= set %wb.drawing 1 n170=} n171=alias -l wb.draw { n172= if (!%wb.drawing) return n173= var %x $mouse.x n174= var %y $mouse.y n175= n176= if (%wb.style == F) { n177= wb.drawlines %wb.color %wb.size %wb.lx %wb.ly %x %y n178= wb.client.send F %wb.color %wb.size %wb.lx %wb.ly %x %y n179= } n180= n181= set %wb.lx %x n182= set %wb.ly %y n183= n184= wb.refresh n185=} n186=alias -l wb.enddraw { n187= unset %wb.drawing n188= wb.refresh n189=} n190= n191=alias -l mouse { n192= if (%wb.drawing) wb.draw n193=} n194= n195=alias -l sclick { n196= wb.begindraw n197= wb.draw n198=} n199=alias -l uclick { n200= wb.enddraw n201=} n202=alias -l rclick { n203=} n204=alias -l dclick { n205=} n206=alias -l leave { n207= wb.enddraw n208=} n209=alias -l drop { n210= n211=} n212= n213=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n214=; drawing n215= n216=alias -l wb.drawlines { n217= drawline -hnr @whiteboard $1 $calc($2 * 2 - 1) $3- n218=} n219= n220= n221= n222= n223= n224= n225= n226=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n227=; server n228= n229=alias wb.server { n230= set %wb.server 1 n231= set %wb.nclients 0 n232= set %wb.clients $null n233= socklisten wb.server 9485 n234= ;write -c wb.log n235= set %wb.server.log n236=} n237=alias -l wb.server.close { n238= unset %wb.server n239= unset %wb.clients n240= unset %wb.nclients n241= sockclose wb* n242=} n243=alias -l wb.server.sendlog { n244= var %i 1 n245= var %n $lines(wb.log) n246= while (%i <= %n) { n247= var %l $read(wb.log,n,%i) n248= sockwrite -n $1 %l n249= while ($sock($1).sq > 8192) { sleep 1 } n250= inc %i n251= } n252=} n253=on *:socklisten:wb.server:{ n254= var %name wb.client. $+ %wb.nclients n255= set %wb.nclients $calc(%wb.nclients + 1) n256= set %wb.clients %wb.clients %name n257= sockaccept %name n258= echo @whiteboard.debug client %name $sock(%name).ip connected n259= .timer -o 1 0 wb.server.sendlog %name n260=} n261= n262=on *:sockclose:wb.client*:{ n263= echo @whiteboard.debug client $sockname $sock($sockname).ip disconnected n264= set %wb.clients $remove(%wb.clients,$sockname) n265=} n266= n267= n268= n269=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n270=; client n271= n272=alias wb.client { n273= set %wb.client 1 n274= sockopen wb.client $1 9485 n275=} n276= n277=alias -l wb.client.close { n278= unset %wb.client n279= sockclose wb* n280=} n281= n282=alias -l wb.client.parse { n283= var %fromsock 1 n284= if ($1 == F) { n285= wb.drawlines $2 $3 $4- n286= wb.refresh n287= return n288= } n289= if ($1 == C) { n290= wb.clear1 n291= return n292= } n293= echo -a Whiteboard: unknown operation: $1- n294=} n295=alias -l wb.client.send { n296= write wb.log $1- n297= if (%wb.client || %wb.server) { n298= ;echo @whiteboard.debug send data: $1- n299= if (%wb.server) { if ($numtok(%wb.clients,32) == 0) return } n300= sockwrite -n wb.client* $1- n301= } n302=} n303= n304=on *:sockopen:wb.client:{ n305= if ($sockerr) { n306= echo @whiteboard.debug error connecting to server n307= return n308= } n309= echo @whiteboard.debug client $sockname $sock($sockname).ip connected to server n310=} n311= n312=on *:sockread:wb.client*:{ n313= if ($sockerr) { n314= echo @whiteboard.debug error reading socket $sockname n315= set %wb.clients $remove(%wb.clients,$sockname) n316= if (%wb.client) unset %wb.client n317= return n318= } n319= ;echo @whiteboard.debug reading socket $sockname n320= while ($true) { n321= sockread %wb.clientdata n322= if ($sockbr == 0) return n323= ;echo @whiteboard.debug read data: %wb.clientdata n324= wb.client.parse %wb.clientdata n325= n326= ; if this is the server, send to other clients n327= if (%wb.server) { n328= write wb.log %wb.clientdata n329= var %i 1 n330= while (%i <= $numtok(%wb.clients,32)) { n331= var %n $gettok(%wb.clients,%i,32) n332= if (%n != $sockname) { n333= sockwrite -n %n %wb.clientdata n334= } n335= inc %i n336= } n337= } n338= } n339=} n340=on *:sockclose:wb.client:{ n341= unset %wb.client n342= echo @whiteboard.debug disconnected from server n343=} n344= n345= n346=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; n347=; http n348= n349=alias httpget { n350= set %http.host $1 n351= set %http.port $2 n352= set %http.uri $3 n353= set %http.file $4 n354= sockopen http %http.host %http.port n355=} n356=on *:sockopen:http:{ n357= n358=}