S5L7MKYA7C7FVRRKNZGDSQ5BFQ3CLF74YD7EANPJSC5AEV7FSATAC 2IPRL7OUUT3TGK22XXD3YSIZY7PBRRHUK42IXAGHOAZTQZGAJRKQC X26RI552K4MHFDQRWFHNJHXKBS7QEI72KSOBVK6X2T7MQQ6SE7AAC IJB4AS4C2G4SNTGRMW5ILQF3ZBMZE2ZUSK7JYKCRD4Q7H43ISECQC 4SYFUW4ODJBXFYH357E7K7YIPVVHQ3ALIJBFUXAHPBPLWFYL3DDQC S4P2B3FPF57HPHTIAYGMPCVKB7573IB5ZBKNXVBTB6ICCPF55WNQC SOBQGWFGDCJJMWPSJ5KY4QWDKEDNR73GBQSGLXHKI57HYHKLSIYQC MARILFXCD2WP3Y6UIZH7HGWXNQUIGWKAVTGMLPJ5LBWSZOULLJNAC KDKWBUFH3YYJUOGLBAAE5QYV6H4UR3HXIN5LCRVGAHNKDFJPWQGAC 5F37EUQCHOXFW7BK6YY5P7SAQB64ZCA3COUE4CN4YIY4ENQC2FCAC 7F4HF72RYP6J4YPPPPKP5TEEJT456PDSM7ZQZIRHNQ4HIIRJURKQC 4H7DS23VBU4362UF5CMSCTXSPKDZIBMM2GXN6WJUEQFFY2ORGZBAC DJJIZVCNVIH2HTR6K7YBEZTFMTMMW55GP37G4RAZO6G3UUXU52PAC VEGP36QXXAP3MTIUTYEF4ABNT4VMACTIIHM6A63HT7K3LTAUVTVQC DUVDPDDKESNM6URN3ZSOOVVGBUW5MTGHXXSKXHSMO3EG4ZXOP3HQC BXLMOKJKVWRCNSJSD6L4RFON2IHEWB7J42QRYWN7M45XP22752YAC PQJKCNCMC2K266P7TSRRK32NPEVSEMP3ACMETX3FM6ENDREA4LJAC MKR4ILWLFLJDN2VZGWJ35C7TRZPKPSTTDQV7W4E5KLA4UAFT7SPAC QWR4AKCMW4GPGKQKXO4GLOS7GZQ2KAD4JSOST5NCSM3VM7FJXPFAC DB44ZP7WEBTVG2VE22AT3WEOV7BAKSTKWSLAAQJ22PCS2ELDK5SAC CGPQSMRFAEGSEMLDQWPHLEOAF26HVF3IC6BEKRCOSV2H6QLIBEAQC ILPZ4NIWVCPZ472RFFSF2WRKAN7SJX423437NSTP6BPSMUDVMT5QC 664NLMCU67ASZL33FKOF4PQK4Q4PLUXKGCAEZZAG3VNPAFMOE4FQC BZAL5NFHSVAKICJ56OA5D3ZRVUJFYLIACLW2ASRMBEZUTJI5REKQC E2UH4RHW6PUXPOBE5G52T4C6BI6DHLMX7KYJLHYNRARUM5KA3Y5AC DYENPPZNUM7QVOK2TWGQAF7Z7I67TH4XAN5TMNJOW4RYVZELL2ZQC VPTDQDFXNUMOEULR5L2OLS3YW4W3T7MSKBISJKCK3MP7KDWWJVPAC 2FMXNRSPIYWQRXJA2S3CEPLVVBKM4IADKFJFEBDPN7TDKCM75DLAC 2ITR343L33PU3FHLCUYNOJOI34W3NQMY5RL27IKDNGHIOA6ZMIFQC JZV5KFSQRORLTAUBDY6AAHCCDIGAJVNNSW3ZUU3X622L53P5LS2AC 7CFD3UOWFKMZRCBYEIU2NWGSPS2EXK5AP4QZFMKUH3K3JCBOEKXAC BEWT3YUFWOAKQVEO4ZERUTFISI26ULUCNKICDZFYZ4OM3DRLCKWQC CRPUEZXM4UZYCYLARN6X74TXJ65NWKK4NDLHRD3DXSBQHI6IQ3BAC SCSKOWMTCSTVJUZ4KPYFFCRDFGDPZWQUNQ5X5MQQ7USMBM57CGHAC N26QYRDHYBF36ODEANJ2EJKCWGWADPU3JZ2WLFJDTLZXANW6URIQC VHN5PUF4LIUPT2RH7UAJEH6KCF7VXPGQVYI27SCOMB6NETVESO3QC 7755FHS7ZTG4YGJNFYAONWSWSM636WOWFRISDKQU2AOJHN6ZVMBAC PPHB36IL7PBXYAGHV6QEFNCKUXEJSSR6264PACKRP7OT2SWNUV6AC 4SFN5L36NYBFPXLBSWXO4KXDBY2W4YP4CNNVX23E2BQ7W2A6GVZQC TLOUTLMOHXYNPVXEBPDNT5XVSLIITQOVP7Y7LSLTK5YUOSHT7JOAC KTEEKYZJYM54MZP3BONOGHMGIYWZRYR2GO7TL56RQJ26CORF3EEQC KIMLP4FXKI3DGXPQNN4Z6R2MM2XSKV5E5LBHCMRVNAG4Z3MK4VCAC T63X37GGBT6PXZMA3MJKNO65FWL7STX62K72Q3RMZDE377BFGCYQC for mut ghost in ircnet.ghosts.ghosts {g_ghost := *ghost // vbugif g_ghost.state == ConnState.disconnected {self.dial(mut ircnet, g_ghost.nick)}
mut ghost := ircnet.find_ghost(ircnet.nick) or { mut ghost := self.add_ghost(mut ircnet, ircnet.nick)ircnet.ghosts.add(mut ghost) }mut g_ghost := *ghost // vbugif g_ghost.state == ConnState.disconnected {g_ghost.sock = self.dial(mut ircnet, ircnet.nick) or { continue }
mut sock := net.dial_tcp(host) or {println('irc connect fail $host $err')return}
mut sock := net.dial_tcp(host) ?
mut ghost := &Ghost{nick: nicksock: sock}mut added := ircnet.ghosts.add(mut ghost)ghost.state = ConnState.connectedgo self.comm(mut ircnet, mut added)nick_cmd := 'nick $nick'ircnet.write(mut ghost, nick_cmd)user_cmd := 'user a b c :full name'ircnet.write(mut ghost, user_cmd)
return sock
pub fn (mut self IrcActor) add_ghost(mut ircnet Network, nick string) &Ghost {mut ghost := &Ghost{nick: nick}go self.comm(mut ircnet, mut ghost)nick_cmd := 'nick $nick'ircnet.write(mut ghost, nick_cmd)user_cmd := 'user a b c :full name'ircnet.write(mut ghost, user_cmd)return ghost}
mut reader := io.new_buffered_reader(reader: ghost.sock)for {if line := reader.read_line() {parsed := self.proto(line, mut ircnet, mut ghost)if parsed.len > 0 {
if mut ghost.sock is net.TcpConn {mut reader := io.new_buffered_reader(reader: ghost.sock)for {if line := reader.read_line() {parsed := self.proto(line, mut ircnet, mut ghost)if parsed.len > 0 {}} else {println('$ircnet.hostname $ghost.nick: TCP closed $err')ghost.hangup()self.cin <- Payload(Disconnect{network: ircnetghost: ghost})break}if ircnet.stop {break
} else {println('$ircnet.hostname $ghost.nick: TCP closed $err')ghost.hangup()self.cin <- Payload(Disconnect{network: ircnetghost: ghost})break
println('$self.hostname $ghost.nick: $msg')ghost.sock.write_string(msg + '\n') or {}
if mut ghost.sock is net.TcpConn {println('$self.hostname $ghost.nick: $msg')ghost.sock.write_string(msg + '\n') or {}} else {println('NO SOCK: $self.hostname $ghost.nick: dropped $msg')}