RLA7SZS6LMHVWBMOUTHPBTGMXHWOYVSRAIFOTPXTWJUJW5VC37DQC UZQIHVK4RRCNNXA5WZZG5ZYIWJG5BGK4PJRNGUXS7K7L5VV3Z7WQC KHNRPPCIZOWOERKJUTZAQV2ZXAOHBT2QHG6IQ3HVEI4TVQA4RONAC TAY4DPNHGBEXSQ7KD6RNPYGABWX44BNSE4YLD2ZKBHXMVAJTYSAAC NVBD7N3YMUOB3HPRJWLT74JYO6G5IDAE3NP7LFHAKO52FHO2Y43AC DEVBVVRV7RICHAVI3FPM2PHXYWR4MHCPGT7KIXCDSPV35KZFWFPQC ACAQHZKYE6EQOMUG4A7MWHHFVL6HIDSO75XXWPSHWJ6GIV72N7IQC TMBVUG3FAYJ3TRDKB627HDTEFXKL2RUNG5UAZDII224P53D5BROQC RUVZODTEITZQSKU3Z23UJHEWP3QB3OTF44LWZWMUHDQGM64ET4JAC 4AIS7Z6TG7DI4JTKZIKATCJRP3BDHEOGJG2WOAZCZTRJWPS7RW4AC 5NLMJZR4APZEMJRJS3SI4SO3PVB3UKVBSKLYVRQD7HWMBY74F4KQC HTB7FABVHHZOTL4EEQMW4R6DF4AZMGRQKY72DICDD27IGJTOIDJQC 4G62MDWRTFCQ22OK7EDFIU6WE2SWQZVBNDCRUROUBL5XEOZRDF6AC IS6SNTEQW7FJWF4ZGUXCPYY7RWMIAHOZYCE7KIA3X3TDAUWUYFPQC S4P2B3FPF57HPHTIAYGMPCVKB7573IB5ZBKNXVBTB6ICCPF55WNQC ZMAZUHFHJOW2GSUH5SUDXRG4STQ6PQHWYGZIZHEJCN73PSNQOAAQC WMPPHPYAXJNLWZEDJOTHIIYUT627ZI27K5IF7JXVO7EYU7YENUKAC VHN5PUF4LIUPT2RH7UAJEH6KCF7VXPGQVYI27SCOMB6NETVESO3QC MXBH5YMPKFDDBAEZRJDUZTH4WGLFOIZGX4ERGEZZVUMJW6Y4XFKAC FMQ3IBYW2IZ75GQJR27Z5EKQPK3SO5KUDC4AEPJYBNWJDFMA77YAC QEGWB22MLFROOGBKHKJ7RIGF4M7VIHSX4ORP72YDSVDL6KCEEMRAC KEXBPWMSHKVWITYY5TIEHTBREZ22QMBLXTEKLKWDZPC4TQTP6SGQC DB2BCHT5GXNQ3JXQXWMDFNXIO7OVEQMVY34SHTAWSJS47N67YTIQC QQB2XQYMM3G2UKFI5N3LMGS4GP4532CWQFVD5KDV7BPACSICDAVAC QHTD7FGR374IIWGV7XAOJREIGJBAOFJCSBLCWPL536Z42GQYNTOAC QJQPPSN5XHBV7JCHNWSMSYAMI3SPA7AH6YBT6RZHM6VILD3EFBWAC MHH6QV5QBHBYPWSQMV7IAU5CJQPYZQUEJT7PIR3BPWWJJ7S5MPUAC D5WIJLNIFO5S66YXYKAHSU2VZJ6SJ7BVAUHDJMGX4ABVRGJYHZYAC QWR4AKCMW4GPGKQKXO4GLOS7GZQ2KAD4JSOST5NCSM3VM7FJXPFAC VHW2IAQG2JMXB5G4L6IJZWS63OUKRRQEMM57KENIJBD36XCTX35AC 4SYFUW4ODJBXFYH357E7K7YIPVVHQ3ALIJBFUXAHPBPLWFYL3DDQC 7CFD3UOWFKMZRCBYEIU2NWGSPS2EXK5AP4QZFMKUH3K3JCBOEKXAC KDKWBUFH3YYJUOGLBAAE5QYV6H4UR3HXIN5LCRVGAHNKDFJPWQGAC 4H7DS23VBU4362UF5CMSCTXSPKDZIBMM2GXN6WJUEQFFY2ORGZBAC 7MLJEICDGSP5GMTO7MRQY5SFBLEROD6LDGKBTGHSIHJVB42ZXVMAC ZQE5UGGBKZRNI6ASUNOWVP4URLC7IHAWBO4RRACWLNS6OX2KQZVQC VUU7P2MXSNQIJFZTGKBNP3ZVL47VBLAKNQB35MSPT6MOEDBLBD4AC 526F5RML2DYJ6Y5R3A6FD5QKQ57NYONRBJMOXGR4WVEF6I6IAEHAC 2FMXNRSPIYWQRXJA2S3CEPLVVBKM4IADKFJFEBDPN7TDKCM75DLAC ZX5GI7ZM5WMGMNWNBYTJNE3T3OSIKASM53PHBPVB73IWGWUBEM5QC ACKV7HCNDGXHGAKII3K6UUCXDJLDPODNEO3UQTWQ6HUY236DB6TAC D5MLZ2BYK5M7FMRIJAJZ5JCTDLBIKFYE5WL3EL2PRQR3H43DS74AC MITZ7UATP6QPLGYN6XI6JK6XRSPX42ZJVZ35576X5NHCMAN7AEJQC BO5VKP6Z3GNEZN2RKCS4MSUYM77L3KSOJAFGZO4GPDPSZAHQ7PSQC NICERFRG2UQDGPLQRFQJHGLNIUMJCE6LUN3EVNDQ35LPZLDMHYDAC WL2WNOD4XSOH3LU52UKUKCGTSQEZ3J4GI3HJVIGZ3Q7FCM6IR5SAC 3E4I3FD7CQDZQTV5O2CWIT3OSOLWSWAJ3OIEKS2N7B6TOLOURMNAC 5F37EUQCHOXFW7BK6YY5P7SAQB64ZCA3COUE4CN4YIY4ENQC2FCAC NT6HQMTF6MZKEW5JAW6BAZXPQAYNZLSRWPCZ7SKRDKSOVL2UP52QC AKWDRBGCM2QQMORIOQYXHNT2CEU6TPNRXX4CGBDVLZ4A4UPJEUCQC CSWUQ3AGM2UVPMJZIT7KAJCQTV5SMVVKZDLNMWED54D2SDF7IKPAC S5L7MKYA7C7FVRRKNZGDSQ5BFQ3CLF74YD7EANPJSC5AEV7FSATAC HVJUHPIFPP3VAY72JF3WJ6YOZOVCQHZE4DQBXJNNRBXJAOA2NPZAC DJJIZVCNVIH2HTR6K7YBEZTFMTMMW55GP37G4RAZO6G3UUXU52PAC VEGP36QXXAP3MTIUTYEF4ABNT4VMACTIIHM6A63HT7K3LTAUVTVQC PQJKCNCMC2K266P7TSRRK32NPEVSEMP3ACMETX3FM6ENDREA4LJAC JZV5KFSQRORLTAUBDY6AAHCCDIGAJVNNSW3ZUU3X622L53P5LS2AC 72L4WKCGOEIXLIIDPQPQZVG5W2ZCJU5AWHX7EOFJNIHNEQ5S2V7QC VIPWC4V6PMA3K4V342SEO4TNNQSYOLZXOPTLIJLXDWMWHQPIS3AAC KTEEKYZJYM54MZP3BONOGHMGIYWZRYR2GO7TL56RQJ26CORF3EEQC KZ5DDRLFTOPZCDBDU5GVLJEXIEKQCUGYJ5TP3QIW3SF6PW7OSKTQC IF4FX4LBKF3CKMCTZXGSK3VHQTG6NLHDAOIJEAJT5LHWHI5XEWTAC SOBQGWFGDCJJMWPSJ5KY4QWDKEDNR73GBQSGLXHKI57HYHKLSIYQC PV52XGH3TWB3VGG7IR5R7B3MHHKJ45W4FKB6YLN3SXRUVJ5XVRBQC 7ZFFFS2QHKM3AWME7KO7WRJA6F7IIM7YNGGEWUWGBE2JLE5GLB6AC ZEJI2R6JJ6NJVO4Y4DZFPPOCHKOUDEWFEKQCB7DIUNMUF7YW7KHAC ZFTQHHBQPTGLWIJ6NO7LEA6HAVWWL2QWSX4MYVJSC4MQ6SHPC53AC LOSWKMTQERGO52DRGQNSGIKMMRLPUD5EH4UOB36VD3777YIVY3OAC QYVYRP42GJ7IOK2OTCRZACSTXYFODHYWSQ5TY2ZEMH7WTYAFZAEAC KHBUL3BKYVPYNGFECA7QMWTKRPLGT3VYVEON3JPHP4H74KLP5WDAC 5OKVHNLKGK2CYUVC2XXDOLCRVXJAMQGAWC7TSG3LQ2RTMYDTZZJAC P5LKO4U3UCFBXOZEF7HD3UP6LG3HDFEQCCGMWFEPAR7DBY6WJL5QC CRPUEZXM4UZYCYLARN6X74TXJ65NWKK4NDLHRD3DXSBQHI6IQ3BAC H73SZ4LP4TNY6A2F3O3BYDXGUOQ2EEHQ5XZIXZZDE4YARDQ453KAC YVTCAGILOVQSW2H3R6IRKRQ44ACNFGLN5SW4PO5QLOADY2GXL6DQC M63OP6ZDPA565QYQXIKZF4AFCULTELEOUFW75XQABIMUYKQGUVEQC MGLPPSPTZYTHV2IW522JPA7MXU56AGFATN7O64GT3VHUIQ6H6W2QC OYTOTB34M4CO7FNWEEEB2FXR7OYKFHV7PDAOITW2W7T2BXJONW6AC V2SIHPH72E3ZWD5ARYYPJQEO34GIQVFFJT5PYF75BGVS53KJ3W3AC P5PVLCMXTTLQXH2QCHFXY2TRZSGDSA3LYPTX7ILQZWFFO2R52KXAC OX7BGYKT3DK7UIZH7HF64WSWHI2675QRDMRKIBREHNMXJ3JI4LNQC YVK4OS4V2O3KA3QDFFCZYXB5FOAFN72SO2NXTHV2JBT563IZK4EAC JHXNF5UYYTCR36BEJRW764MYM5WS7MMH2NPCCFJMNXNYDJHVYNQQC L3OVXHM7P4R27WBV55WLHJV7Z4SXV6QHY2WMQOYLZQJF6QQUIR3QC MARILFXCD2WP3Y6UIZH7HGWXNQUIGWKAVTGMLPJ5LBWSZOULLJNAC DGHWKHKGSFYTVSRBNPGRJTP4MPR3T63LRUXOBOAGV3J6TFGG6E4AC 3SUE5FQ2W5VYMMGQXEUWIZHL7VRNRE43PI4EYZCQCWCDLV3DPNUQC NT7LP6HP4F7O4E2HVYFLTXXCUHGLCZVV5TYVSIW6FIFLLICCMWEAC FE6YM42COAICKV6DZQWEMADK7IN4HX4TERULK5SAEXAKSWG5UXJAC EKAWOQMSNHBPSJAPHNJP2PB2BZ2R4SLIIGGBKTDIH7JXNU2C3L6AC TJNT6TZFQXLU6TR23YNGDDXTB57ICLZMNHXOC5NT636YWGGEPW6QC HZ6R4X4ZMVPIKJZWZ4MYDP2V4OTEUFZVVAQSXRYQ7TZO4QHOZHUQC 64UUKXJNHHGNYPQLYPAT74RGYBZNPOHSV7LCWM64K2DJFT5BU6RAC E56QHKOALQCK7UGAJ6UNNZYTVUTSKLV25KYTPUQYMQWVDI6JIUCAC KIMLP4FXKI3DGXPQNN4Z6R2MM2XSKV5E5LBHCMRVNAG4Z3MK4VCAC PWAJPJCJJUBTN57OFWX7KAE4GKFMZYBVUV7R2FNSNMEBY3YLVSTAC T63X37GGBT6PXZMA3MJKNO65FWL7STX62K72Q3RMZDE377BFGCYQC HNQ2JXL7CQBMQO5T56AFFEJM27FB5PHKCJXDXV6QDLMPOV6FBIBAC HIRCSAI6D4EEV57CQCFIOCHXT4FUSABC4J46ER2GQY7IED3P6ZRQC EPEX7TH5BLI3A7NI5KDJZRQYYO4XJ23CEPXIG5M6SGH5M2W7NMWAC RKH2ZTRCPZ7IQT726S42ESHQSJMAXRMQATIDQMD5T6CSCUZE5WQAC IMVBBJEL4S7X6B2VGE2RBMCSV4XEUA3BBP3FBFEYYCJJFSGBF3NQC 7LGSGML2EHS5NVYUVMOV2Y2A6R3V4E4RZP4WCKD2NAH5RHTZBXTQC TUK5KSJMKMYUSGOQJEIUIV7FJHM6473GFPC26NX6LQXUHGTLX5DAC ABPKOFXXHYPSZROALH73G4F55JT22WQD7N3GONORGWZRKCR7NF3AC GFFFNM4X4KTW2FMDY5XLFTQ3M7EKWYKPFDBHQVHV6DVCYBQNAI5QC IAS75T3RE4KGP26ILCNZG5G52DZPV7XACR7PJUYVJACQUVH5J4HAC K4DRWAY72CGDTYJ52KGZFEZDO5HHXOYRIYR5L2SHXXUF3BPNOWTAC XKBAYE546KBYGPXQFVIVWLVAOR6GSJALEGRLWFSHA5LRUFKJCDTQC I6PBE4E6XQPLAMEBTWKND63OQLQ75XR2SCKL4O7AUXVTTHOC3SNQC 6FS6YXYMVKOKFGG5ILX2JHHE6MVUBNAY3NAEYRBAJKUEG4AWQPDAC JHTVUO5OKWCV3Z6GBXQKCKIX5GQDYLPT2SD7IDHSUN7E55J4FWDQC QEVWVQCQ5QUTO7UI32IQFEDIXVVGIQ2SLIBEZL6GKXEXMHA6MAZAC VSXY63RCAE4WDARTVOW6YDD6VPMRBNASRD73R4UMZDAAQX7MAVTAC LBKFI2GRVO3NKT35RZ7R7WH4MQ6DVJEL6VC6NP3TRMACUQZIWXFAC ATGTSECYSONVP2L6X4ZNHIA6353GTUO7O2QP7NPHXIAJSZIKI3EAC TYKD7O2U4SKKDP63IJE3ZFWI6MPZ3GPCTS5TS2C2V7277RVMWQWAC PA325CFTHH4SAQG74P3SBTOZZICVFYUFSMAG3TARZK4DH5OHJO4QC 4NLAKJMMFFEEJQRG254SIOP5O5GVOYY3XT2IUOVZO3OX3WS2AZXAC MSGFBWV3HGXCKDV72P5I5U32ACVFGAOQ226LN36N5RM3ZXL6PTYAC UK6XPPF2T3MHMEKWX4VB6TDTTRHQXHB2VS2DU6RY6K7WXQJV53RAC P6WYORQDK37N5I6DDOYU6QYIUEBTVV47XTXJ4VLT3HNCED4D2CFAC 4NP67IZLLWWBY4M6GJUSCAWG3X5BKEBJQXNXQMM6GXIENYBPTNRAC IJB4AS4C2G4SNTGRMW5ILQF3ZBMZE2ZUSK7JYKCRD4Q7H43ISECQC CX76CSXNSDYGXHQI77DUWIG3YSVPNBA4JBY2EMUGL7WHMQBK5UDQC 2ARSV2LXCF5S6EKEU45RHZ2YNWHPIAA3VOT6X3TDAFLX4OYCP3TQC OYO7SPBZRLTZHT22POUHC3KWVPU4XDWKSZAZ2I73IXOQGRW7VC3QC B5EQK6YSRS2YL3C4MXWCOUDYDEOB46LXAZNRCSXC7STIME7W6JQAC 5XI5H2KXX5E22S5LBN7DJZGORBCCIFJAUEL6QGWXN5BD5X4MTMWAC WTNDGSY5GEQDLT3LC7NEO6MC524VMMBCWKHB7BQ4NOPORVUYYTZQC mut ghost := ircnet.ghosts.by_nick(nick) or {println('irc.say() ghost nick "$nick" not found in ${network}. (msg was: $message)')
mut puppet := self.puppets.by_net_nick(ircnet, nick) or {println('irc.say() puppet nick "$nick" not found in ${network}. (msg was: $message)')
if ghost := ircnet.ghosts.by_nick(nick) {return ghost}}return error('not found')}pub fn (mut self IrcActor) find_server(addr string) ?&Network {for mut ircnet in self.networks {if ircnet.name == addr || ircnet.hostname == addr {
mut p_ircnet := *ircnet // vbugif p_ircnet.hostname == addr {
for mut ircnet in self.networks {mut ghost := ircnet.find_ghost(ircnet.nick) or {mut ghost := self.new_ghost(mut ircnet, ircnet.nick)ircnet.ghosts.add(mut ghost)
for mut ircnet in self.networks.networks {mut n_ircnet := *ircnet // vbugmut ghost := self.puppets.by_net_nick(n_ircnet, ircnet.nick) or {mut n_ghost := self.new_ghost(mut n_ircnet, ircnet.nick)self.puppets.add(mut n_ghost)
pub fn (mut self IrcActor) dial(mut ircnet Network, nick string) SockOrNone {mut host := ircnet.hostname
pub fn dial(hostname string, nick string) SockOrNone {mut host := hostname
pub fn (self Network) join(channel string, nick string) {println('Network.join($channel, $nick)')
pub fn (mut self Puppet) dial() {self.sock = dial(self.network.hostname, self.nick)if self.sock is net.TcpConn {self.state = .connected} else {self.state = .disconnected}}pub fn (mut self Puppet) join(channel string) {println('$self.nick joining $channel')
mut ghost := self.ghosts.by_nick(nick) or {println('irc.join() ghost nick "$nick" not found in ${self}. (msg was: $cmd)')return}self.write(mut ghost, cmd)
self.write(cmd)
}pub fn (self Network) find_ghost(nick string) ?&Ghost {for mut ghost in self.ghosts.ghosts {g_ghost := *ghost // vbugif g_ghost.nick == nick {return ghost}}return error('not found')
pub fn (mut self Network) hangup() {for mut ghost in self.ghosts.ghosts {ghost.hangup()
pub fn (mut self Puppets) hangup(ircnet &Network) {for mut puppet in self.puppets {if puppet.network.name == ircnet.name {puppet.hangup()}
for ircnet in self.networks {if ghost := ircnet.ghosts.by_nick(nick) {if channel := ghost.channels.find_by_name(channel_name) {return channel} else {println('irc.find_channel_by_name() $ghost.nick ghost ${ptr_str(ghost)} has no $channel_name')dump(ghost.channels)}
if ghost := self.puppets.by_nick(nick) {if channel := ghost.channels.find_by_name(channel_name) {return channel} else {println('irc.find_channel_by_name() $ghost.nick ghost ${ptr_str(ghost)} has no $channel_name')dump(ghost.channels)
pub fn (self Ghosts) by_nick(nick string) ?&Ghost {for g in self.ghosts {
pub fn (self Puppets) by_network(netname string) []&Puppet {mut winners := []&Puppet{}for g in self.puppets {if g.network.name == netname {winners << g}}return winners}pub fn (self Puppets) by_nick(nick string) ?&Puppet {for mut g in self.puppets {
println("irc.Ghosts.by_nick(\"$nick\") found ghost.nick ${ptr_str(g.nick)} \"$g.nick\" ")
println("irc.Puppets.by_nick(\"$nick\") found ghost.nick ${ptr_str(g.nick)} \"$g.nick\" ")return g}}return error('not found')}pub fn (mut self Networks) add(network &Network) &Network {self.networks << networkreturn self.networks.last() // network was copied. return copy.}pub fn (mut self Networks) by_name(name string) ?&Network {for mut g in self.networks {if g.name == name {return g}}return error('not found')}pub fn (self Puppets) by_net_nick(ircnet Network, nick string) ?&Puppet {for g in self.puppets {if g.nick == nick && g.network.name == ircnet.name {println("irc.Puppets.by_net_nick(\"$ircnet.name\" \"$nick\") found ghost.nick ${ptr_str(g.nick)} \"$g.nick\" ")
pub fn (self Network) write(mut ghost Ghost, msg string) {if mut ghost.sock is net.TcpConn {println('$self.hostname $ghost.nick: $msg')ghost.sock.write_string(msg + '\n') or {}
pub fn (mut self Puppet) write(msg string) {if mut self.sock is net.TcpConn {println('$self.network $self.nick: $msg')self.sock.write_string(msg + '\n') or {}
pub fn (mut self Ghosts) add(mut ghost Ghost) &Ghost {self.ghosts << ghostmut first := self.ghosts.last() // pointers()[0] // hack around vlang crazy ptr mgmtreturn first // array add was copied. return copy.
pub fn (mut self Puppets) add(mut puppet Puppet) &Puppet {self.puppets << puppetreturn self.puppets.last() // puppet was copied. return copy.
mut msg := '$self.matrix.host is $self.matrix.conn_state in $self.matrix.joined_rooms.len() rooms. $self.irc.networks.len irc networks connected.'
mut msg := '$self.matrix.host is $self.matrix.conn_state in $self.matrix.joined_rooms.len() rooms. $self.irc.networks.networks.len irc networks connected.'
mut new_ircnet := self.irc.find_server(irc_temp.hostname) or { return false }go self.irc.dial(mut new_ircnet, new_ircnet.nick)
mut new_ircnet := self.irc.networks.add(irc_temp)mut bot_puppet := self.irc.new_ghost(mut new_ircnet, new_ircnet.nick)go bot_puppet.dial()
for ghost in ircnet.ghosts.ghosts {msg2 := '${ircnet.name}($ircnet.hostname) $ghost.nick $ghost.channels.channels.len channels'
for puppet in self.irc.puppets.puppets {msg2 := '$ircnet $puppet.nick $puppet.channels.channels.len channels'
for ircnet in self.irc.networks {for mut ghost in ircnet.ghosts.ghosts {vghost := *ghost // VBUGd_msg := 'nicksync $alias.irc == $vghost.nick'self.chat.say(system, '', network, room_id, d_msg)if old_nick == vghost.nick {msg := 'changing $ircnet.name $vghost.nick to $nick'self.chat.say(system, '', network, room_id, msg)ircnet.nick(mut *ghost, nick)}}
mut puppet := self.irc.puppets.by_nick(alias.irc) or {d_msg := 'nick $alias.irc not found'self.chat.say(system, '', network, room_id, d_msg)return false}d_msg := 'nicksync $alias.irc == $puppet.nick'self.chat.say(system, '', network, room_id, d_msg)if old_nick == puppet.nick {msg := 'changing $puppet.network $puppet.nick to $nick'self.chat.say(system, '', network, room_id, msg)puppet.nick(nick)
for ircnet in self.irc.networks {for ghost in ircnet.ghosts.ghosts {p_msg = '$ircnet.name $ghost.nick'
for ircnet in self.irc.networks.networks {puppets := self.irc.puppets.by_network(ircnet.name)for puppet in puppets {p_msg = '$ircnet $puppet.nick'
for mut ghost in ircnet.ghosts.ghosts {mut g_ghost := *ghost // vbugif g_ghost.nick == name {if g_ghost.state == .disconnected {msg = 'connecting to $ircnet.hostname'self.chat.say(system, '', network, room_id, msg)g_ghost.sock = self.irc.dial(mut ircnet, ircnet.nick)}}
if puppet.state == .disconnected {msg = 'connecting to $puppet.network'self.chat.say(system, '', network, room_id, msg)puppet.dial()
println('sync_irc_channels() $ircnet $ghost.nick joining $channel from db')ircnet.join(channel, ghost.nick)
println('sync_irc_channels() $ircnet $ghost joining $channel from db')// mut ghost_hack := self.irc.puppets.by_nick(ghost.nick) or { continue }// ghost_hack.join(channel)