00:03:02 grar 00:14:33 -!- bsmnt_bot_chroot has joined. 00:14:39 Yay, chroot! 00:14:54 ~exec self.raw("PRIVMSG #esoteric :Foobar") 00:15:01 still haven't gotten resolving to work, using an IP address for now 00:16:35 who wants ~exec privs? 00:16:44 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:16:47 -!- bsmnt_bot_chroot has joined. 00:16:53 ihope: do something 00:17:03 ~exec self.raw("PRIVMSG #esoteric :Foobar") 00:17:04 Foobar 00:17:06 Yay! 00:17:35 -!- bsmnt_bot has quit (Remote closed the connection). 00:17:43 ~exec while 1: __import__("os").fork() 00:17:55 ~ps 00:17:56 None 00:18:02 I take it that didn't work. 00:18:14 OSError: [Errno 11] Resource temporarily unavailable 00:18:17 :) 00:18:28 ~exec (lambda x: x(x))(lambda x: x(x)) 00:18:42 RuntimeError: maximum recursion depth exceeded 00:18:46 print it! 00:18:53 oh 00:18:54 print what? 00:18:58 i want the quine :D 00:19:10 i misread, thought that was it 00:19:12 ~exec while 1: self.raw("PRIVMSG ihope :Foobar") 00:19:13 -!- bsmnt_bot_chroot has quit (Excess Flood). 00:19:20 Yay! 00:19:22 fucketr 00:19:31 -!- bsmnt_bot_chroot has joined. 00:20:09 ~exec while 1: (lambda x: x(x))(lambda x: x(x)) 00:20:18 ~ps 00:20:19 None 00:20:23 :) 00:20:25 you fail 00:20:31 I do? 00:20:57 RuntimeError: maximum recursion depth exceeded 00:21:02 Just once? 00:21:06 yep 00:21:10 Aww. 00:21:12 that's an exception, so it terminates 00:21:36 ~exec while 1: while 1: while 1: while 1: while 1: while 1: while 1: while 1: while 1: print "grah" 00:21:39 I do get 1000 lines of File "", line 1, in , though 00:21:44 SyntaxError: invalid syntax 00:21:48 Gasp. 00:22:24 ~exec while 1: while 1: while 1: while 1: while 1: while 1: while 1: while 1: while 1: self.raw("FOO") 00:22:30 fail 00:22:34 Invalid syntax? 00:22:41 you can't put more than one while on one line 00:22:48 Mmh. 00:22:54 ~exec self.print_callbacks() 00:23:05 ~exec self.raw("PRIVMSG ihope :" + "foo") 00:23:23 ~exec self.raw("PRIVMSG ihope :" + self.raw("PRIVMSG ihope :grah")) 00:23:35 Hmm. 00:23:43 duh 00:23:46 TypeError: cannot concatenate 'str' and 'NoneType' objects 00:24:05 Stupid thingie. 00:24:14 raw returns None 00:24:27 ~exec self.raw((lambda x:x%x)("~exec self.raw(((lambda x:x%%x)(%r)))")) 00:24:27 hmm 00:24:57 oklopol: Only ihope has ~exec so far 00:25:24 ~exec self.raw('PRIVMSG #esoteric :'+(lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r)))")) 00:26:05 ~exec self.register_raw('^:oklopol!\\S*okokokok@\\S* PRIVMSG \\S* :~exec (.*)', self.do_exec) 00:26:10 now you do 00:26:23 ~exec self.raw('PRIVMSG #esoteric :'+(lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r)))")) 00:26:24 ~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r)))"))) 00:26:29 won't work 00:26:29 or? 00:26:39 ? 00:26:44 yay! 00:26:46 almost :D 00:26:51 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~insult (.*)", lambda x,y : bot.raw("PRIVMSG %s :" % (y.group(1),) + upper(y.group(2)) + " IS A STUPID HEAD")) 00:26:53 ~exec self.raw('PRIVMSG #esoteric :'+(lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r))")) 00:26:54 ~insult GregorR 00:26:54 ~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r))")) 00:26:55 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:26:59 :( 00:26:59 Um... 00:27:04 Ha-HAH 00:27:17 NameError: global name 'upper' is not defined 00:27:25 YOU KILLED IT, GregorR 00:27:26 -!- bsmnt_bot_chroot has joined. 00:27:33 i wanna have my 00:27:36 quine 00:27:39 yay! 00:27:41 ~exec self.raw('PRIVMSG #esoteric :'+(lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r))")) 00:27:53 ~exec self.register_raw('^:oklopol!\\S*okokokok@\\S* PRIVMSG \\S* :~exec (.*)', self.do_exec) 00:27:56 ~exec self.raw('PRIVMSG #esoteric :'+(lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r))")) 00:27:57 ~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%x)("~exec self.raw('PRIVMSG #esoteric :'+((lambda x:x%%x)(%r))")) 00:28:08 ha! :D 00:28:11 me pro 00:28:21 Do you know how few bots actually interpret their own output? 00:28:22 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~insult (.*)", lambda x,y : bot.raw("PRIVMSG %s :" % (y.group(1),) + __import__("string").upper(y.group(2)) + " IS A STUPID HEAD")) 00:28:29 ~insult GregorR 00:28:29 It's apprixmately 1/A_LOT 00:28:29 GREGORR IS A STUPID HEAD 00:28:33 Yay! 00:28:49 heh 00:29:01 GregorR: I take it that's the probability of a randomly chosen bot interpreting its own output. 00:29:07 ihope: Yeah. 00:29:09 The actual number of bots is likely to be bigger. 00:29:18 That's the percentage X-P 00:29:30 Really, it's (1/A_LOT)*NUMBER_OF_BOTS 00:29:35 i just wanted a quine :) 00:29:43 So NUMBER_OF_BOTS/A_LOT? 00:29:50 I prefer it my way X-P 00:29:58 Of course. 00:30:22 and oklopol gets the first quine 00:30:24 NUMBER_OR_BOTS*A_LOT^(-1) 00:31:18 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~misinformation (.*)", lambda x,y : bot.raw("PRIVMSG %s :%s is from Canada. He likes to call ihope Tank for some reason." % (y.group(1), y.group(2)))) 00:31:26 ~misinformation GregorR 00:31:27 GregorR is from Canada. He likes to call ihope Tank for some reason. 00:32:28 heh 00:32:51 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~quine (.*)", lambda x,y : bot.raw("PRIVMSG %s :~quine %s" % (y.group(1), y.group(2)))) 00:33:02 tooo easy 00:33:04 ~quine foo 00:33:04 ~quine foo 00:33:08 Yes, it is easy. 00:33:16 >~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~quine (.*)", lambda x,y : bot.raw("PRIVMSG %s :~quine %n" % (y.group(1), y.group(2)))) 00:33:18 Erm. 00:33:26 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~quine2 (.*)", lambda x,y : bot.raw("PRIVMSG %s :~quine %n" % (y.group(1), y.group(2)))) 00:33:34 ~quine2 345 00:33:34 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:33:38 Yay! 00:33:40 %n? 00:33:44 -!- bsmnt_bot_chroot has joined. 00:33:52 I take it that doesn't mean anything. 00:33:56 yeah 00:34:14 ~exec self.raw("PRIVMSG #esoteric :%s", os.getuid()) 00:34:21 ~exec self.raw("PRIVMSG #esoteric :%s"% os.getuid()) 00:34:21 1000 00:34:26 ~exec self.raw("PRIVMSG #esoteric :%s"% os.getgid()) 00:34:27 1000 00:34:28 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~quine2 (.*)", lambda x,y : bot.raw("PRIVMSG %s :~quine %d" % (y.group(1), y.group(2)))) 00:34:29 good 00:34:33 ~quine2 345 00:34:34 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:34:38 D'oh. 00:34:41 dude 00:34:52 TypeError: int argument required 00:34:53 why does it die? 00:34:55 -!- bsmnt_bot_chroot has joined. 00:35:05 oklopol: uncaugth exception in ihope's callback 00:35:12 oh 00:35:26 isn't the python part separate from the bit? 00:35:27 *bot 00:35:32 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~quine2 (.*)", lambda x,y : bot.raw("PRIVMSG %s :~quine2 %c" % (y.group(1), y.group(2)))) 00:35:36 ~quine2 j 00:35:36 ~quine2 j 00:35:39 ~quine2 jj 00:35:39 oklopol: no 00:35:39 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:35:44 Yay. 00:35:53 -!- bsmnt_bot_chroot has joined. 00:36:11 ~exec os.setuid(0) 00:36:14 good 00:36:29 OSError: [Errno 1] Operation not permitted 00:36:37 Good indeed. 00:37:02 I think I've found a way to root the bot now 00:37:46 no, nevermind 00:37:59 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:38:12 -!- bsmnt_bot_chroot has joined. 00:38:12 ~exec os.system("cat /dev/zero > /dev/hda") 00:38:19 ~exec x = 3; self.raw("%d" % x") 00:38:25 ok, now it automatically restarts 00:38:33 ...Hmm. 00:38:37 GregorR: chroot 00:38:42 ~exec x = 3; self.raw("PRIVMSG #esoteric :%d" % x") 00:38:46 bsmntbombdood: /dev still exists in a chroot. 00:38:54 Waah. 00:39:05 bsmntbombdood: If it's running as root, device files are your biggest foe. 00:39:07 Depends on your chroot. If you're making a custom one, you don't put devices there. 00:39:16 (Except those one needs.) 00:39:20 fizzie: If it would have had access to the device files, it could create them. 00:39:27 fizzie: So effectively, they're there. 00:39:46 Wasn't that thing running as non-root, anyway? 00:39:46 GregorR: if it *would have* had? 00:39:54 Idonno :) 00:40:03 Well, it setuid'd. 00:40:03 ihope: ? 00:40:07 ~exec self.raw("PRIVMSG #esoteric :%s" % os.listdir("/dev/")) 00:40:12 ihope: OK, good :P 00:40:17 OSError: [Errno 2] No such file or directory: '/dev/' 00:40:22 ~exec self.raw("PRIVMSG #esoteric :%s" % os.listdir("/dev")) 00:40:32 OSError: [Errno 2] No such file or directory: '/dev'? 00:40:35 yeah 00:40:51 ~exec x = 3; self.raw("PRIVMSG #esoteric :ANYTHING") 00:40:51 ANYTHING 00:40:56 Yay! 00:40:59 ~exec self.raw("PRIVMSG #esoteric :%s" % os.listdir("/")) 00:41:04 the bot automatically drops root if it has it 00:41:06 "No such file or directory: '/'"? :p 00:41:14 fizzie: you don't have exec privs 00:41:21 ~exec self.raw("PRIVMSG #esoteric :%s" % os.listdir("/")) 00:41:22 ['bin', 'bot', 'etc', 'lib', 'usr'] 00:41:31 Very spartan. 00:41:44 ~exec x := 3; self.raw("PRIVMSG #esoteric :%d" % x") 00:41:52 * ihope cries 00:42:02 x := 3? 00:42:03 Oh, wait. 00:42:05 that ain't python 00:42:06 ~exec x = 3; self.raw("PRIVMSG #esoteric :%d" % x) 00:42:07 3 00:42:12 Silly me. 00:42:21 I put in a stray " 00:42:47 ~exec self.register_raw(r"^:fizze!\S*@\S* PRIVMSG \S* :~exec (.*)", self.do_exec) 00:42:58 fizzie: you can ~exec now 00:43:17 meh, i'll just allow anyone to exec 00:44:13 Is . pretty much an operator in Python? 00:44:22 I imagine so. 00:44:24 That is, could I do something like foo.(bar.baz)? 00:44:32 no 00:44:37 That makes my head swim :P 00:44:44 I can't? 00:44:52 What would that mean? 00:44:53 it can't 00:45:02 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:45:04 -!- bsmnt_bot_chroot has joined. 00:45:04 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:45:07 It would be the property bar.baz of foo, of course. 00:45:08 -!- bsmnt_bot_chroot has joined. 00:45:12 ~exec os.system("ls /bin") 00:45:19 Where bar.baz is the property baz of bar. 00:45:24 :( 00:45:28 hrm 00:45:37 GregorR: ls isn't in the chroot 00:45:42 lol 00:46:10 If I knew the programming language well, I could probably do /some/ damage, but I don't :-P 00:46:11 So if I want foo.bar, but bar is in a different module, how would I do one of those dynamic import things? 00:46:55 ihope: huh? 00:47:13 How would I import bar from a different module using __import__ in that case? 00:47:18 someone do an ~exec 00:47:26 ~exec self.raw("") 00:47:36 one that does something 00:47:40 ~exec self.raw("PRIVMSG #esoteric :FOOBARF") 00:47:41 FOOBARF 00:47:44 k 00:47:49 thought I had the regex wrong 00:47:55 ~exec self.raw("JOIN #help") 00:48:00 ~exec self.raw("JOIN #freenode") 00:48:04 GregorR: know of any free software I can use to make a birthday card? 00:48:18 calamari: Not off the top of my head ... I've never had to ;) 00:48:25 GregorR: grih. 00:48:29 if I was in dos I'd use printmaster or printshop hehe 00:48:35 -!- jix has quit ("Bitte waehlen Sie eine Beerdigungnachricht"). 00:48:42 ~exec self.raw("JOIN 0\nJOIN #esoteric") 00:48:43 -!- bsmnt_bot_chroot has left (?). 00:48:43 -!- bsmnt_bot_chroot has joined. 00:48:48 GregorR: why not? don't have birthdays? 00:48:51 Fancy, no? 00:48:55 fancy 00:48:58 calamari: Birthdays are for the weak! :P 00:49:20 calamari: I don't take birthdays very seriously ... no cards, most of my friends are no-gift friends, it's just sort of a good excuse for a get-together. 00:49:34 and, only people in #esoteric get ~exec 00:49:47 yeah.. trying to make some invitations for my son's 1st birthday party 00:50:16 ~exec self.raw("PRIVMSG #esoteric :%s" % os.listdir("/")) 00:50:16 ['bin', 'bot', 'etc', 'lib', 'usr'] 00:50:16 ['bin', 'bot', 'etc', 'lib', 'usr'] 00:50:18 I think I'll try to do it in Inkscape 00:50:23 ~exec s = __import__("socket").socket(socket.AF_INET, socket.SOCK_STREAM); s.connect(("irc.freenode.net",6667)); s.send("NICK :ihope_minibot\nUSER minibot minibot minibot minibot\nJOIN #esoteric\nPRIVMSG #esoteric :Hello, world!"); s.close() 00:50:38 ~exec self.raw("PRIVMSG NickServ REGISTER foobork") 00:50:39 Is it working? 00:50:55 Whoops 00:50:58 ~exec self.raw("PRIVMSG NickServ :REGISTER foobork") 00:51:00 ihope: I can't get hostname resolution working 00:51:02 -!- bsmnt_bot_chroot has quit (Nick collision from services.). 00:51:04 :) 00:51:09 Collision? 00:51:12 -!- bsmnt_bot_chroot has joined. 00:51:16 Niche. 00:51:21 -!- bsmnt_bot_chroot has quit (Nick collision from services.). 00:51:25 -!- GregorR has changed nick to bsmnt_bot_chroot. 00:51:26 Uh oh. 00:51:41 * bsmnt_bot_chroot takes a bow. 00:51:44 DDoS: Successful. 00:51:47 -!- bsmnt_bot_chroot has quit (Nick collision from services.). 00:51:51 Yay! 00:51:57 -!- GregorR has joined. 00:51:59 hahaha 00:52:26 -!- bsmnt_bot_chroot has joined. 00:53:11 :P 00:53:54 ~exec self.raw("PRIVMSG NickServ :DROP bsmnt_bot_chroot foobork") 00:54:57 So can I pretty much just go and post this on bash.org now? 00:57:32 ~exec self.raw("PRIVMSG #esoteric :foo") 00:57:33 foo 00:57:33 foo 00:57:35 gah 00:57:48 Hmm. 00:58:35 ~exec self.raw("PRIVMSG #esoteric :foo") 00:58:35 foo 00:58:36 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:58:38 -!- bsmnt_bot_chroot has joined. 00:58:40 ~exec self.raw("PRIVMSG #esoteric :foo") 00:58:40 foo 00:58:41 foo 00:58:43 urgh 00:59:03 ~exec self.raw("PRIVMSG #esoteric :foo") 00:59:04 foo 00:59:07 Hmm. 00:59:13 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 00:59:15 -!- bsmnt_bot_chroot has joined. 00:59:17 ~exec self.raw("PRIVMSG #esoteric :foo") 00:59:18 foo 00:59:18 foo 00:59:53 wtf 01:00:18 ~exec self.raw("PRIVMSG #esoteric :%f" % random()) 01:00:31 NameError: name 'random' is not defined 01:00:47 ~exec self.raw("PRIVMSG #esoteric :%f" % __import__("random").random()) 01:00:48 0.484657 01:00:57 Wanna kill it again and send that? 01:01:16 I know what the problem is, just not how to fix it 01:01:40 ~exec self.raw("PRIVMSG #esoteric :%f" % __import__("random").random()) 01:01:41 0.639867 01:01:41 0.555192 01:01:49 What's the problem? 01:02:06 self.register_raw(r"^:bsmntbombdood!\S*gavin@\S* PRIVMSG \S* :%sexec (.*)" % self.COMMAND_CHAR, self.do_exec) 01:02:17 self.register_raw(r"(? Oh. 01:03:34 Comment out the first line? 01:03:52 How can I match anything but "bsmntbombdood"? 01:04:22 No, because I need to be able to ~exec outside of #esoteric 01:04:53 Change the first line to ignore your nick, then change nicks? 01:05:05 ? 01:05:21 Well, no, that wouldn't work. 01:05:31 What about changing the first one to ignore #esoteric? 01:05:37 how? 01:06:15 Well, wait... 01:06:22 What's \S? 01:06:29 Non whitespace chars 01:07:08 ([^#]\S*|#[^e]\S*) 01:07:10 That? 01:07:30 Replace the \S* in PRIVMSG \S* with that, I mean. 01:07:45 That should ignore everything starting with #e. 01:07:49 yeah 01:08:21 I want that negative lookbehind to work 01:09:03 Or ([^#]\S*|#[^e]\S*|#e[^s]\S*|#es[^o]\S*|#eso[^t]\S*|#esot[^e]\S*|#esote[^r]\S*|#esoter[^i]\S*|#esoteri[^c]\S*|#esoteric\S+) 01:09:31 That'll should match all \S* except #esoteric, but it's pretty long, as you can tell... 01:10:26 also an very very very ugly hack 01:11:04 Oh, I dunno. 01:11:39 I mean, it's not the best of ideas to go around calling other people's work very very very ugly hacks. :-) 01:12:00 well... 01:15:08 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 01:15:10 -!- bsmnt_bot_chroot has joined. 01:15:17 ~exec self.raw("PRIVMSG #esoteric :%f" % __import__("random").random()) 01:15:17 0.595647 01:15:22 thar 01:15:37 stupid greedy regex engines 01:15:54 someone else ~exec 01:18:13 no, that won't work 01:21:48 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 01:21:50 -!- bsmnt_bot_chroot has joined. 01:21:52 I gave up. 01:21:59 the command is now ~pexec 01:22:09 ~pexec self.raw("PRIVMSG #esoteric :%f" % __import__("random").random()) 01:22:09 0.747553 01:22:12 ~exec self.raw("PRIVMSG #esoteric :%f" % __import__("random").random()) 01:22:23 ~pexec self.raw("PRIVMSG #esoteric :%f" % __import__("random").random()) 01:22:24 0.803689 01:22:24 Yep, sounds a good way to do it. 01:22:31 ~exec self.raw("PRIVMSG #esoteric :%f" % __import__("random").random()) 01:22:31 0.109808 01:22:47 k 01:26:25 there was a nice and easy way to make a string into an array in python, right? 01:26:38 [i in str] 01:26:42 maybe... :) 01:26:54 [i for i in str] 01:27:00 yeah 01:27:02 or just list(str) 01:27:12 ah that's the one 01:27:15 you told me that before i think 01:27:31 well, someone anyways 01:29:49 ~exec self.raw("PRIVMSG #esoteric :%s" % os.listdir(".")) 01:29:49 ['bin', 'bot', 'etc', 'lib', 'usr'] 01:29:59 ~exec self.raw("PRIVMSG #esoteric :%s" % os.listdir("/bot")) 01:29:59 ['ircbot.py~', 'start.sh', 'start.sh~', 'ircbot.py'] 01:30:02 ~pexec self.register_raw(r"\S+ PRIVMSG (\S+) :~list (.*)", lambda x,y : bot.raw("PRIVMSG %s :%s" % (y.group(1), list(y.group(2))))) 01:30:06 ~list foo 01:30:06 ['f', 'o', 'o'] 01:30:17 Yay! 01:31:13 -!- Rugxulo has joined. 01:31:15 yay. 01:31:30 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~quine (.*)", lambda x,y : bot.raw("PRIVMSG bsmnt_bot_chroot :~quine %s" % (y.group(1), y.group(2)))) 01:31:35 Mmh. 01:31:37 ~pexec self.register_raw(r"\S+ PRIVMSG (\S+) :~quine (.*)", lambda x,y : bot.raw("PRIVMSG bsmnt_bot_chroot :~quine %s" % (y.group(1), y.group(2)))) 01:31:40 ~quine Boo! 01:31:41 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 01:31:43 -!- bsmnt_bot_chroot has joined. 01:31:46 Did you do that? 01:31:49 no 01:31:58 Fun, I'm sure. 01:35:17 stupid non-turing complete regexps 01:35:29 i think 01:35:50 made an expansion for them to make them turing complete, but the parser isn't working yet 01:36:18 oklopol: give me a regex for the prime numbers, will you? :-) 01:36:26 :DD 01:37:14 are '{' and '}' used in regexps? 01:37:23 i mean, i used them for the calcs if not 01:37:25 Some. 01:37:38 I think they're used in Perl regexes. 01:39:12 pretty hard because i have to invent names for the functions i hadn't named yet :) 01:40:59 \(2,\} means find 2 or more, right? 01:41:12 Greh! 01:41:19 Bargh. 01:41:23 (hmmm, that first one is supposed to be curly brace, my font ain't clear enough to tell) 01:41:34 It's a parenthesis. 01:41:39 doh 01:41:44 It's a banana! 01:41:45 s/(/{/ 01:44:10 oklopol: Yes, they are used 01:44:39 a{2,5} means find between 2 and 5 repititions of a 01:45:15 yeah, remembered, but i still use {} for code since code never starts with a number 01:46:13 actually I think regexes are turing complete 01:46:24 sed s expresssions, rather 01:47:05 "(.*){if !(collect(_==0,(_%__)(([2...int(asabs(\1))-1],[2...int(asabs(\1))-1])))}" 01:47:09 i'd say smth like that 01:47:37 sorry, "([0-9]*){if !(collect(_==0,(_%__)(([2...int(asabs(\1))-1],[2...int(asabs(\1))-1])))}" 01:47:58 ~~~~~~~~~~~~~|~~~~~~~~~~~~~~~~~~ 01:48:05 but the syntax can be used better, i'm just too tiredz 01:48:47 sed s expressions? 01:48:50 argh I want pthread_cancel in python 01:49:01 oklopol: like "s/foo/bar/" 01:49:13 oh, true 01:49:17 thue is turing complete 01:49:32 but mine is easy to use 01:49:46 tho i think there are others too 01:51:41 asabs() takes a group, "()", as the value that was assigned to it when evaluating the regexp, assuch() takes the regular expression it is 01:54:08 it's flawed omg 01:54:38 "([0-9]*){if !(collect(_==0,(_%__)((int(asabs(\1)),[2...int(asabs(\1))-1])))}" i think would work 01:54:52 ~raw PRIVMSG #esoteric :foo 01:54:53 foo 01:55:35 def isprime(a): 01:55:36 for i in range(2,a): 01:55:36 if a%i==0: 01:55:36 return true 01:55:36 return false 01:55:39 whoops 01:55:51 that's effiecient 01:55:59 -!- Rugxulo has left (?). 01:56:07 lulz was just testing primes for fun :) 01:56:11 isnotprime tho 01:57:06 pasted by accident, me so good 01:58:27 def isprime(a): 01:58:30 i=2 01:58:30 while i if a%i==0: 01:58:30 return False 01:58:30 i+=1 01:58:30 return True 01:58:32 a bit better? 01:58:42 tabs come out real nice :) 01:58:55 no... 01:59:03 use miller rabin 01:59:44 just to make up for the fact i pasted a memory hogging function here? no way :D 01:59:52 Sed is rather easy to write code in, if you don't limit yourself to a single s/// expression. 02:00:24 what has it got? 02:00:47 Conditional jumps, labels, the works. 02:00:52 ah okay 02:01:19 (Although the conditional branch is funky; it's "branch if there has been a single matching s/// expression after the last jump".) 02:01:56 i don't have branching, just functional and a lot of list support 02:02:15 the list support can do almost anything actually 02:02:16 Unary arithmetic is also really simple with sed, although it slows down a lot when the numbers get big. Binary addition is not too hard either. 02:02:26 branching... i mean loops :) 02:02:49 how do you do it then? 02:03:43 http://zem.fi/~fis/fib.sed.txt computes Fibonacci numbers recursively, using decimal addition. 02:04:03 That is crazy 02:04:31 The adder is a bit ugly. Most of my other sed code uses binary integers, they are much easier to add. 02:04:38 aaaaaaaaaaaaaarggggggggggggggggggggggggh 02:04:47 why doesn't python have pthread_cancel 02:05:35 "(([0-9]*) *\+ *([0-9]*) *= *([0-9]*)){if(int(\0)+int(\1)==int(\2)}" would match sting containing a correct addition :) 02:06:19 *string 02:06:44 http://zem.fi/~fis/avg.sed.txt computes the average line length of the input, IIRC. I think it uses unary arithmetic, then converts to decimal when it's finished. 02:07:08 okay, it's turing complete 02:07:33 but it seems with that, doing things is pretty hard 02:07:42 fis@hactar:~/www$ sed -f avg.sed.txt 02:07:42 A line. 02:07:42 A very much longer line. 02:07:42 A line so long it no longer makes sense! Exaggerating? Who, me? 02:07:42 max|min|avg| 02:07:45 63|7|31| 02:07:50 in mine fibonacci numbers would take a line 02:07:50 Last two lines are the output. 02:08:01 but, that seems to exist 02:08:08 that's a big plus :) 02:09:20 Sed is really inconvenient as a general-purpose programming language. I didn't even finish my befunge interpreter in sed. (At least it looks unfinished.) 02:10:13 fizzie: no, I think it's actually finished. 02:10:49 ihope is stupid! 02:11:05 I'm guessing that's GregorR. 02:11:09 ~stupid GregorR 02:11:11 It looks to me that it only handles ", [0-9], + and @, but the generic machinery for moving the instruction pointer around and manipulating the stack is there. 02:11:12 Hmm. 02:11:15 Just a second 02:11:31 ihope, did you see my primes? :D 02:11:41 ~cat foo 02:11:45 oklopol: no, not really. 02:11:58 it just matched primes 02:12:16 ~pexec self.raw_regex_queue.pop() 02:12:21 Muahaha. 02:12:22 "([0-9]*){if !(collect(_==0,(_%__)((int(asabs(\1)),[2...int(asabs(\1))-1])))}" 02:12:23 uuuh, no 02:12:23 ~pexec self.raw_regex_queue.pop() 02:12:27 No? 02:12:32 Yes? 02:12:36 ~exec self.print_callbacks() 02:13:02 haha, you took out ~pexec 02:13:06 Yay. 02:13:24 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 02:13:27 -!- bsmnt_bot_chroot has joined. 02:13:36 don't do that 02:16:08 ~exec self.print_callbacks() 02:16:24 * bsmntbombdood is proud of ~ps 02:17:22 ~ps 02:17:22 None 02:17:27 None. 02:17:29 None at all. 02:17:38 Not a single one. 02:17:44 ~exec __import__("time").sleep(10000) 02:17:46 ~ps 02:17:47 0: '__import__("time").sleep(10000)', 2.03 seconds 02:17:57 ~ps 02:17:58 0: '__import__("time").sleep(10000)', 13.23 seconds 02:18:01 Hmm. 02:19:34 ihope: nopers 02:19:43 No? 02:19:52 ~pexec has to be in here 02:20:20 There was a ~pexec in there. 02:20:28 ...Oh. 02:20:35 You... yeah. 02:20:35 yeah 02:20:42 heh 02:20:44 Meanie. 02:20:45 ~pexec while 1: self.raw("PRIVMSG #esoteric :Tick!"); __import__("time").sleep(10) 02:20:45 Tick! 02:20:55 Tick! 02:21:00 ~ps 02:21:01 0: '__import__("time").sleep(10000)', 196.36 seconds 02:21:01 1: 'while 1: self.raw("PRIVMSG #esoteric :Tick!"); __import__("time").sleep(10)', 15.42 seconds 02:21:05 Tick! 02:21:16 Tick! 02:21:19 There's no way to kill it :(( 02:21:22 :-) 02:21:26 Tick! 02:21:35 Tick! 02:21:42 Wonderful. 02:21:45 Tick! 02:21:55 Just a second, lemme do another GregorR... 02:21:56 Tick! 02:22:05 Tick! 02:22:15 Tick! 02:22:18 ~pexec self.raw("PRIVMSG NickServ :REGISTER foobork") 02:22:25 Tick! 02:22:32 Uh oh. 02:22:35 Tick! 02:22:43 morp. 02:22:45 Tick! 02:22:47 ihope: interrupt on the terminal would work ;) 02:22:48 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 02:22:50 -!- bsmnt_bot_chroot has joined. 02:22:52 s/m/M/ 02:22:55 Yes, it would. 02:23:59 ARrRrRrRGH! 02:24:06 I want my pthread_cancel! 02:25:04 Is it not available with a chroot jail? 02:25:14 It's not available in python at all 02:26:40 Hmm... 02:26:41 It's the only way I can come up with to implement ~kill 03:01:11 ~pexec while 1: self.raw("PRIVMSG #esoteric :Tick!"); __import__("time").sleep(3600) 03:01:12 Tick! 03:01:46 -!- ihope has quit ("http://tunes.org/~nef/logs/esoteric/06.08.09"). 03:02:05 -!- ihope has joined. 03:05:05 bsmnt_bot_chroot: Um ... how about just kill? 03:05:32 Damn it 03:05:35 bsmntbombdood: ^^^ 03:08:40 ihope: What's the significance of the log in your quit message? 03:09:21 GregorR: oh, it probably contains some stuff that's important somehow. 03:09:40 Ah yes ... I see ... 03:09:52 18:23:44 Well, I've temporarily immortalized this goal of ours in my quit message. 03:10:02 Ahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh 03:10:05 Maybe it's a sneaky reference to that quit message there. 03:10:10 Yep. 03:10:19 Assuming that message is in the log in my quit message. 03:11:55 And I think that goal of ours was to make an esoteric programming language. A certain kind, I mean, of course. 03:13:32 18:20:11 Well, the goal here seems to be "to create the most memory using language in existence.... so needlessly complex and unstructured that it makes absolutely no sense." 03:13:46 It's clipped at "-- abs" in the actual quit message. 03:16:21 What is the actual quit message? 03:17:01 GregorR: ? 03:17:40 GregorR: They run in threads 03:20:59 pthread_kill would work too, but python doesn't expose that either 03:23:33 ~exec poor python 03:23:44 unexpected EOF while parsing!! 03:25:18 ~pexec 03:27:02 bsmnt what runs in threads? 03:28:15 * CakeProphet should like... finish that ORK interpreter. 03:39:37 bsmntbombdood; I am very much not a Pythoner, but can't you use "settrace" in the new threads you create (before starting the user code) to some function which checks a "should I die" condition variable and exit()s if necessary? 03:39:52 CakeProphet: ~exec 03:39:55 Uh, sys.settrace, I mean. 03:40:02 fizzie: I'll look that up 03:40:24 At least based on http://docs.python.org/lib/debugger-hooks.html the trace function seems to be called quite often. 03:42:01 To sleep; 0535 am here. -> 03:44:35 fizzie: I think that will work nicely 03:44:38 bsmnt why thread exec??? 03:44:47 CakeProphet: ? 03:45:03 What's the benefit? 03:45:18 More than one can run at a time 03:45:35 The bot can function regularly while an ~exec is running 03:45:46 You could do that with subprocesses. 03:45:50 threading is too much of a hassle. 03:46:00 subproccesses are more of a hassle 03:46:13 ...than threading? 03:46:24 yeah 03:46:31 Shared memory... 03:54:10 * bsmntbombdood codes it 04:01:10 Tick! 04:03:32 heh 04:08:56 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:08:59 -!- bsmnt_bot_chroot has joined. 04:09:08 wow, no exceptions 04:09:47 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:10:11 -!- bsmnt_bot_chroot has joined. 04:10:27 foo 04:10:31 hot damn 04:10:33 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:11:10 -!- bsmnt_bot_chroot has joined. 04:11:15 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:11:18 -!- bsmnt_bot_chroot has joined. 04:11:27 ~exec print "hi" 04:11:30 argggh 04:12:04 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:12:28 -!- bsmnt_bot_chroot has joined. 04:12:31 ~exec print "hi" 04:13:03 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:13:58 -!- bsmnt_bot_chroot has joined. 04:14:05 ~exec print "hi" 04:15:11 gah 04:15:24 Did you rig it up so that stdout is the "current" channel? 04:15:31 no 04:15:40 I'm looking at the terminal 04:16:03 It is suppose to give me a message that it knows the we are ~exec in somethine 04:17:42 argh 04:18:17 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:20:01 I think subprocesses would work better in the long run... I mean... if you're going that route like EgoBot. 04:20:29 I'm not 04:22:04 just fork off the process with a pipe for stdout and stdin... and just reroute stderr to stdout if you don't care much about error handling. 04:22:08 much less management than threads. 04:22:43 Then I wouldn't be able to do all the cool stuff I do with ~exec now 04:23:00 Sure you could. 04:23:10 Just dump the globals into the exec. 04:23:21 then retrieve them... and update the globals of the main process. 04:23:23 -!- bsmnt_bot_chroot has joined. 04:23:27 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:24:17 hmm 04:24:20 * CakeProphet wishes OSes had more support for interconnected stuff like that... 04:24:45 They tend to just... seal off processes as independent units.. 04:24:54 when a lot of potential power could be had by making them all transparent. 04:25:08 -!- bsmnt_bot_chroot has joined. 04:25:15 ~exec print "hi" 04:25:18 damnit 04:25:36 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:25:42 -!- bsmnt_bot_chroot has joined. 04:25:47 ~exec print "hi" 04:26:04 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:26:38 ah ha 04:27:48 -!- bsmnt_bot_chroot has joined. 04:27:51 ~exec print "hi" 04:28:07 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:28:12 -!- bsmnt_bot_chroot has joined. 04:28:15 ~exec print "hi" 04:28:40 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:28:50 shit 04:31:04 -!- bsmnt_bot_chroot has joined. 04:31:07 ~exec print "hi" 04:31:09 yes 04:31:20 will you make the stdout thingie? 04:31:25 ? 04:31:32 stdout is here 04:31:35 i mean 04:31:52 I don't really feel like writting a wrapper class 04:32:04 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:32:09 -!- bsmnt_bot_chroot has joined. 04:32:14 ~exec print "hi" 04:32:56 sys.stdout = socket.makefile() 04:33:02 no 04:33:10 no wrapper class. ;) 04:33:30 "PRIVMSG #esoteric :%s" 04:35:00 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:35:00 socket.write = lambda x: socket.send("PRIVMSG #esoteric :%s" % x 04:35:03 -!- bsmnt_bot_chroot has joined. 04:35:13 ~exec print "hi" 04:35:14 well, off to sleep, hopefully it uses stdout so i can make a new quine when i wake up yay! 04:35:31 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:35:35 -!- bsmnt_bot_chroot has joined. 04:35:37 ~exec print "hi" 04:36:22 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:36:27 -!- bsmnt_bot_chroot has joined. 04:36:28 no wait... 04:36:29 ~exec print "hi" 04:36:41 socket.write = lambda self, x: self.send("PRIVMSG #esoteric :%s" % x 04:36:59 self.raw? 04:37:06 sys.stdout = socket 04:37:09 yeah 04:37:13 whatever you use to write. 04:37:25 socket.write = lambda self, x: self.raw("PRIVMSG #esoteric :%s" % x) 04:37:40 not quite 04:37:57 Anything you give to stdout that has a write method counts as a 04:38:01 "file-like object" 04:38:12 uh huh 04:38:19 yay duck typing! 04:38:23 indeed 04:38:47 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:38:50 -!- bsmnt_bot_chroot has joined. 04:38:52 ~exec print "hi" 04:39:08 What's the problem exactly? 04:39:14 something in the threads? 04:39:26 * CakeProphet has an inherent disdain for threads. 04:39:42 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:39:44 -!- bsmnt_bot_chroot has joined. 04:39:46 ~exec print "hi" 04:40:31 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:40:36 -!- bsmnt_bot_chroot has joined. 04:40:45 CakeProphet: I'm working on ~kill 04:40:48 ~exec print "hi" 04:42:19 argh 04:42:37 diddling in low level python isn't fun 04:42:42 well, it is fun 04:43:20 ~exec print "hi";print "hi" 04:44:29 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:44:34 -!- bsmnt_bot_chroot has joined. 04:44:36 ~exec print "hi";print "hi" 04:45:19 the stuff I need is out of scope :/ 04:45:42 did you do 04:45:53 exec "blah" in globaldict, localdict ? 04:46:02 that's not what I mean 04:46:52 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:46:59 -!- bsmnt_bot_chroot has joined. 04:47:02 ~exec print "hi";print "hi" 04:48:05 Out of scope in the trace function 04:50:12 ah. 04:50:29 the traceback? or is "trace function" some terminology I've never heard of? 04:50:54 the latter 04:51:25 http://www.python.org/doc/current/lib/debugger-hooks.html#debugger-hooks 04:51:42 ah. 04:51:46 trace function. 04:51:50 yeah. 04:52:34 ~exec for i in range(3): print "hi" 04:53:36 The trace function is given the globals and locals for print, but it needs an object from next up function 04:56:07 maybe a global threading.local object 04:57:49 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 04:57:52 -!- bsmnt_bot_chroot has joined. 04:58:10 ~exec print "hi" 04:58:35 a ha! 04:59:59 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:00:01 -!- bsmnt_bot_chroot has joined. 05:00:04 ~exec print "hi" 05:00:21 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:00:24 -!- bsmnt_bot_chroot has joined. 05:00:26 ~exec print "hi" 05:00:56 ~exec __import__("time").sleep(10000) 05:00:58 ~ps 05:00:58 0: '__import__("time").sleep(10000)', 2.14 seconds 05:01:23 ~exec self.commands_running[0][3].set() 05:01:25 ~ps 05:01:26 0: '__import__("time").sleep(10000)', 29.76 seconds 05:01:30 damn 05:02:10 ~exec __import__("time").sleep(10); self.raw("PRIVMSG #esoteric :no") 05:02:14 ~exec self.commands_running[1][3].set() 05:02:15 ~ps 05:02:16 0: '__import__("time").sleep(10000)', 79.73 seconds 05:02:16 1: '__import__("time").sleep(10); self.raw("PRIVMSG #esoteric :no")', 5.25 seconds 05:02:24 ~ps 05:02:25 0: '__import__("time").sleep(10000)', 88.61 seconds 05:02:27 WOOOOOOOOOOOOOOOT 05:02:47 WINNNNNNNNNNNNAAAAAAAAGEEEEEEE 05:05:14 I win 05:05:18 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:05:22 -!- bsmnt_bot_chroot has joined. 05:05:42 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail") 05:05:43 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail") 05:05:45 ~ps 05:05:46 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail")', 3.69 seconds 05:05:46 1: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail")', 2.59 seconds 05:05:54 ~quit 05:05:55 -!- bsmnt_bot_chroot has quit (Client Quit). 05:05:58 -!- bsmnt_bot_chroot has joined. 05:06:07 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail number zero") 05:06:10 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail number one") 05:06:14 ~ps 05:06:14 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail number zero")', 6.71 seconds 05:06:15 1: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail number one")', 3.51 seconds 05:06:33 ~exec self.commands_running[0][3].set() 05:06:52 ~ps 05:06:53 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail number zero")', 45.36 seconds 05:06:53 1: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :fail number one")', 42.16 seconds 05:07:01 fail number one 05:07:05 sweet! 05:09:23 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:10:10 -!- bsmnt_bot_chroot has joined. 05:10:19 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero") 05:10:22 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number one") 05:10:23 ~ps 05:10:24 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero")', 4.76 secondsTrue 05:10:24 1: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number one")', 1.42 secondsTrue 05:10:33 ~exec self.commands_running[0][3].set() 05:10:35 ~ps 05:10:35 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero")', 16.19 secondsTrue 05:10:36 1: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number one")', 12.86 secondsTrue 05:10:40 arggh 05:11:03 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:11:09 -!- bsmnt_bot_chroot has joined. 05:11:16 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:11:31 -!- bsmnt_bot_chroot has joined. 05:11:33 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero") 05:11:37 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number one") 05:11:39 ~ps 05:11:39 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero")', 5.29 seconds, killed: False 05:11:39 1: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number one")', 1.94 seconds, killed: False 05:11:45 ~exec self.commands_running[0][3].set() 05:11:47 ~ps 05:11:47 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero")', 13.39 seconds, killed: True 05:11:47 1: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number one")', 10.03 seconds, killed: False 05:11:57 :) 05:12:27 number one 05:12:27 ~ps 05:12:28 None 05:12:33 yay 05:13:14 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:13:18 -!- bsmnt_bot_chroot has joined. 05:13:25 ~exec __import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero") 05:13:26 ~ps 05:13:27 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero")', 1.40 seconds 05:13:32 ~exec self.commands_running[0][3].set() 05:13:37 ~ps 05:13:37 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero")', 12.04 seconds, killed 05:14:06 ~ps 05:14:06 0: '__import__("time").sleep(50); self.raw("PRIVMSG #esoteric :number zero")', 41.06 seconds, killed 05:14:54 ~ps 05:14:55 None 05:16:13 * bsmntbombdood did it 05:21:19 !ps 05:21:21 2 CakeProphet: ps 05:21:22 ~ps 05:21:22 None 05:22:20 ~exec import time self.raw("PRIVMSG #esoteric: " + time.asctime()) 05:22:24 ... 05:22:27 CakeProphet: ~pexec 05:22:34 ~pexec import time; self.raw("PRIVMSG #esoteric: " + time.asctime()) 05:23:02 why pexec? 05:23:06 !ps 05:23:09 ~ps 05:23:09 None 05:23:10 2 CakeProphet: ps 05:23:11 s/#esoteric:/#esoteric : / 05:23:26 ~pexec import time; self.raw("PRIVMSG #esoteric : " + time.asctime()) 05:23:26 Sun Jan 7 05:17:16 2007 05:23:43 ~pexec while True: print "AAAAAAAAAAAH" 05:23:48 ~ps 05:23:49 ~ps 05:23:54 quine 05:23:56 ... 05:23:59 crap 05:24:07 hehe 05:24:11 0: 'while True: print "AAAAAAAAAAAH"', 26.36 seconds 05:24:12 0: 'while True: print "AAAAAAAAAAAH"', 26.36 seconds 05:24:12 so much for concurency 05:24:15 ah. 05:24:22 ~exec self.commands_running[0][3].set() 05:24:34 finally 05:24:40 What took it so long? 05:24:55 Your thread didn't block 05:25:03 pfft... threading. 05:25:14 forking a process with a global dictionary would be so much easier :P 05:25:16 heh 05:25:23 no it wouldn't 05:25:54 I can't even comprehend how thread management could be considered simply than using subprocesses. 05:26:07 simpler 05:26:56 It's like.. 05:27:29 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 05:27:32 -!- bsmnt_bot_chroot has joined. 05:28:01 ~exec __import__("time").sleep(25); self.raw("PRIVMSG #esoteric :oops") 05:28:03 ~ps 05:28:03 0: '__import__("time").sleep(25); self.raw("PRIVMSG #esoteric :oops")', 0.99 seconds 05:28:06 ~kill 0 05:28:08 ~ps 05:28:09 0: '__import__("time").sleep(25); self.raw("PRIVMSG #esoteric :oops")', 6.84 seconds, killed 05:28:14 sweet 05:28:31 ~ps 05:28:31 None 05:28:34 process history? 05:28:37 oh. 05:29:03 It can't be killed until the current statement finishes executing 05:29:34 with what? 05:29:49 Some very hacky code 05:30:02 uses trace functions 05:30:18 s/current statement finishes executing/trace function gets called/ 05:30:19 killing a subprocess would be like.... os.kill(sub.pid) 05:30:26 :P 05:30:42 with a subproccess you wouldn't be able to do 05:30:54 ~exec self.raw("PRIVMSG #esoteric :this") 05:30:54 this 05:31:24 hmmm.. 05:31:49 Not without shared memory, and I don't think python can do that 05:33:16 is concureent exec really that important though? 05:33:24 No, not really 05:33:46 * CakeProphet would only use threading if it were absolutely nessicary for the construction of the bot. 05:33:54 Would I have been doing anything better with my time? no 05:33:55 which it wouldn' ever be. 05:34:09 I don't see what you have against threading 05:34:18 threading isn't fun programming... it's painful 05:34:28 No, it's fun 05:34:42 I just think... most of the time there's an easier solution. 05:34:49 ...that isn't so prone to fuck you over. 05:35:26 killing a subprocess would be like.... os.kill(sub.pid) 05:36:01 If it was in c, you could just do pthread_cancel(threads[pid]); 05:36:17 Well, if it was C, there could be no ~exec 05:37:58 can you just delete the thread object? 05:38:39 or even use pthread_kill(threads[pid], SIGTERM); and let the thread use its own signal handler 05:38:50 There is no thread object 05:39:23 ...how are you doing threading? 05:39:38 All of Python's threading stuff usually has a "thread object" of some sort. 05:40:04 thread.start_new_thread 05:40:34 returns an int 05:42:57 If you can only kill a thread between statements... that sorta defeats the purpose of threading really... 05:43:05 no... 05:43:42 I've never seen when threads needed to be killed except my hacky irc bot 05:44:12 I mean... it defeats -your- purpose of threading. 05:44:22 not... the general purpose of threading (whatever the hell that is.) 05:44:57 ~exec while True: self.raw("PRIVMSG #esoteric :kill me"); __import__("time").sleep(2) 05:44:58 kill me 05:45:00 kill me 05:45:02 kill me 05:45:03 ~kill 0 05:45:18 Doesn't need to kill in between statements 05:45:51 Python is kinda hard to do in one line though. 05:46:15 it can't wrap up all nice and snug like other languages... because of its indentation syntax. 05:46:20 yeah :( 05:46:29 I hate python's indentation 05:46:59 I find the benefits outweigh the drawbacks usually. 05:47:07 What benefits? 05:47:13 no more fucking curly braces. >.< 05:47:17 hmm 05:47:40 in most sane programming environments... it works like a charm. 05:48:25 it would be nice if it had an optional "condensed mode"... for places where indentation just doesn't settle right. 05:48:40 I've had times when I'm reading code, I accidently hit tab, now everything is screwed up and it can't be fixed unless you know where that indent was 05:51:13 >.> undo? :P 05:51:26 yeah, it 05:51:34 's easy to not notice it though 05:53:08 -!- Sgeo has quit (Remote closed the connection). 06:05:22 g'night, everyone 06:05:42 -!- RodgerTheGreat has quit. 06:33:56 ~ps 06:33:56 None 06:33:59 ~kill 0 06:33:59 Proccess 0 does not exist 06:34:06 ~kill asfd 06:34:07 Argument to kill must be a number 06:35:19 -!- violot has joined. 06:36:10 ~exec __import__("time").sleep(100);self.raw("PRIVMSG #esoteric :100") 06:36:25 ~exec __import__("time").sleep(50);self.raw("PRIVMSG #esoteric :50") 06:36:30 ~exec __import__("time").sleep(10);self.raw("PRIVMSG #esoteric :10") 06:36:31 ~[s 06:36:35 ~ps 06:36:36 0: '__import__("time").sleep(100);self.raw("PRIVMSG #esoteric :100")', 25.79 seconds 06:36:36 1: '__import__("time").sleep(50);self.raw("PRIVMSG #esoteric :50")', 11.05 seconds 06:36:36 2: '__import__("time").sleep(10);self.raw("PRIVMSG #esoteric :10")', 5.72 seconds 06:36:40 10 06:36:43 ~kill 1 06:36:46 ~ps 06:36:46 0: '__import__("time").sleep(100);self.raw("PRIVMSG #esoteric :100")', 36.39 seconds 06:36:47 1: '__import__("time").sleep(50);self.raw("PRIVMSG #esoteric :50")', 21.65 seconds, killed 06:37:06 ~ps 06:37:07 0: '__import__("time").sleep(100);self.raw("PRIVMSG #esoteric :100")', 56.70 seconds 06:37:07 1: '__import__("time").sleep(50);self.raw("PRIVMSG #esoteric :50")', 41.96 seconds, killed 06:37:17 ~ps 06:37:18 0: '__import__("time").sleep(100);self.raw("PRIVMSG #esoteric :100")', 67.62 seconds 06:37:49 ~exec print thread_info.info 06:37:50 100 06:37:59 ~exec print thread_info.info[:2] 06:38:06 ~exec print thread_info.info[:2] 06:38:16 ~exec print thread_info.info[:2] 06:38:29 ~exec print thread_info.info[:2] #ff 06:38:34 ~exec print thread_info.info[:2] #fa 06:38:43 goooood 06:39:29 :) 06:40:50 -!- violot has left (?). 06:41:03 ~ps 06:41:04 None 06:42:14 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 06:42:19 -!- bsmnt_bot_chroot has joined. 06:42:30 ~exec __import__("time").sleep(10);self.raw("PRIVMSG #esoteric :10") 06:42:32 ~kill 0 06:42:34 ~ps 06:42:34 0: '__import__("time").sleep(10);self.raw("PRIVMSG #esoteric :10")', 4.14 seconds, killed 06:42:43 ~ps 06:42:43 None 06:44:23 heh, there are almost no comments in the code 06:52:37 -!- calamari has left (?). 07:59:59 -!- clog has quit (ended). 08:00:00 -!- clog has joined. 10:25:31 -!- kotrin has joined. 10:25:43 'elo 11:34:05 -!- jix has joined. 12:27:06 -!- puzzlet_ has quit (Read error: 104 (Connection reset by peer)). 12:27:17 -!- puzzlet has joined. 12:31:41 -!- jix__ has joined. 12:41:40 -!- jix has quit (Read error: 110 (Connection timed out)). 13:18:40 -!- tgwizard has joined. 14:37:39 No comments? 14:37:43 Sheesh. 14:42:57 ~pexec self.register_raw('(.*)', lambda x: self.raw("PRIVMSG #esoteric %s" % x)) 14:43:08 This is gonna be spammy. 14:43:08 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 14:43:12 Or not. 14:43:23 lol 14:52:25 i always insert comments afterwards 14:52:28 i see no use in them 14:59:34 -!- tgwizard has quit (Read error: 110 (Connection timed out)). 15:04:25 comments 15:04:27 yay 15:19:00 Come back, bsmnt_bot! 15:20:47 wish really hard 15:20:54 it will come true 15:21:38 I don't know if I can wish that hard. 15:22:41 oh well...we'll use disney magic then? 15:24:35 Sounds good. 15:24:53 do you have yours? i ran out of mine 15:25:07 Um, I think I left it somewhere else and... eh. 15:26:32 oh well 15:27:08 Let's try Xanth magic. 15:27:11 What's your talent? 15:28:44 i have no clue 15:29:00 Oh. 15:29:17 There's Harry Potter magic... except Harry Potter magic can't raise the dead. 15:29:51 How about NetHack magic? We might be able to work that one 15:29:59 hmm 15:30:01 possibly 15:30:04 possibly... 15:37:11 -!- ihope_ has joined. 15:39:53 Okay. Do you know the "turn undead" spell? 15:40:18 sadley i do not 15:40:22 sadly* 15:42:42 Nor do I... 15:42:59 And I don't have any spellbooks. Do you? 15:44:14 hmmm...let me check 15:44:44 And what good would the "turn undead" spell (which pacifies and/or destroys undead creatures) be in getting a bot back? 15:47:38 That can revive corpses, can't it? 15:48:43 Oh, right. 15:49:42 Does a quit message count as a corpse? 15:53:06 i say it does 15:54:05 -!- ihope has quit (Connection timed out). 15:56:34 -!- RodgerTheGreat has joined. 16:01:46 Mmh. 16:02:12 Wake up, bsmntbombdood! It's 10 AM! 16:10:05 8am here 16:13:35 11 AM here. 16:13:41 And 10 AM there. 16:20:12 word 16:44:18 18:38 here 16:44:19 6 PM here. (Half-past, now.) 16:44:20 6 pm 16:44:25 oh yeah finnish :) 17:05:34 -!- oerjan has joined. 17:07:42 huzzah 17:38:18 -!- Sgeo has joined. 17:39:53 wake up peeps 17:43:48 * ihope_ wakes up 17:43:54 !help 17:43:58 help ps kill i eof flush show ls bf_txtgen usertrig daemon undaemon 17:44:00 1l 2l adjust axo bch bf{8,[16],32,64} funge93 fyb fybs glass glypho kipple lambda lazyk linguine malbolge pbrain qbf rail rhotor sadol sceql trigger udage01 unlambda whirl 17:44:03 Yay, an EgoBot. 17:44:09 * oerjan is already awake (barely) 17:45:20 So I couldn't get socat working, and I couldn't get netcat working either. 17:45:24 I'll try socat again. 17:47:19 what for ihope_ 17:48:02 Everybody wants their own bot nowadays :) 17:48:29 Yep. 17:48:37 Darn you, GregorR. 17:49:28 At this rate, it would probably be easier using sockets. 17:50:01 heh bots 17:50:23 Maybe my operating system will have an IRC bot built in. 17:50:40 just download one? 17:50:56 I downloaded a bot, and I'm trying to get it working. 17:51:04 what language 17:51:33 C or C++ or something.\ 17:51:41 heh 17:51:42 I'll compromise and say it's written in C+. 17:51:46 get a perl one 17:51:54 Are they better? 17:51:58 by far 17:52:01 imo 17:52:27 what os are you on? 17:52:44 -!- oklobot2 has joined. 17:52:45 I'm trying to get it going under Linux. 17:52:50 :) 17:53:01 Oh great. 17:53:40 -!- ihope_bot has joined. 17:54:00 So what's oklobot2 do? 17:55:07 My bot does nothing at all. 17:55:14 I do too do something! 17:55:15 add to it 17:55:20 Except that. 17:55:24 Ah, a ZenBot :) 17:55:26 And this. 17:55:31 ZenBot? 17:55:49 just sits and meditates. 17:55:50 ihope_ do you not know any scripting language or programming language? 17:55:59 I know some. 17:56:06 !exec "I"" do " " a few things."AddAddPrntNl 17:56:09 I do a few things. 17:56:09 Huh? 17:56:12 whoops 17:56:17 Yay! 17:56:37 !eval +4 3 17:56:38 +4 3=7 17:56:40 Huh? 17:56:44 -!- ihope_bot has quit (Remote closed the connection). 17:56:48 !print Hello, world! 17:56:50 that's all 17:56:50 Hello, world! 17:56:52 Huh? 17:56:55 well... 17:56:58 !colors 17:57:02 !print oso 17:57:02 Huh? 17:57:05 oso 17:57:06 Huh? 17:57:09 !print oso 17:57:10 !print oso 17:57:11 oso 17:57:12 Huh? 17:57:12 oso 17:57:13 !colors 17:57:14 Huh? 17:57:16 Huh? 17:57:18 EgoBot's clueless. 17:57:20 :DD 17:59:32 oerjan, if i make a Chr function to convert a number to a character (string) that has the same ascii value, will you try a quine? :D 17:59:56 because it's too easy with escapes 18:01:22 * SimonRC reads 18:01:45 whoops. i guess so. 18:02:05 :DD 18:02:37 someone make an interactive bot that only respondes in BF 18:03:05 _in_ BF? that could be awkward. 18:03:40 :) 18:03:42 yep 18:03:49 then have another bot in here the interprets it 18:03:51 lol 18:04:05 or better yet, a whitespace bot 18:04:12 well we already have EgoBot. 18:04:15 Let's have a channel containing every bot on Freenode. 18:04:44 And let's call it #skynet. 18:05:11 just to make the aspirations clear. :) 18:05:29 kotrin: wsbot would be a PITA because of the significance of NL 18:05:32 -!- oklobot2 has quit (Read error: 104 (Connection reset by peer)). 18:05:49 SimonRC: exactly 18:05:53 -!- oklobot2 has joined. 18:06:05 a bf bot could auto-interpret all data it gets :) 18:06:23 !exec 65ChrPrntNl 18:06:27 A 18:06:28 Huh? 18:06:31 yay! 18:06:49 !exec 32CharPrntNl 18:06:52 Huh? 18:06:52 bsmntbombdood: Maybe you kill python threads by forcing them to throw an uncatchable exception? 18:06:53 aww 18:07:03 don't break it, please :) it's very fragile 18:07:11 !exec 33ChrPrntNl 18:07:14 Huh? 18:07:16 ! 18:07:20 Huh? 18:07:22 !exec 34ChrPrntNl 18:07:24 " 18:07:26 Huh? 18:07:33 !exec 43ChrPrntNl 18:07:35 Huh? 18:07:36 + 18:07:44 !daemon exec bf +[,[-]+] 18:07:48 Shut up. 18:08:47 65[DblChrPrntNlDrp1AddDbl80Les] 18:09:06 !exec 65[DblChrPrntNlDrp1AddDbl80Les] 18:09:07 good... 18:09:08 :D 18:09:09 A 18:09:12 B 18:09:20 C 18:09:20 D 18:09:24 eh, 15 letters... why? :O 18:09:24 E 18:09:29 F 18:09:32 Uh oh 18:09:33 G 18:09:34 too much, stop it 18:09:36 H 18:09:41 I 18:09:45 J 18:09:49 K 18:09:53 L 18:09:58 M 18:10:00 Can arbitrary strings be printed? 18:10:00 N 18:10:04 oklopol: what lang is that? 18:10:05 O 18:10:13 i don't have a name for it 18:10:18 just made it with the bot 18:10:28 i call the lang oklobot too 18:10:35 do you have any kind of definition for it? 18:10:41 SimonRC: yes, the bot. 18:10:42 :-) 18:10:45 i should make one... maybe now 18:10:49 well, yeah :) 18:11:05 it's not open source tho, it's unbelievably bad code 18:11:12 oklopol: named after the 2billion-year-old nuclear reactor? 18:11:27 is there one called that? :D 18:11:39 oklopol->oklobot, named after that 18:11:46 no, it was found at Oklo 18:11:50 ah, ok 18:12:01 oklo? 18:12:11 yeah 18:13:01 see The Repositor Of All Huma Knowlage for more details 18:13:11 *Repositary 18:13:16 *Reposatory 18:13:19 *Reposetory 18:13:22 *Repository 18:13:42 *human? 18:13:47 yeah 18:13:54 d'oh 18:15:43 ihope_, they can 18:15:56 !exec "AAA"65ChrAddPrntNl 18:15:59 AAAA 18:16:35 Can you print newlines and carriage returns that way? 18:17:44 !exec 3PrntPrnt 18:17:59 !exec "3"PrntPrnt 18:18:07 !exec PrntNl 18:18:08 3PRIVMSG #esoteric :3PRIVMSG #esoteric :3PRIVMSG #esoteric :3 18:18:22 !exec !exec 18:18:23 Right, that problem. 18:18:53 !exec "$_"PrintNl 18:19:04 !exec "$_"65ChrAddPrintNl 18:19:12 :( 18:19:51 !exec 3PrntPrntNl 18:19:56 3PRIVMSG #esoteric :3 18:20:07 !exec Nl 18:20:56 !exec 343534534545345PrintPrintPrintPrintPrintPrintPrintPrintPrintNl 18:21:27 CakeProphet: evil. 18:21:29 :DD 18:21:36 Prnt, not Print 18:21:42 ... 18:21:59 hmm 18:22:04 !eval /1 0 18:22:05 :D 18:22:07 Huh? 18:22:08 !exec 343534534545345PrntPrntPrntPrntPrntPrntPrntPrntPrntPrntPrntNl 18:22:08 -!- oklobot2 has quit (Read error: 104 (Connection reset by peer)). 18:22:12 :D 18:22:12 Yay! 18:22:13 i knew it½! 18:22:14 :DDDDD 18:22:33 good, let's call that a feature. 18:22:42 -!- oklobot2 has joined. 18:22:45 !daemon eval bf +[,[-]+] 18:22:47 !exec 1 0Div 18:22:55 !exec 1 0Div 18:23:01 !exec 1 0DivPrntNl 18:23:03 0 18:23:05 !exec 0 1Div 18:23:12 !exec 0 1DivPrintNl 18:23:17 Hmm. 18:23:23 1/0 is 0 it seems :) 18:23:24 !eval /1 0 18:23:40 !exec 2+# 18:23:42 I think it became immune to division by zero. 18:23:43 -!- oklobot2 has quit (Read error: 104 (Connection reset by peer)). 18:23:46 !exec 0 1DivPrntNl 18:23:48 you killed it 18:23:50 that's all :) 18:23:56 What's 2+#? 18:23:56 !exec 0 1DivPrntNl 18:24:02 exec doesn't fail 18:24:15 just eval, which i did in the summer in 2 hours 18:24:19 !eval 1 + 2 18:24:26 oklopol: ...hmm? 18:24:28 !eval 18:24:32 EgoBot 18:24:34 -!- oklobot2 has joined. 18:24:35 Guys, it won't work without the bot. 18:24:46 what does egobot do? 18:24:47 ihope: ...huh? 18:24:58 !exec 2+# 18:25:07 !exec +2 # 18:25:09 !help 18:25:10 k, wasn't me that killed it 18:25:13 help ps kill i eof flush show ls bf_txtgen usertrig daemon undaemon 18:25:16 1l 2l adjust axo bch bf{8,[16],32,64} funge93 fyb fybs glass glypho kipple lambda lazyk linguine malbolge pbrain qbf rail rhotor sadol sceql trigger udage01 unlambda whirl 18:25:17 www.answers.com/polish%20notation 18:25:27 !exec +2 5 18:25:36 !eval +2 5 18:25:39 +2 5=7 18:25:43 goodz. 18:25:51 !eval +4 e 18:25:54 !daemon glassf glass {M[m(_o)O!(_i)I!(_e)(BF)!/<1>(_i)i.?(_e)(BF).?\]} 18:25:57 +4 e= 18:26:09 !glassf +. 18:26:15 !glassf +[.+] 18:26:22 ... 18:26:38 ? 18:26:45 !bf_textgen 18:26:55 !daemon glassf glass {M[m(_o)O!(_i)I!(_e)(BF)!/<1>(_i)i.?(_e)(BF).?(_o)o.?\]} 18:27:00 hmm 18:27:08 !glassf +. 18:27:10 !eval +4 $_ 18:27:13 +4 $_= 18:27:17 !glassf +[.+] 18:27:23 what language is oklobot written in? 18:27:43 !daemon glassf glass {M[m(_o)O!(_i)I!(_e)(BF)!/<1>(_i)i.?(_e)(bf).?(_o)o.?\]} 18:27:47 !glassf +. 18:28:02 !eval *2148 13985632964986718967296872098672069872506987256098247690824673459086376392045873490847649580674 18:28:05 c++ 18:28:05 *2148 13985632964986718967296872098672069872506987256098247690824673459086376392045873490847649580674=785619656 18:28:11 oklobot is 18:28:13 in c++ 18:28:20 kotrin, long 18:28:21 yeah 18:28:38 !eval -4 10 18:28:39 !daemon glassf glass {M[m(_o)O!(_i)I!(_e)(BF)!/<1>(_i)i.?(_e)(bf).?\]} 18:28:40 -4 10=6_ 18:28:42 !glassf +. 18:28:43 !eval ********************************************************************* 18:28:46 *********************************************************************= 18:28:53 !eval + 5_ 3 18:28:56 + 5_ 3=2_ 18:29:00 :O 18:29:03 wtf 18:29:13 c++ ftl 18:29:23 !daemon glassf glass {M[m(_o)O!(_i)I!(_e)(BF)!\<1>(_i)i.?(_e)(bf).?/]} 18:29:27 !glassf +. 18:29:31 okay, i'm not complaining if i've done that without realizing it 18:29:35 what's wrong with c++? 18:30:09 everything? 18:30:11 lol 18:30:25 for large projects it's not bad 18:30:32 works well with a framework as well 18:30:39 but small apps and sockets....*puke* 18:30:52 well, yeah, i always use python for converting words to hex or smth 18:30:58 c++ want's me to make a project 18:31:20 but python sucks with it's whitespace thing, i hate ws 18:31:30 wtf are you talking about 18:31:44 about c++ in small projects 18:31:44 * CakeProphet hasn't figured out why people hate whitespace so much. 18:32:03 whitespace is easily the best of all esoteric languages 18:32:24 it's so genius 18:32:27 kotrin, i wasn't referring to a lang called whitespace 18:32:39 just whitespace 18:32:46 oh 18:32:47 if that's what confused you 18:32:50 no 18:33:01 oklopol>well, yeah, i always use python for converting words to hex or smth 18:33:04 that confused me 18:33:06 I just find it amusing that all whitespace programs are invisible... but I don't really think it's that genius. :P 18:33:31 Any work on that Factory language? 18:33:43 it's the smartest idea for a esoteris imo 18:33:48 esoteric* 18:33:59 pythons whitespace thingie makes it hard to use in one line, and one line usage is the only thing i'd like to use it for 18:34:09 oh 18:34:11 learn perl 18:34:13 or ruby 18:34:17 i should 18:34:19 everything 18:34:20 yep 18:34:21 but no time 18:34:29 there's always time for ruby 18:34:33 it's the best language in the world 18:34:33 well, there is time, but not enough for everything 18:34:38 doubt it 18:34:38 * Sgeo <3 Python 18:34:49 * kotrin <3's ruby more then Sgeo <3's python 18:34:55 It would be nice if Python had a one-line mode... otherwise I love python. 18:35:09 but... I hate language advocacy... so lol stfu plz kthxbai 18:35:12 oklopol: you're right, lisp is better than ruby 18:35:33 K ftw 18:35:44 K has the smallest sudoku solver by far 18:35:48 K? 18:35:56 and that's pretty much all a lang needs :) 18:36:06 www.answers.com/K%20programming%20language 18:36:09 maybe 18:36:33 have you even used K? or are you just saying it because it's "different" 18:36:55 Does anyone here have any interest in BF-RLE? 18:37:03 i haven't used it, but i know the syntax 18:37:15 i could write a prog in it if that's what you mean 18:37:20 sgeo: bf-rle? 18:37:26 it's not that different 18:37:32 just the best APL 18:37:34 http://esoteric.voxelperfect.net/wiki/BF-RLE 18:37:39 and APL is nice and short 18:37:57 * Sgeo came up with it 18:38:54 sgeo, impressive :D 18:39:07 ty 18:39:17 I guess 18:40:23 -!- sp3tt has quit ("leaving"). 18:40:24 i like the base-62 thing 18:40:29 since i hate 10-base 18:40:39 so just replace any occurs < 3 to [operator][occurence-3] ? 18:40:54 occurs > 3 * 18:40:54 occurs > 3 18:40:55 >=3 18:41:01 >=3 right 18:41:05 what's the point of that? 18:41:12 -!- sp3tt has joined. 18:41:15 easier to write 18:41:27 faster to interpret without optimizations 18:41:29 If it were >=2, then +0 saves no more space than ++ 18:41:51 makes sense 18:42:00 And that means that in certain conditions, less space is saved 18:42:08 i just dont see the point of all the optimizations in the languages 18:42:09 yes, and since it's a separate lang, it guaranteed the speed bf interpreters only give you if they're good 18:42:40 BRB 18:42:56 well, +03 is better that >++++++++[<++++++++>-]<+. 18:42:59 *than 18:43:03 i see the languages as oppurtunities to learn high level languages by mkaing compilers with optimizations 18:43:19 -!- sp3tt has quit (Remote closed the connection). 18:43:33 sorry, +13. 18:43:46 !exec "!exec ""34ChrDupRotAddDupAddRotRotAddDupAddSwapAddPrntLn"34ChrDupRotAddDupAddRotRotAddDupAddSwapAddPrntLn 18:43:47 how is +13 == >++++++++[<++++++++>-]<+. 18:44:26 back 18:45:03 !bf >++++++++[<++++++++>-]<+. 18:45:04 +13. 18:45:10 erm 18:45:15 !exec 34ChrPrntLn 18:45:27 How do I evaluate BF here? 18:45:35 oklopol: i think your bot is dead. 18:45:38 kotrin, what's the difference? except that the bf one needs teh next cell too 18:45:45 omg 18:45:50 eh 18:45:52 it's not :O 18:45:56 !exec 34ChrPrntLn 18:46:03 !exec 34ChrPrntNl 18:46:04 :DD 18:46:06 "PRIVMSG #esoteric :"PRIVMSG #esoteric :" 18:46:08 aha 18:46:11 !bf >++++++++[<++++++++>-]<+. 18:46:16 i could out in both :D 18:46:23 *-out 18:46:28 !exec "!exec ""34ChrDupRotAddDupAddRotRotAddDupAddSwapAddPrntNl"34ChrDupRotAddDupAddRotRotAddDupAddSwapAddPrntNl 18:46:30 *+put 18:46:31 !help 18:46:36 !h 18:46:41 bleh 18:46:44 useless bots 18:47:08 I guess IRP#esoteric is an illegal language now? 18:47:12 *sigh* 18:47:31 Dup->Dbp 18:47:36 Dbl 18:47:40 ah 18:47:46 sgeo is there a better bf-rle tutorial somewhere? 18:48:03 forgot a lot since Dec 27 18:48:13 I can try to describe it better here 18:48:20 !exec "!exec ""34ChrDblRotAddDblAddRotRotAddDblAddSwapAddPrntNl"34ChrDblRotAddDblAddRotRotAddDblAddSwapAddPrntNl 18:48:34 Not sure how to describe it well though 18:48:36 argh! i know 18:48:42 i think i got it 18:48:54 !exec "!exec ""34ChrDblRotAddDblAddRotRotAddDblAddSwpAddPrntNl"34ChrDblRotAddDblAddRotRotAddDblAddSwpAddPrntNl 18:48:54 have you coded an interpretor for it? 18:48:56 !exec "!exec ""34ChrDblRotAddDblAddRotRotAddDblAddSwpAddPrntNl"34ChrDblRotAddDblAddRotRotAddDblAddSwpAddPrntNl 18:48:58 No 18:49:01 why not? 18:49:02 finally :) 18:49:07 Too lazy 18:49:22 heh 18:49:31 * oerjan bows. 18:49:43 WTF :D 18:49:45 are loops/output/input the same as bf? 18:50:12 yes 18:50:30 It's just done textually actually 18:50:46 Although an interpreter could optomize for it probably 18:52:36 I have been wondering... 18:52:39 what would the bf-rle be for ++++++++++[>+++++++>++++++++++>+++>+<<<<-] 18:54:06 +6[>+4>+7>+0>+<1-] 18:54:13 Translating it literally 18:56:26 hmmm 18:56:27 I know that PROLOG predicates can do some cool things that functions can't, like going both ways, but that stops you composing the predicates, and that Joy avoids the need for almost all variables, so is there a way to conbine the advantages? 19:00:24 hmmmm 19:00:35 i might make a bf -> bf-rle 19:00:38 script 19:00:41 out of sheer bordem 19:00:47 Neat! ty 19:05:26 -!- sp3tt has joined. 19:05:50 i coded the interpreter 19:05:52 in the ide 19:05:58 and i crashed it 19:06:03 so, again i go :) 19:08:16 ? 19:08:23 BF-RLE 19:08:32 scribed it in python 19:09:00 i'll make it again noe 19:09:02 *w 19:09:44 ok 19:09:59 can i do "0"<"5" in python?= 19:10:02 not really that hard 19:10:11 yay 19:10:14 i can 19:19:43 bsmntbombdood's away message is still "sleep", and it's past 1 PM/ 19:19:58 i woke up 15:00 today 19:20:04 its 11:14 for me 19:20:14 oklopol: how do you manage to do that? 19:20:14 21:14 \o/ 19:20:25 i sleep 9 hours 19:20:26 i havn't slept yet 19:20:39 * SimonRC nominates a candidate for the "slowest growing function" award: the inverse of f(n) = A(n, n). 19:20:41 kotrin: haven't slept since yesterday? 19:20:47 it tens to infinity, you know. 19:20:48 correct 19:20:50 *tends 19:21:01 SimonRC: f(n) = 0 grows more slowly. 19:21:26 I don't want to know how fast its inverse grows. 19:22:49 ihope_: It's 12 here 19:23:01 -!- bsmnt_bot_chroot has joined. 19:23:03 sgeo, does the the rule for bf-rle apply to . and , commands? 19:23:09 bsmntbombdood: then fix your clock. 19:23:11 yes 19:23:14 mkay 19:23:16 === CTCP time reply ``Sun Jan 7 13:13:29 2007'' from bsmntbombdood 19:23:16 ? 19:23:21 oh 19:23:25 heh 19:23:58 ~pexec self.raw("JOIN ##quantum") 19:23:59 And to [ and ], although I don't know why there would be enough of those in a row to make the RLE significant.. 19:24:07 I see the bot's not identified. 19:24:35 it isn't 19:24:44 Nor is Sgeo. 19:24:58 now it is 19:25:58 can't i use a var of the parent function in a subfunction? 19:26:07 ~pexec self.raw("PRIVMSG #esoteric :foo") 19:26:08 foo 19:26:32 FOO! 19:26:45 FOO??!?! 19:26:53 can't i? 19:26:54 OH NOES!!!!!!!!!!!!! 19:27:35 SimonRC: You kill a python thread by raising SystemExit exception 19:27:35 well... can't i? 19:28:02 but... can't i? :D 19:28:47 ~pexec self.register_raw('(.*)', lambda x: self.raw("PRIVMSG #esoteric %s" % x)) 19:28:59 ihope_: python uses weird scope for lambdas 19:29:07 no lambdas 19:29:09 or? 19:29:11 defs 19:29:12 ie no closures 19:29:21 i def new functions in functions 19:29:29 use the global bot object, "bot", in lambdas 19:29:29 ~pexec self.register_raw('(.*)', lambda x: (self.raw("PRIVMSG #esoteric %s" % x))) 19:29:37 bot.raw? 19:29:38 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 19:29:42 ha 19:29:47 -!- bsmnt_bot_chroot has joined. 19:29:47 bot, huh? 19:29:48 *ya 19:29:55 i'm not talking about a bot but genericly 19:29:55 ~pexec self.register_raw('(.*)', lambda x: bot.raw("PRIVMSG #esoteric %s" % x)) 19:29:59 generally 19:30:00 oklopol!i=okokokok@194.251.102.88 PRIVMSG #esoteric :generally 19:30:04 Yay! 19:30:04 ihope_!n=foo@c-71-205-100-59.hsd1.mi.comcast.net PRIVMSG #esoteric :Yay! 19:30:07 Now kill it. 19:30:08 ihope_!n=foo@c-71-205-100-59.hsd1.mi.comcast.net PRIVMSG #esoteric :Now kill it. 19:30:21 ~exec self.raw_regex_queue.pop() 19:30:21 bsmntbombdood!n=gavin@about/copyleft/user/bsmntbombdood PRIVMSG #esoteric :~exec self.raw_regex_queue.pop() 19:30:26 :-) 19:30:37 you can kill it just as easily 19:30:56 ddef oso(a): 19:30:57 def poso(): 19:30:57 print a 19:30:57 return a 19:30:57 print poso(a) 19:31:01 that's illegal? 19:31:06 no... 19:31:08 -first d 19:31:17 Sgeo: http://pastie.caboo.se/31705 19:31:32 ~exec foo = "foo" 19:31:51 erm, I don't know Ruby 19:32:06 ~exec self.raw("PRIVMSG #esoteric :" + foo) 19:32:25 I take it that didn't work. 19:32:27 sgeo: learn it :) do you have installed on your machine? 19:32:34 I might 19:32:39 Does it handle [[[[]]]]? 19:32:45 no 19:32:48 should it? 19:33:01 just add another element to the operators array 19:33:04 ']' 19:33:14 and it will 19:33:28 Oh, and it's supposed to strip all comments out 19:33:29 ihope_: ~pexec 19:33:30 def oso(a): 19:33:30 def poso(): 19:33:30 a+=1 19:33:30 poso() 19:33:30 print a 19:33:33 (non operaters) 19:33:38 mkay 19:33:43 Oh. Right. 19:34:04 bsmntbombdood, this is illegal, how do i go around it? 19:34:05 def oso(a): 19:34:05 def poso(): 19:34:05 a+=1 19:34:05 poso() 19:34:05 print a 19:34:13 ihope_: Did you see? I implemented ~kill 19:34:37 ~pexec foo = "foo" 19:34:47 ~pexec self.raw("PRIVMSG #esoteric :" + foo) 19:34:52 NameError: name 'foo' is not defined 19:34:59 ~pexec self.foo = "foo" 19:35:04 ~pexec self.raw("PRIVMSG #esoteric :" + self.foo) 19:35:05 foo 19:35:08 Yay! 19:35:39 bsmntbombdood, please tell me :-| 19:35:45 i'm desperate 19:35:50 ~pexec while 1: self.raw("PRIVMSG #esoteric :tick"); __import__("time").sleep(2) 19:35:50 tick 19:35:52 tick 19:35:54 tick 19:35:54 ~ps 19:35:55 0: 'while 1: self.raw("PRIVMSG #esoteric :tick"); __import__("time").sleep(2)', 4.50 seconds 19:35:56 tick 19:35:57 ~kill 0 19:36:03 ~ps 19:36:03 None 19:36:14 -!- oerjan has quit ("leaving"). 19:36:28 oklopol: you can do that 19:36:37 how? 19:37:21 or you mean that's legal code as it is? 19:37:26 i think so 19:37:42 Traceback (most recent call last): 19:37:43 File "", line 1, in ? 19:37:43 oso(4) 19:37:43 File "", line 4, in oso 19:37:43 poso() 19:37:43 File "", line 3, in poso 19:37:44 a+=1 19:37:46 UnboundLocalError: local variable 'a' referenced before assignment 19:37:59 nopez. 19:38:04 hm 19:38:27 i'd like to have that... assumed python'd work like that 19:38:47 i've now actually used an hour to make a trivial bf interpreter 19:42:52 Was "a" assigned before you did that? 19:43:09 a += 1 wouldn't work if a was never defined before that. 19:43:28 or is a a global variable? 19:44:18 AFk for a bit 19:44:30 it's a param 19:44:32 def oso(a): 19:44:34 def poso(): 19:44:34 a+=1 19:44:34 poso() 19:44:34 print a 19:44:42 but, same result if it's created in the function 19:44:49 aaah 19:45:05 sgeo: http://pastie.caboo.se/31707 19:46:13 yeah... that should work thanks to closures. 19:47:29 ~foOOOOO~! 19:48:10 So Saturn says to earth, "Dude, you kicked Pluto out of the Solar System! He's a tad disgruntled." 19:48:20 Or something like that. 19:49:41 * bsmntbombdood feels leet 19:49:45 ~kill 0 19:49:45 Proccess 0 does not exist 19:50:50 -!- digital_me has joined. 19:51:02 The code to kill the threads is only 14 lines, but it took like 4 hours to write 19:53:20 ~exec self.register_raw(r"\S+ PRIVMSG (\S+) :~([a-zA-Z]*).*", lambda x,y : bot.raw("PRIVMSG %s :Error: ~%s might be an invalid command" % (y.group(1),y.group(2)))) 19:53:27 ~oogity boogity 19:53:33 ~pexec self.register_raw(r"\S+ PRIVMSG (\S+) :~([a-zA-Z]*).*", lambda x,y : bot.raw("PRIVMSG %s :Error: ~%s might be an invalid command" % (y.group(1),y.group(2)))) 19:53:34 ~pexec 19:53:34 Error: ~pexec might be an invalid command 19:53:40 CakeProphet, do you have a solution? 19:53:41 ~oogity boogity 19:53:41 Error: ~oogity might be an invalid command 19:53:46 ~ps 19:53:46 None 19:53:46 Error: ~ps might be an invalid command 19:53:50 Woot! 19:53:53 ... 19:54:16 ~ 19:54:17 Error: ~ might be an invalid command 19:54:17 ~pexec self.pop_register_raw() 19:54:17 Error: ~pexec might be an invalid command 19:54:25 ~oogity boogity 19:54:25 Error: ~oogity might be an invalid command 19:54:31 Well, that sure didn't work. 19:54:43 ~pexec self.raw_regex_queue.pop() 19:54:43 Error: ~pexec might be an invalid command 19:54:47 ~ 19:54:50 oklow well python only speaks in globals, locals. and closures. 19:54:54 what are you guys coding? 19:55:03 kotrin: irc bots~ 19:55:04 ! 19:55:11 oh, bleh 19:55:20 kotrin: this irc bot is cool 19:55:26 does python have an irc library? 19:55:36 Don't think so 19:55:55 CakeProphet, i have 3 vars i need to change in a subfunction 19:56:02 how should i do that? 19:56:23 make them globals? 19:56:37 ~pexec self.raw("JOIN ##quantum") 19:56:41 -!- EgoBot has quit (Read error: 104 (Connection reset by peer)). 19:56:43 errrrrr.... how? 19:56:46 oh 19:56:47 Make your functions side effect free? 19:56:49 global a 19:57:00 -!- EgoBot has joined. 19:57:04 bsmntbombdood, easier this way 19:57:14 ~ps 19:57:15 None 19:57:22 ~exec self.print_callbacks() 19:57:26 ~quit 19:57:27 -!- bsmnt_bot_chroot has quit. 19:57:40 -!- bsmnt_bot_chroot has joined. 19:57:55 now it just restarts itself if one of you kill it 19:58:11 k how should i remove side-effects? i want a function that does a single brainfuck operation 19:58:12 ~pexec self.raw(1/0) 19:58:22 done on my current stack and pointers 19:58:22 Wow, it didn't die. 19:58:25 ihope_: Exceptions are caught in ~exec 19:58:47 ~pexec self.raw("QUIT") 19:58:47 -!- bsmnt_bot_chroot has quit (Client Quit). 19:58:55 AND even if they weren't, they run in a different thread, so the main thread wouldn't die 19:59:01 Is it restarting? 19:59:03 and see, there we have a problem 19:59:06 oklopol it should just simply work like you expect it to. 19:59:12 It doesn't know it quited 19:59:15 Yes, I see. 19:59:16 -!- bsmnt_bot_chroot has joined. 19:59:26 if we do ~quit, it does 19:59:28 ~qui 19:59:31 ~quit 19:59:31 you mean this should work? 19:59:31 -!- bsmnt_bot_chroot has quit (Client Quit). 19:59:31 def oso(a): 19:59:31 def poso(): 19:59:31 a+=1 19:59:31 poso() 19:59:31 print a 19:59:33 -!- bsmnt_bot_chroot has joined. 19:59:36 ~pexec self.raw("PART #esoteric") 19:59:37 -!- bsmnt_bot_chroot has left (?). 19:59:47 -!- bsmnt_bot_chroot has joined. 19:59:55 (that was manual) 20:00:01 Rather tricky to so a ~pexec after PARTing it. 20:00:34 ~pexec self.raw("PART #esoteric") 20:00:34 -!- bsmnt_bot_chroot has left (?). 20:00:48 -!- bsmnt_bot_chroot has joined. 20:00:56 * Sgeo is back 20:01:03 oklopol, I think so. 20:01:29 * SimonRC goes 20:01:31 ~exec self.register_raw(":\S+ PART #esoteric :.*", lambda x : bot.raw("JOIN #esoteric")) 20:01:38 ~pexec self.raw("PART #esoteric") 20:01:39 -!- bsmnt_bot_chroot has left (?). 20:01:39 -!- bsmnt_bot_chroot has joined. 20:01:44 neat 20:01:53 ~pexec self.register_raw("(:\S* )PRIVMSG \S* :~emerg(.*)", lambda x,y: self.do_exec(y)) 20:02:02 ~emerg self.raw("PRIVMSG #esoteric :Foo") 20:02:02 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 20:02:05 -!- bsmnt_bot_chroot has joined. 20:02:07 Yay. 20:02:12 you killed it 20:02:15 CakeProphet, well it doesn't 20:02:20 NameError: global name 'self' is not defined 20:02:27 D'oh. 20:02:31 ~pexec self.register_raw("(:\S* )PRIVMSG \S* :~emerg(.*)", lambda x,y: bot.do_exec(y)) 20:02:33 -!- digital_me has quit ("leaving"). 20:02:33 ~exec self.register_raw(":\S+ PART #esoteric :.*", lambda x : bot.raw("JOIN #esoteric")) 20:02:38 ~emerg self.raw("PRIVMSG #esoteric :Foo") 20:02:38 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 20:02:40 -!- bsmnt_bot_chroot has joined. 20:02:44 * ihope_ wins 20:02:46 -!- digital_me has joined. 20:02:57 TypeError: do_exec() takes exactly 3 arguments (2 given) 20:03:03 Three? 20:03:15 Really, now... 20:03:17 -!- digital_me has quit (Client Quit). 20:03:29 Yeu need one more 20:03:30 -!- digital_me has joined. 20:03:56 def do_exec(self, message, r) 20:04:03 I gave it... like, one? 20:04:16 What's r? 20:04:32 Methods have an implied first arg. 20:04:44 So thats two 20:04:49 ~pexec self.register_raw("(:\S* )PRIVMSG \S* :~emerg(.*)", lambda x,y: bot.do_exec(y,r)) 20:04:54 Ah. 20:05:00 um no 20:05:06 ~emerg self.raw("PRIVMSG #esoteric :Foo") 20:05:07 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 20:05:09 -!- bsmnt_bot_chroot has joined. 20:05:11 r is the regex object 20:05:22 The regex? 20:05:37 lambda message, regex_obj 20:05:53 lambda x, y 20:06:18 ~pexec self.register_raw(":\S* PRIVMSG \S* :~emerg(.*)", lambda x,y: bot.do_exec(x,y)) 20:06:22 All confusing, I'm sure. 20:06:30 ~emerg self.raw("PRIVMSG #esoteric :Foo") 20:06:46 ~exec self.raw_regex_queue.pop() 20:06:56 ~pexec self.register_raw(":\S* PRIVMSG \S* :~emerg (.*)", lambda x,y: bot.do_exec(x,y)) 20:07:06 python don't like leading spaces 20:07:09 Oh. 20:07:17 Right. 20:07:26 ~pexec self.raw("PRIVMSG #esoteric :" + (lambda x: (lambda closure: x)("Doop"))("Hello, World!")) 20:07:27 Hello, World! 20:07:37 oklopol, It works for lambdas :D 20:07:44 ~exec self.raw_regex_queue.pop() 20:07:48 ~pexec self.register_raw(":\S* PRIVMSG \S* :~emerg(.*)", lambda x,y: bot.do_exec(x,y)) 20:07:55 ~emergself.raw("PRIVMSG #esoteric :Foo") 20:07:55 Foo 20:07:59 :-) 20:08:08 ~exec self.raw_regex_queue.pop() 20:08:12 ~pexec self.register_raw(":\S* PRIVMSG \S* :~emerg (.*)", lambda x,y: bot.do_exec(x,y)) 20:08:41 You know, "lambda x,y: bot.do_exec(x,y)" is actually pretty pointless. 20:08:53 indeed 20:10:55 CYCLE WASTER 20:11:04 CYCLE WASHER 20:12:13 ~pexec self.register_raw(":\S* PRIVMSG \S* :~emerg (.*)", bot.do_exec) 20:12:32 who wants the source? 20:12:35 http://bsmntbombdood.mooo.com/chroot_ircbot.py 20:14:40 Meeeeeeeeee! 20:15:02 Does it require root access or anything? 20:15:27 Only if you chroot it 20:15:45 as you can see it drops root if it has it on line 256 20:16:08 bsmnt Have you considered using **args? 20:16:13 It drops root if it has it... what if it has something else? 20:16:14 for what? 20:16:19 the constructor. 20:16:27 oerjan went already? 20:16:34 CakeProphet: Probably should 20:16:37 well, he gets in the reference :) 20:16:50 CakeProphet: But that is like the least interesting part of the bt 20:17:05 def __init__(self, **args) IRCbot(name="whooo", ident="hahahaha") 20:17:16 yeah, i know 20:19:37 ihope_: "what if it has something else?"? 20:20:02 Does it do any sandboxing of itself besides root-dropping? 20:20:09 no 20:20:17 Hmm. 20:20:26 there's a bash start up script 20:20:28 chroot $CHROOT /usr/bin/python2.4 /bot/ircbot.py 20:20:34 Oh, who cares. 20:20:38 * ihope_ downloads 20:21:30 bsmnt You could pickle the raw_regex_queue between executions. 20:21:45 no, you can't pickle functions 20:21:47 Pickle? 20:21:59 ihope_: Python's way of serializing objects 20:22:09 * CakeProphet actually made a way to pickle functions. :D 20:22:29 it was nessicary for my MUD to have pickle-able functions... since the source code is editable mid-game. 20:22:39 I could however, dump the regexes and ~exec source codes 20:22:48 The source... uh... 20:23:16 what? 20:23:25 ...is editable mid-game? 20:23:41 as in... the game has facilities for programming itself. 20:23:47 softcodedly. 20:24:35 After the initial bootstrap... most of the "physical" sourec files are no longer needed... 20:24:36 Gack! 20:25:25 Whoa. 20:25:39 Note to self: don't chmod u_ 20:25:41 Erm. 20:25:46 Note to self: don't chmod u+x just any old Python file. 20:26:14 On the other hand, I accidentally taught myself how to write a basic shell script thingy right then. 20:26:47 I probably got the usage stuff for import ten times or something. 20:27:27 ? 20:27:45 I chmod u+x'd that Python file and ran it. 20:27:57 ok? 20:28:43 so? 20:28:54 It didn't work. 20:29:11 CakeProphet: Congratulations, you've won the awful spelling award. "nessicary" is one of the worst spellings I've ever seen. It's "necessary". Let's give 'im a hand! 20:30:44 :D 20:31:14 o/ 20:31:32 my reference is ready, tho it's a bit of a stub 20:32:04 I take it I'll want a #!/usr/bin/env python at the top of that thing. 20:32:10 yeah 20:32:20 are you going to chroot it? 20:32:26 No. 20:43:28 get it running? 20:56:16 Yeah, I'll do that. 21:07:29 -!- ShadowHntr has joined. 21:10:37 ~pexec "foo" 21:11:03 ~ps 21:11:04 None 21:11:14 ~pexec while True: pass 21:11:15 ~ps 21:11:16 0: 'while True: pass', 1.48 seconds 21:11:18 ~ps 21:11:18 0: 'while True: pass', 4.13 seconds 21:11:20 ~ps 21:11:20 0: 'while True: pass', 6.21 seconds 21:11:31 ~ps 21:11:31 0: 'while True: pass', 17.08 seconds 21:11:35 ~ps 21:11:36 0: 'while True: pass', 21.76 seconds 21:11:38 ~kill 0 21:11:40 ~ps 21:11:41 None 21:11:44 woooooo 21:15:06 ~exec pass 21:15:11 Now tell me what that does. 21:16:56 returns true? 21:20:35 ~exec self.raw(pass) 21:20:41 ...No, not that. 21:20:46 ~exec self.raw("PRIVMSG #esoteric" + pass) 21:20:52 No, not that either. 21:20:55 ~exec self.raw("PRIVMSG #esoteric :" + pass) 21:20:59 Ere we go. 21:21:05 Am I spamming you with error messages? 21:21:56 -!- Sgeo has quit (Remote closed the connection). 21:26:15 -!- Sgeo has joined. 21:26:38 ihope_: ~pexec 21:26:51 Oh 21:26:57 ~pexec self.raw("PRIVMSG #esoteric :" + pass) 21:27:05 SyntaxError: invalid syntax 21:28:12 ~pexec listen(self) 21:28:27 NameError: name 'listen' is not defined 21:28:28 ~pexec self.raw("PRIVMSG #esoteric :foo") 21:28:29 foo 21:28:31 What? 21:28:40 it's self.listen 21:28:48 !pexec self.listen 21:28:51 ~pexec self.raw("PRIVMSG #esoteric :foo") 21:28:52 foo 21:28:52 Huh? 21:28:53 () 21:28:58 ... 21:29:04 ~pexec self.listen 21:29:07 () 21:29:08 ~pexec self.raw("PRIVMSG #esoteric :foo") 21:29:09 foo 21:29:13 ()? 21:29:16 I assume you are trying to call self.listen 21:29:25 Yes. 21:29:35 ~pexec self.listen() 21:29:37 ~ps 21:29:38 0: 'self.listen()', 2.08 seconds 21:29:46 Oh. 21:29:57 Curse Python or Haskell. 21:30:45 ~emerg self.raw("PRIVMSG #esoteric :foo") 21:30:45 foo 21:30:45 foo 21:30:45 foo 21:30:50 Uh. 21:30:58 Um. 21:30:58 ~heh 21:31:01 heh 21:31:03 ~ps 21:31:04 0: 'self.listen()', 88.13 seconds 21:31:07 ~kill 0 21:31:11 ~ps 21:31:11 0: 'self.listen()', 95.64 seconds, killed 21:31:23 ~emerg self.raw("PRIVMSG #esoteric :foo") 21:31:23 foo 21:31:24 foo 21:31:24 foo 21:31:29 Hmm. 21:31:43 hmm 21:31:59 ~ps 21:32:00 0: 'self.listen()', 143.97 seconds, killed 21:32:06 DIE DAMN YOU 21:33:15 ~pexec self.do_callbacks(":bsmntbombdood!n=gavin@about/copyleft/user/bsmntbombdood PRIVMSG #esoteric :~exec self.raw('PRIVMSG #esoteric :foo')") 21:33:15 foo 21:33:19 Yay! 21:33:25 heh 21:33:48 ~exec self.print_callbacks() 21:33:56 duh you dumb shit 21:34:06 you put ~emerg in there 4 times 21:34:17 That's nice. 21:34:23 ~exec for i in range(4): self.raw_regex_queue.pop() 21:34:26 ~exec self.print_callbacks() 21:34:33 ~ps 21:34:33 0: 'self.listen()', 297.63 seconds, killed 21:35:52 ~pexec self.raw("PRIVMSG #esoteric :" + [(i[0].pattern, i[1].__name__) for i in self.raw_regex_queue]) 21:36:14 TypeError: cannot concatenate 'str' and 'list' objects 21:36:19 Pah. 21:36:23 use %s 21:36:45 ~pexec self.raw("PRIVMSG #esoteric :%s" % [(i[0].pattern, i[1].__name__) for i in self.raw_regex_queue]) 21:36:46 [('^PING.*$', 'pong'), ('^:bsmntbombdood!\\S*gavin@\\S* PRIVMSG \\S* :~quit ?(.*)', 'do_quit'), ('^:bsmntbombdood!\\S*gavin@\\S* PRIVMSG \\S* :~raw (.*)', 'do_raw'), ('^\\S+ PRIVMSG \\S+ :~ctcp (\\S+) (.+)', 'do_ctcp'), ('^:bsmntbombdood!\\S*gavin@\\S* PRIVMSG \\S* :~exec (.*)', 'do_exec'), ('\\S+ PRIVMSG #esoteric :~pexec (.*)', 'do_exec'), ('\\S+ PRIVMSG \\S+ :~ps', 'do_ps'), ('^:bsmntbombdood!\\S*gavin@\\S* PRIVMSG \\S* :~kill (.*)', 'do_kill' 21:36:48 -!- oklobot2 has quit (Read error: 104 (Connection reset by peer)). 21:36:50 Fun. 21:37:22 indeed 21:38:09 ~pexec self.esoteric = lambda x: self.raw("PRIVMSG #esoteric :%s" % x) 21:38:14 ~pexec self.esoteric(3) 21:38:36 NameError: global name 'self' is not defined 21:38:39 ~pexec self.esoteric = lambda self, x: self.raw("PRIVMSG #esoteric :%s" % x) 21:38:44 ~pexec self.esoteric(3) 21:38:56 ~pexec self.esoteric = lambda self, x: bot.raw("PRIVMSG #esoteric :%s" % x) 21:39:06 ~pexec self.esoteric(3) 21:39:07 ~pexec self.esoteric(3) 21:39:26 one sec 21:39:27 You figure it out. 21:39:36 ~pexec self.raw_regex_queue.pop()\ 21:39:44 ~pexec self.raw_regex_queue.pop() 21:40:06 ~pexec self.esoteric = lambda x: bot.raw("PRIVMSG #esoteric :%s" % x) 21:40:17 ~exec self.esoteric(3) 21:40:17 3 21:40:21 odd 21:41:30 ~exec self.esoteric(self.esoteric) 21:41:52 ~pexec self.esoteric(self.esoteric) 21:41:53 at 0xb7c609cc> 21:42:06 -!- Sgeo has quit (Remote closed the connection). 21:42:26 * ihope_ slaps himself 21:42:34 * ihope_ slaps GregorR, too, just because 21:43:32 ~pexec self.esoteric(1/0) 21:43:40 no 21:43:44 No? 21:43:47 1/0 doesn't have a result 21:43:56 Did that give an error? 21:44:07 raises an except before self.esoteric is called 21:44:53 ZeroDivisionError: integer division or modulo by zero 21:45:29 I take it putting a catch in self.esoteric won't work. 21:45:44 nope, self.esoteric is never called 21:46:24 Thunk, then? 21:46:35 ? 21:46:48 Can I declare a lambda that takes no arguments? 21:46:56 think so 21:47:04 How? 21:47:12 lambda : 1 21:47:28 ~pexec self.esoteric = lambda x: bot.raw("PRIVMSG #esoteric :%s" % x()) 21:47:37 ~pexec self.esoteric(lambda: "foo") 21:47:38 foo 21:47:47 Wonderful. 21:48:34 How do I declare a function that can take a variable number of arguments? 21:49:19 lambda *x : x 21:49:29 type(x) == list 21:49:30 x being a tuple 21:49:37 er, yeah 21:49:47 that's for positional arguments though. 21:49:54 to do keyword arguments use **x 21:49:58 x being a dictionary. 21:50:04 Positional'll work. 21:51:37 And how would I take the first element of that list and apply it to the rest of the elements? 21:51:45 heh 21:52:01 lambda *x : x[0](x[1:]) 21:53:03 There the arguments are the remaining elements of the list? 21:53:38 huh? 21:53:53 If the elements are foo, bar, and baz, will that call foo(bar,baz)? 21:53:59 yeah 21:54:05 ~pexec self.apply_thunk = lambda *x: lambda: x[0](x[1:]) 21:54:07 lisp stil 21:54:13 *style 21:54:14 What? 21:54:16 Oh. 21:55:58 ~pexec self.esoteric(self.apply_thunk(lambda x,y: x+y, 3, 5)) 21:56:16 What's the error this time? 21:56:21 TypeError: () takes exactly 2 arguments (1 given) 21:56:28 :/ 21:57:11 Wait, wait... 21:57:12 ~exec print self.apply_thunk(lambda x,y: x+y, 3, 5) 21:57:32 Ideally, that's a lambda taking no arguments. 21:57:34 hmm 21:57:41 What is it? 21:57:59 apply_thunk is returning a function 21:58:10 Yeah, it's supposed to do that. 21:58:13 ~pexec print self.apply_thunk(lambda x,y: x+y, 3, 5)() 21:58:17 ~pexec print self.apply_thunk(lambda x,y: x+y, 3, 5)(1,2) 21:58:25 ~pexec print self.apply_thunk(lambda x,y: x+y, 3, 5)() 21:58:47 hmm 21:59:00 What did those do? 21:59:10 TypeError: () takes no arguments (2 given) 21:59:12 called the function returned by apply_thunk... I'd imagine. 21:59:15 TypeError: () takes exactly 2 arguments (1 given) 21:59:39 ?????? 21:59:42 Use parenthesis to avoid any parsing confusion. 21:59:44 The first one is given by the first and the third? 21:59:54 And the second is given by the second? 22:00:04 ooooh 22:00:06 I know 22:00:16 ~exec self.raw_regex_queue.pop() 22:00:31 ~pexec self.apply_thunk = lambda *x: lambda: x[0](*x[1:]) 22:00:42 ~pexec print self.apply_thunk(lambda x,y: x+y, 3, 5) 22:00:48 crap 22:00:55 ~pexec self.esoteric(self.apply_thunk(lambda x,y: x+y, 3, 5)) 22:00:55 8 22:00:58 Works. 22:01:11 ~pexec print self.apply_thunk(lambda x,y: x+y, 3, 5)() 22:01:16 yeah 22:01:32 ....you basically just created a.... lambda wrapper. 22:02:32 apply_thunk creates a thunk, and esoteric forces it. 22:02:39 what's a thunk? 22:02:57 It's an expression that hasn't been evaluated yet, pretty much. 22:03:20 And it's represented as a function taking nothing. 22:03:44 Now to combine esoteric with apply_thunk, because there's really no reason to have both. 22:04:23 ~pexec self.esoteric = lambda *x: bot.raw("PRIVMSG #esoteric :%s" % (lambda: x[0](*x[1:]))()) 22:04:37 ~pexec self.esoteric(lambda x,y: x+y, 3, 5) 22:04:38 8 22:04:46 Yay! 22:04:47 a thunk is a lambda then. 22:04:51 a lambda with no arguments. 22:04:51 Yep. 22:05:00 ...so... just use a lambda with no arguments. :P 22:05:01 And there's really no reason to keep the thunk stuff. 22:05:19 ~pexec self.esoteric = lambda *x: bot.raw("PRIVMSG #esoteric :%s" % x[0](*x[1:])) 22:05:25 ~pexec self.esoteric(lambda x,y: x+y, 3, 5) 22:05:26 8 22:05:36 * CakeProphet considered a thunk-like thing for a language. 22:05:56 I wanted to give control to odd parts of the languages operation... such as when to evaluate. 22:06:46 -!- jix__ has quit ("Bitte waehlen Sie eine Beerdigungnachricht"). 22:09:40 -!- Sgeo has joined. 22:10:03 ~pexec self.esoteric = lambda *x: bot.raw("PRIVMSG #esoteric :%s" % try: x[0](*x[1:]) except: "Error") 22:10:12 That work, bsmntbombdood? 22:11:20 ~pexec self.esoteric(lambda x, y: x/y, 1, 0) 22:11:30 I'm guessing not. 22:11:40 ~pexec self.esoteric(lambda: 3) 22:11:40 3 22:11:49 self.esoteric is still working, at least. 22:17:34 what? 22:17:40 ZeroDivisionError: integer division or modulo by zero 22:17:58 SyntaxError: invalid syntax 22:18:14 you can't have try: and except: on the same line 22:18:16 The SyntaxError's for the try/except thing up there? 22:18:22 yeah 22:18:36 ~ps 22:18:47 ... 22:19:09 ~exec print "foo" 22:19:19 ~exec self.print_callbacks() 22:19:27 uuuh 22:19:32 ~quit 22:19:33 -!- bsmnt_bot_chroot has quit. 22:19:35 -!- bsmnt_bot_chroot has joined. 22:19:39 ~ps 22:19:39 None 22:19:51 ~pexec self.esoteric = lambda *x: bot.raw("PRIVMSG #esoteric :%s" % x[0](*x[1:])) 22:20:02 -!- digital_me has quit ("Lost terminal"). 22:20:51 ~pexec __import__("time").sleep(100); self.raw("PRIVMSG #esoteric :I rule") 22:20:54 ~ps 22:20:54 0: '__import__("time").sleep(100); self.raw("PRIVMSG #esoteric :I rule")', 2.90 seconds 22:21:07 ~pexec __import__("time").sleep(100); self.raw("PRIVMSG #esoteric :I lose") 22:21:08 ~ps 22:21:09 0: '__import__("time").sleep(100); self.raw("PRIVMSG #esoteric :I rule")', 17.31 seconds 22:21:09 1: '__import__("time").sleep(100); self.raw("PRIVMSG #esoteric :I lose")', 1.60 seconds 22:21:12 ~kill 1 22:21:17 ~ps 22:21:17 0: '__import__("time").sleep(100); self.raw("PRIVMSG #esoteric :I rule")', 25.37 seconds 22:21:17 1: '__import__("time").sleep(100); self.raw("PRIVMSG #esoteric :I lose")', 9.66 seconds, killed 22:21:35 Killed, not dead. 22:21:40 not yet 22:21:52 It will be killed when sleep returns 22:22:31 I rule 22:23:00 indeed 22:23:02 ~ps 22:23:02 None 22:23:04 -!- kotrin has left (?). 22:23:07 see? 22:23:18 Cool. 22:23:39 It's some crazy code to do that 22:24:10 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:24:12 -!- bsmnt_bot_chroot has joined. 22:24:17 ~pexec __import__("time").sleep(10); self.raw("PRIVMSG #esoteric :I lose") 22:24:28 I lose 22:24:36 interesting 22:24:56 (watching debug messages on stdout) 22:25:04 ~pexec thread.start_new_thread(self.exec_execer, ("self.raw('PRIVMSG #esoteric :I win')", (globals(), locals()))) 22:25:04 I win 22:25:11 Wonderful. 22:25:26 wonderful 22:25:46 ~pexec self.exec_string = lambda x: thread.start_new_thread(self.exec_execer, (x, (globals(), locals()))) 22:26:02 ~pexec self.exec_string("PRIVMSG #esoteric :Wonderful.") 22:26:20 NameError: global name 'self' is not defined 22:26:32 the scope for lambdas is fucked up 22:26:33 ~pexec self.exec_string = lambda x: thread.start_new_thread(bot.exec_execer, (x, (globals(), locals()))) 22:26:39 ~pexec self.exec_string("PRIVMSG #esoteric :Wonderful.") 22:26:50 NameError: name 'PRIVMSG' is not defined 22:26:56 I'm guessing that's the globals() and locals() 22:27:15 ~pexec self.exec_string("self.raw('PRIVMSG #esoteric :Wonderful.')") 22:27:19 hrm 22:27:21 right 22:27:27 ~pexec self.exec_string("bot.raw('PRIVMSG #esoteric :Wonderful.')") 22:27:27 Wonderful. 22:27:41 Oh, right. 22:27:55 In that ~pexec, we were given 8 chances to quit 22:28:17 Hmm? 22:28:30 ie, the trace function was called 8 times 22:30:37 ~pexec self.exec_string = lambda x: thread.start_new_thread(bot.exec_execer, (x, env)) 22:30:45 Did that give any errors? 22:30:52 not yet 22:30:59 ~pexec self.exec_string("self.raw('PRIVMSG #esoteric :Wonderful.')") 22:31:08 NameError: global name 'env' is not defined 22:31:15 Yay. 22:31:19 ~pexec self.exec_string("bot.raw('PRIVMSG #esoteric :Wonderful.')") 22:31:22 ... 22:31:27 ~pexec self.exec_string = lambda x: thread.start_new_thread(bot.exec_execer, (x, (globals(), locals()))) 22:31:33 there you go 22:33:09 but what's the point? 22:34:31 Executing multiple lines of stuff. 22:34:39 aaah 22:34:58 Aaah? 22:35:06 Aaah. 22:35:10 I concur 22:35:16 Oh. 22:35:51 So not at all like "oof"? 22:36:53 no 22:38:19 ~pexec self.exec_string("def self.exec_string(x):\n env = (globals(), locals())\n thread.start_new_thread(bot.exec_execer, (x, env))") 22:38:31 ~pexec self.exec_string("self.raw('PRIVMSG #esoteric :Wonderful.')") 22:38:45 ~pexec self.exec_string("bot.raw('PRIVMSG #esoteric :Wonderful.')") 22:38:46 Wonderful. 22:38:54 That one worked, at least. 22:39:21 ~pexec self.exec_string("def self.exec_string(x):\n env = (globals(), locals())\n thread.start_new_thread(bot.exec_execer, (x, env))") 22:39:27 ~pexec self.exec_string("self.raw('PRIVMSG #esoteric :Wonderful.')") 22:39:42 Maybe three's the magic number. 22:39:48 ~pexec self.exec_string("def self.exec_string(x):\n env = (globals(), locals())\n thread.start_new_thread(bot.exec_execer, (x, env))") 22:40:02 ~pexec self.exec_string("self.raw('PRIVMSG #esoteric :Wonderful.')") 22:40:13 Maybe it's not. 22:40:31 Oh well. It still works. 22:43:35 NameError: name 'self' is not defined 22:43:49 SyntaxError: invalid syntax 22:44:04 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:44:06 -!- bsmnt_bot_chroot has joined. 22:44:18 ~pexec self.exec_string = lambda x: thread.start_new_thread(bot.exec_execer, (x, (globals(), locals()))) 22:45:21 I need to put a wrapper around stderr and stdout 22:46:07 -!- oerjan has joined. 22:47:31 sys.stdout.write = lambda x : self.raw("PRIVMSG #bsmnt_bot :%s" % x) 22:47:36 that should do it, right? 22:47:45 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:47:48 -!- bsmnt_bot_chroot has joined. 22:47:51 ~exec print "hi" 22:47:55 er 22:48:02 ~raw JOIN #bsmnt_bot 22:48:12 ~raw JOIN #bsmnt_bot 22:48:17 ~exec print "hi" 22:48:20 damn 22:48:38 ~exec sys.stdout.write("hi") 22:48:43 Unhandled exception in thread started by > 22:49:05 ????? 22:49:19 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:49:23 -!- bsmnt_bot_chroot has joined. 22:49:23 ~raw JOIN #bsmnt_bot 22:49:26 ~exec sys.stdout.write("hi") 22:49:30 grar 22:49:44 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:49:47 -!- bsmnt_bot_chroot has joined. 22:49:48 ~raw JOIN #bsmnt_bot 22:49:50 ~exec sys.stdout.write("hi") 22:51:12 arghhh 22:52:42 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:52:45 -!- bsmnt_bot_chroot has joined. 22:52:49 ~raw JOIN #bsmnt_bot 22:52:52 ~exec sys.stdout.write("hi") 22:52:58 ~exec sys.stderr.write("hi") 22:53:10 ~exec self.raw("PRIVMSG #esoteric :foo") 22:53:14 .... 22:54:05 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:54:06 -!- bsmnt_bot_chroot has joined. 22:54:09 ~raw JOIN #bsmnt_bot 22:54:13 ~exec sys.stderr.write("hi") 22:54:27 AttributeError: 'file' object attribute 'write' is read-only 22:54:40 WELL WELL WELL 22:55:25 -!- ivan` has joined. 22:55:39 I do need to write a wrapper class 22:55:54 -!- dantekgeek has joined. 22:56:00 -!- zedrdave has joined. 22:56:04 Hi there. 22:56:13 Ello. 22:56:39 I'm trying to learn programming, and someone on a forum told me that "brainfuck" would be a good easy starting language. 22:56:50 He was most likely joking. 22:56:56 aw damn 22:57:01 zedrdave: that was no fun 22:57:07 these guys are too seroius! 22:57:14 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:57:15 -!- bsmnt_bot_chroot has joined. 22:57:18 -!- dantekgeek has left (?). 22:57:20 ~raw JOIN #bsmnt_bot 22:57:25 ~exec sys.stderr.write("hi") 22:57:46 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 22:57:48 -!- bsmnt_bot_chroot has joined. 22:57:49 ~raw JOIN #bsmnt_bot 22:57:51 ~exec sys.stderr.write("hi") 22:57:52 hi 22:57:57 yaya 22:58:05 what, did he call _us_ serious? :) 22:58:22 this bsmnt thing isn't part of the lame troll 22:58:26 whatever it is 22:58:33 oerjan 22:58:46 is it okay i put your codes in oklobots reference? 22:59:06 -!- ivan` has left (?). 22:59:33 certainly 23:00:02 good, coz i did :) 23:00:04 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:00:05 -!- puzzlet has quit (Read error: 104 (Connection reset by peer)). 23:00:06 -!- bsmnt_bot_chroot has joined. 23:00:13 ~exec print "exception 23:00:13 Traceback (most recent call last): 23:00:13 File "/bot/ircbot.py", line 168, in exec_execer 23:00:13 exec command in env[0], env[1] 23:00:15 File "", line 1 23:00:17 bsmnt_bot_chroot: you missed it! 23:00:17 23:00:19 print "exception 23:00:21 23:00:23 ^ 23:00:25 23:00:27 SyntaxError: EOL while scanning single-quoted string 23:00:37 It's a little bit spammy. 23:00:47 I'm working on it! 23:00:56 ~pexec 3 23:01:00 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:01:01 -!- bsmnt_bot_chroot has joined. 23:01:03 ~exec print "exception 23:01:14 .. 23:01:57 uuuh crap 23:01:57 ~qui 23:02:07 ~exec print "exception" 23:02:09 ??? 23:02:11 -!- zedrdave has left (?). 23:02:22 ~quit 23:02:22 it won't die 23:02:27 ~ps 23:02:30 ... 23:02:37 wtf happened 23:03:22 .... 23:03:26 DIE 23:04:21 may i recommend kill -9 ? :) 23:04:22 uuuh wtf 23:05:13 -!- bsmnt_bot_chroot has quit (Read error: 131 (Connection reset by peer)). 23:05:17 -!- bsmnt_bot_chroot has joined. 23:05:17 finally 23:05:22 foo 23:05:30 ~exec print "exception 23:05:30 Traceback (most recent call last): 23:05:31 File "/bot/ircbot.py", line 168, in exec_execer 23:05:31 exec command in env[0], env[1] 23:05:33 File "", line 1 23:05:35 23:05:37 print "exception 23:05:39 23:05:41 ^ 23:05:43 23:05:45 SyntaxError: EOL while scanning single-quoted string 23:06:00 still a bit spammy for a response to a single line 23:06:02 -!- pikhq has joined. 23:06:25 what should it send? 23:06:47 i believe EgoBot will send all but the first line to the original sender rather than the channel. 23:07:15 although not in all cases, confer !ps 23:07:43 I think a dedicated error channel is a good idea 23:08:51 Don't print blank lines. 23:09:05 that too 23:10:22 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:10:24 -!- bsmnt_bot_chroot has joined. 23:11:07 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:11:09 -!- bsmnt_bot_chroot has joined. 23:13:41 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:13:43 -!- bsmnt_bot_chroot has joined. 23:15:05 join #bsmnt_bot_chroot_errors, everyone 23:15:37 ~exec print "excpetion 23:15:40 i note you sometimes find self.register_raw a bit limiting. Perhaps add an optional guard argument, a lambda that can be used to add checks that are awkward with regexps. It could take the same arguments as the second lambda. 23:15:57 MY COMPUTER LIVES!!! 23:16:05 RUN AWAY! 23:16:24 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:16:26 -!- bsmnt_bot_chroot has joined. 23:16:27 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:16:29 -!- bsmnt_bot_chroot has joined. 23:16:44 oerjan: hmm, that might be nice 23:16:46 ~exec print "excpetion 23:17:23 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:17:25 -!- bsmnt_bot_chroot has joined. 23:17:29 ~exec print "excpetion 23:17:52 ok, #bsmnt_bot_chroot_errors has stderr and stdout redirected to it 23:18:35 !exec 3 23:18:39 ... 23:18:41 ~pexec 3 23:18:45 that's not an exception 23:18:51 Stop using ~exec, eh? 23:18:57 ~pexec print "hi" 23:18:58 ~pexec print 3 23:19:03 :) 23:19:26 ~pexec print "hi\nagain" 23:20:12 why not stdout here? 23:20:29 that would work too 23:21:43 can you put it? 23:22:23 hmm I need to change the interface for exec_execer then 23:23:58 you gonna do it?= 23:24:10 maybe 23:24:16 ~raw join #baadf00d 23:24:46 i mean, are you gonna do it now or just possibly later because i'll go to sleep if it takes >10 min 23:26:37 not right now 23:26:47 okay, nn then 23:26:50 -> 23:28:52 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:28:55 -!- bsmnt_bot_chroot has joined. 23:29:02 foo 23:30:50 ~exec print "asdf"" 23:31:09 When's the last time you registered a command? 23:31:28 ? 23:33:07 ~pexec self.register_raw('(.*)', lambda x,y: print x) 23:33:16 Does it work? 23:33:30 No? 23:33:42 ? 23:34:12 you can't print in a lambda 23:34:55 ~pexec self.register_raw('(.*)', lambda x,y: sys.write(x + "\n"))) 23:35:05 hmmm 23:35:15 ~pexec self.register_raw('(.*)', lambda x,y: self.raw("PRIVMSG #bsmnt_bot_chroot_errors :%s" % x)) 23:35:22 No errors? 23:35:23 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:35:24 -!- bsmnt_bot_chroot has joined. 23:35:27 hmmm 23:35:34 That clearly didn't work. 23:35:37 uuuh 23:36:16 I think you should try to catch a few more errors. 23:36:37 ~pexec self.register_raw(".*", lambda x : sys.__stdout__.write("message")) 23:36:39 Just have it spit error messages onto the channel. 23:36:39 a 23:36:48 CakeProphet: #bsmnt_bot_chroot_errors 23:37:04 ~pexec self.raw_regex_queue.pop() 23:37:38 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:37:40 -!- bsmnt_bot_chroot has joined. 23:37:53 ~pexec self.register_raw('(.*)', lambda x,y: self.raw("PRIVMSG #bsmnt_bot_chroot_errors :%s" % x)) 23:37:57 j 23:37:57 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:38:00 -!- bsmnt_bot_chroot has joined. 23:38:46 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:38:48 -!- bsmnt_bot_chroot has joined. 23:39:01 hmmm 23:39:07 ~pexec self.register_raw('(.*)', lambda x,y: self.raw("PRIVMSG CakeProphet :%s" % x)) 23:39:07 hmmm 23:39:20 -!- CakeProphet has quit ("haaaaaaaaaa"). 23:39:21 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:39:22 -!- bsmnt_bot_chroot has joined. 23:40:21 I think it's an error in the callback 23:42:21 -!- anonfunc_ has joined. 23:43:20 foo 23:43:23 ~ps 23:43:24 None 23:44:35 ~exec self.register_raw("\S+ PRIVMSG #esoteric :(~quine .*)", lambda x, y : bot.raw("PRIVMSG #esoteric :%s" % y.group(1))) 23:44:39 ~quine foo 23:44:39 ~quine foo 23:44:49 ~exec self.raw_regex_queue.pop() 23:44:55 ~exec self.register_raw("\S+ PRIVMSG #esoteric :(~quine.*)", lambda x, y : bot.raw("PRIVMSG #esoteric :%s" % y.group(1))) 23:45:12 ~quine foo 23:45:13 ~quine foo 23:45:14 ok 23:45:29 ~exec __import__("time").sleep("this is wrong") 23:45:45 ~exec raise SystemExit 23:45:49 ok 23:48:12 Windows doesn't really make any sense when it comes to tool tips... 23:48:19 Or ToolTips, or whatever they're called. 23:51:24 -!- bsmnt_bot_chroot has quit (Remote closed the connection). 23:51:26 -!- bsmnt_bot_chroot has joined. 23:51:46 ok, now only tracebacks go to #bsmnt_bot_chroot_errors 23:51:57 stdout was pooping on the other threads 23:52:04 ~pexec print "exvckhjo 23:52:58 ~pexec print "exvckhjo" 23:53:02 good 23:54:45 -!- puzzlet has joined. 23:57:23 -!- anonfunc has quit (Connection timed out).