»ö« Welcome to Perl 6! | perl6.org/ | evalbot usage: 'p6: say 3;' or /msg camelia p6: ... | irclog: irc.perl6.org or colabti.org/irclogger/irclogger_log/perl6 | UTF-8 is our friend! 🦋 Set by Zoffix on 25 July 2018. |
|||
00:02
bathtub_shark21 left
|
|||
timotimo | anyone else seeing rather an increase in mail spam volume since about yesterday? | 00:03 | |
00:07
sauvin joined,
p6bannerbot sets mode: +v sauvin
|
|||
geekosaur | I've been seeing it for several weeks | 00:18 | |
00:25
dct left
00:32
mindjuju29 joined,
p6bannerbot sets mode: +v mindjuju29
00:33
Guest3028 joined,
mindjuju29 left
00:34
p6bannerbot sets mode: +v Guest3028
00:35
Guest3028 left
00:50
pilottage joined
00:51
p6bannerbot sets mode: +v pilottage,
pilottage left
01:01
kardam left
01:16
atomicthumbs12 joined,
p6bannerbot sets mode: +v atomicthumbs12
01:18
atomicthumbs12 left
|
|||
SmokeMachine | Is there a way to a Seq inform to a `race` or `hyper` method what is the best batch size to be used? | 01:36 | |
01:36
matsu joined
01:37
p6bannerbot sets mode: +v matsu
|
|||
timotimo | the seq could implement its own race or hyper method that has different defaults for example | 01:41 | |
01:55
benjikun left
02:11
Raziel25 joined
02:12
p6bannerbot sets mode: +v Raziel25
|
|||
SmokeMachine | timotimo: yes, that solves the problem, thanks! | 02:13 | |
02:14
Raziel25 left
02:45
c24 joined
02:46
p6bannerbot sets mode: +v c24
02:53
c24 left
03:12
jelly9 joined,
p6bannerbot sets mode: +v jelly9
03:15
jelly9 left
03:32
ophanim joined,
p6bannerbot sets mode: +v ophanim
03:33
ophanim left
04:00
[particle] joined
04:01
p6bannerbot sets mode: +v [particle],
[particle]1 left
04:08
[particle] left
04:13
[particle] joined
04:14
p6bannerbot sets mode: +v [particle]
04:27
matsu left
05:08
spycrab0 left
05:31
mdoep17 joined,
mdoep17 left
05:36
AlexDani` joined
05:37
p6bannerbot sets mode: +v AlexDani`
05:39
AlwaysHigh8 joined
05:40
p6bannerbot sets mode: +v AlwaysHigh8
05:41
AlexDaniel left
05:44
AlexDani` is now known as AlexDaniel,
AlexDaniel left,
AlexDaniel joined,
verne.freenode.net sets mode: +v AlexDaniel,
p6bannerbot sets mode: +v AlexDaniel
05:45
AlwaysHigh8 left
05:46
Affliction18 joined
05:47
p6bannerbot sets mode: +v Affliction18
05:48
weaksauce25 joined
05:49
Affliction18 left,
p6bannerbot sets mode: +v weaksauce25
05:51
weaksauce25 left
05:58
molaf joined,
p6bannerbot sets mode: +v molaf
06:01
vrurg left
06:10
troys left
06:26
domidumont joined,
[particle] left
06:27
p6bannerbot sets mode: +v domidumont
06:28
[particle] joined,
p6bannerbot sets mode: +v [particle]
06:30
domidumont left
06:31
domidumont joined,
p6bannerbot sets mode: +v domidumont
06:53
fireworks29 joined,
p6bannerbot sets mode: +v fireworks29
06:54
Blendify_i5 joined,
p6bannerbot sets mode: +v Blendify_i5
06:59
Blendify_i5 left
07:00
fireworks29 left
07:18
Techman6 joined
07:19
p6bannerbot sets mode: +v Techman6
07:27
hggdh27 joined,
hggdh27 left,
Techman6 left
07:49
patate6 joined
07:50
patate6 left
07:53
pokk24 joined
07:54
p6bannerbot sets mode: +v pokk24
07:55
pokk24 left,
andrzejek joined
07:56
p6bannerbot sets mode: +v andrzejek
|
|||
andrzejek | araraloren: hi | 07:56 | |
08:18
domidumont left,
rindolf joined
08:19
p6bannerbot sets mode: +v rindolf
|
|||
andrzejek | araraloren: nicht da | 08:34 | |
08:43
lizmat left
09:11
Ven` joined
09:12
p6bannerbot sets mode: +v Ven`,
rindolf left
09:16
Ven` left
09:27
rindolf joined
09:28
p6bannerbot sets mode: +v rindolf
09:39
Checking joined
09:40
Checking left
09:45
Cronus5 joined
09:46
p6bannerbot sets mode: +v Cronus5
09:47
Lumpi27 joined
09:48
Cronus5 left,
p6bannerbot sets mode: +v Lumpi27
09:51
Lumpi27 left
09:56
aborazmeh joined,
aborazmeh left,
aborazmeh joined,
p6bannerbot sets mode: +v aborazmeh
09:57
p6bannerbot sets mode: +v aborazmeh
10:00
andrzejek left
10:04
Dan_Bennett joined,
p6bannerbot sets mode: +v Dan_Bennett
10:05
Dan_Bennett left
10:15
lizmat joined,
p6bannerbot sets mode: +v lizmat
10:23
jmerelo joined,
Pixelz0 joined,
p6bannerbot sets mode: +v jmerelo
10:24
p6bannerbot sets mode: +v Pixelz0
|
|||
jmerelo | releasable6: status | 10:24 | |
releasable6 | jmerelo, Next release will happen when it's ready. 3 blockers. 447 out of 449 commits logged | ||
jmerelo, Details: gist.github.com/2da3dba3caaa6841d7...a417b4479a | |||
10:25
Pixelz0 left
|
|||
jmerelo | So, no release yet, right? | 10:31 | |
10:32
sotona joined
10:33
p6bannerbot sets mode: +v sotona
10:36
boredguy joined,
boredguy left
10:38
domidumont joined,
p6bannerbot sets mode: +v domidumont
10:39
LEI8 joined
10:40
p6bannerbot sets mode: +v LEI8,
LEI8 left
|
|||
AlexDaniel | jmerelo: yeah, not yet | 10:42 | |
jmerelo: but I'm pretty sure it'll happen next week | 10:43 | ||
jmerelo: btw I made this list: github.com/perl6-community-modules...aster/wiki | |||
10:44
nwc10 left
|
|||
jmerelo | AlexDaniel++ | 10:44 | |
AlexDaniel | jmerelo: and today I toasted things once again, and it seems like there are some modules failing that were previously hidden because of native deps | ||
jmerelo | AlexDaniel: great. So you install everything before toasting... | ||
AlexDaniel | yeah | ||
jmerelo | AlexDaniel: I still think there's an error that is similar to the intermitent error we get in perl6/doc travis | 10:45 | |
AlexDaniel: I don't remember where I told zoffix about it, it wasn't an issue. Anyway, I think it's related to the number of compunits open or something like that. | |||
10:46
sena_kun joined
|
|||
jmerelo | AlexDaniel: you see, for instance, here: toast.perl6.party/module?module=DB...4-g66aa689 | 10:46 | |
10:46
ZzZombo joined,
p6bannerbot sets mode: +v ZzZombo
10:47
p6bannerbot sets mode: +v sena_kun
|
|||
jmerelo | AlexDaniel: it's this same error travis-ci.org/perl6/doc/jobs/415536136 | 10:47 | |
10:48
sotona left
10:52
spycrab0 joined,
p6bannerbot sets mode: +v spycrab0
|
|||
jmerelo | AlexDaniel: which modules are failing? | 10:53 | |
10:58
sotona joined,
p6bannerbot sets mode: +v sotona
|
|||
lizmat | weekly: perlhacks.com/2018/08/the-perl-con...n-glasgow/ | 11:03 | |
notable6 | lizmat, Noted! | ||
11:03
sotona left
|
|||
lizmat | weekly: perlmonks.org/?node_id=1220578 | 11:16 | |
notable6 | lizmat, Noted! | ||
lizmat | afk for some sighhtseeing& | 11:17 | |
jmerelo | lizmat: you do that. Have fun! | ||
11:38
ZzZombo left
11:52
sotona joined
11:53
p6bannerbot sets mode: +v sotona,
domidumont left
11:55
KotH left
11:57
sotona left
12:11
kerframil joined,
p6bannerbot sets mode: +v kerframil
12:17
sotona joined,
p6bannerbot sets mode: +v sotona
12:27
jmerelo left
12:29
dct joined,
p6bannerbot sets mode: +v dct
12:30
aborazmeh left
12:49
sotona left
12:53
reportable6 left
12:54
reportable6 joined,
ChanServ sets mode: +v reportable6,
p6bannerbot sets mode: +v reportable6
12:59
marmor joined,
p6bannerbot sets mode: +v marmor
13:03
dct left
13:17
dct joined,
p6bannerbot sets mode: +v dct
13:23
dct left
13:36
sotona joined
13:37
p6bannerbot sets mode: +v sotona
13:41
sotona left,
domidumont joined,
p6bannerbot sets mode: +v domidumont
13:51
DarthGandalf left,
KotH joined,
DarthGandalf joined,
p6bannerbot sets mode: +v DarthGandalf
13:52
p6bannerbot sets mode: +v KotH
13:55
domidumont left
14:01
Metacity26 joined
14:02
p6bannerbot sets mode: +v Metacity26
14:05
Metacity26 left
14:14
itaipu joined,
dalek left,
p6bannerbot sets mode: +v itaipu
14:15
zakharyas joined
14:16
p6bannerbot sets mode: +v zakharyas,
marmor left
14:23
kybr left
14:26
Geth left
14:32
vrurg joined
14:33
p6bannerbot sets mode: +v vrurg
14:57
espadrine joined,
nikivi13 joined,
p6bannerbot sets mode: +v espadrine
14:58
p6bannerbot sets mode: +v nikivi13
15:01
nikivi13 left
15:05
ChoHag left,
Zombie26 joined
15:06
p6bannerbot sets mode: +v Zombie26
15:09
Zombie26 left
15:12
lizmat left
15:19
jpX joined
15:20
p6bannerbot sets mode: +v jpX,
jpX left
15:21
lizmat joined
15:22
p6bannerbot sets mode: +v lizmat
15:41
araraloren left,
KotH left
15:47
iownall55520 joined
15:48
p6bannerbot sets mode: +v iownall55520
15:49
iownall55520 left
15:55
fake_space_whale joined
15:56
p6bannerbot sets mode: +v fake_space_whale
16:18
lizmat left
16:19
damaxi joined
16:20
p6bannerbot sets mode: +v damaxi
16:21
DenSchub17 joined
16:22
p6bannerbot sets mode: +v DenSchub17
16:24
protium left,
aeruder_ left,
afresh1 left
16:25
markk joined,
nine_ joined,
tyil joined,
p6bannerbot sets mode: +v tyil,
aeruder joined,
rjbs joined,
Util joined,
masak joined,
eythian joined,
afresh1 joined,
japhb_ joined,
DenSchub17 left,
masak is now known as Guest85961,
p6bannerbot sets mode: +v markk,
p6bannerbot sets mode: +v nine_,
p6bannerbot sets mode: +v aeruder,
p6bannerbot sets mode: +v rjbs,
p6bannerbot sets mode: +v Util,
p6bannerbot sets mode: +v Guest85961,
p6bannerbot sets mode: +v eythian,
p6bannerbot sets mode: +v afresh1,
p6bannerbot sets mode: +v japhb_
16:26
eythian left,
eythian joined,
barjavel.freenode.net sets mode: +v eythian,
p6bannerbot sets mode: +v eythian,
perlbot_ joined,
benchable6 left
16:27
p6bannerbot sets mode: +v perlbot_,
committable6 left,
greppable6 left
16:28
shareable6 left,
statisfiable6 left,
bisectable6 left,
nativecallable6 left,
protium joined,
bhm left
16:29
bhm joined,
p6bannerbot sets mode: +v protium
16:30
p6bannerbot sets mode: +v bhm
16:50
damaxi left
17:14
committable6 joined
17:15
p6bannerbot sets mode: +v committable6
17:21
Turska-16 joined,
Turska-16 left
17:25
nativecallable6 joined,
bisectable6 joined,
p6bannerbot sets mode: +v nativecallable6,
p6bannerbot sets mode: +v bisectable6
17:38
zakharyas left
17:39
pmurias joined
17:40
p6bannerbot sets mode: +v pmurias
17:41
KotH joined
17:42
p6bannerbot sets mode: +v KotH,
damaxi joined
17:43
rindolf left,
p6bannerbot sets mode: +v damaxi
17:47
andries27 joined
17:48
p6bannerbot sets mode: +v andries27
17:52
andries27 left
17:53
rindolf joined
17:54
p6bannerbot sets mode: +v rindolf
18:01
aindilis left
18:02
aindilis joined,
p6bannerbot sets mode: +v aindilis
18:05
koto joined
18:06
p6bannerbot sets mode: +v koto
18:08
sena_kun left
18:10
perlbot_ left,
perlbot_ joined,
verne.freenode.net sets mode: +v perlbot_,
p6bannerbot sets mode: +v perlbot_,
perlbot_ is now known as perlbot
18:20
SCHAPiE left
18:21
Guest85961 is now known as masak
|
|||
masak | what's the significant difference in Perl 6 between CATCH and CONTROL, and between exceptions and control exceptions? | 18:22 | |
timotimo | control exceptions are normally resumed i guess? | ||
masak | oh, there's a difference in semantics? interesting. | 18:23 | |
timotimo | m: CONTROL { .say; say "controlled" }; say "hi"; warn "oh my"; say "bye"; warn "oh see ya" | ||
camelia | hi oh my MoarVM panic: Trying to unwind over wrong handler |
||
timotimo | hah | ||
18:23
greppable6 joined
|
|||
timotimo | m: sub it { CONTROL { .say; say "controlled" }; say "hi"; warn "oh my"; say "bye"; warn "oh see ya" }; it | 18:23 | |
camelia | hi oh my MoarVM panic: Trying to unwind over wrong handler |
||
masak | that went well :P | ||
18:23
damaxi left,
greppable6 left
|
|||
timotimo | yeah, not really | 18:23 | |
18:24
greppable6 joined,
SCHAPiE joined,
p6bannerbot sets mode: +v SCHAPiE
18:25
p6bannerbot sets mode: +v greppable6
18:27
benchable6 joined
18:28
sena_kun joined,
p6bannerbot sets mode: +v benchable6,
p6bannerbot sets mode: +v sena_kun
|
|||
masak | besides, I can't really think of a control exception that's resumed | 18:30 | |
18:30
koto left
|
|||
masak | if `next` and `last` are governed by control exceptions, it doesn't seem to me they are resumed | 18:30 | |
today I got the crazy idea (for 007) that dynamic variables could be implemented using control exceptions :) | |||
timotimo | mhh, i can imagine how that might work | 18:33 | |
you throw the name of the variable and the first frame that "defines" it will catch, set the value to a container that was passed along, and resumes | |||
stmuk | OpenSSL is broken on some non-linux systems (OS X and OpenBSD) :-( | 18:36 | |
masak | it's like you're reading my mind :) | ||
18:37
realz joined,
damaxi joined,
realz is now known as Guest31344,
p6bannerbot sets mode: +v Guest31344,
p6bannerbot sets mode: +v damaxi
18:38
nativecallable6 left,
benchable6 left,
committable6 left,
bisectable6 left,
bloatable6 left,
reportable6 left,
squashable6 left,
greppable6 left,
coverable6 left,
undersightable6 left,
notable6 left,
domidumont joined
18:39
p6bannerbot sets mode: +v domidumont
|
|||
timotimo | well, you've done all the thinking to pinpoint the idea, and then boiled it down to the key insight that would probably lead anyone to the same conclusion :) | 18:41 | |
18:42
Guest31344 left
|
|||
jnthn | masak: `take` and `emit` and `warn` are all examples of resumable control exceptions | 18:44 | |
18:46
sena_kun left
|
|||
jnthn | masak: The main reason CATCH doesn't catch control exceptions is because it'd be really awkward for the language user. There's nothing deeply different about control exceptions - the resolution machinery is the very same - it's just valuable to keep them distinct at the language level. | 18:46 | |
You could in theory do dynamic variables with the exception system, but not all pretty unifications are performant unifications. :) | 18:47 | ||
18:54
sotona joined
18:55
p6bannerbot sets mode: +v sotona
|
|||
timotimo | does the profiler work fine on a rakudo with all the specified revisions? | 18:58 | |
19:01
ilbelkyr17 joined,
p6bannerbot sets mode: +v ilbelkyr17
19:02
ilbelkyr17 left,
domidumont left
19:03
mfa29823 joined,
mfa29823 left
19:11
lgtaube joined
19:12
p6bannerbot sets mode: +v lgtaube
19:24
JustTheDoctor16 joined,
p6bannerbot sets mode: +v JustTheDoctor16
19:26
bloatable6 joined,
notable6 joined,
quotable6 joined,
nativecallable6 joined,
greppable6 joined,
ChanServ sets mode: +v quotable6,
ChanServ sets mode: +v nativecallable6,
ChanServ sets mode: +v greppable6,
committable6 joined,
ChanServ sets mode: +v committable6,
releasable6 joined,
coverable6 joined,
ChanServ sets mode: +v coverable6,
shareable6 joined,
ChanServ sets mode: +v shareable6,
bisectable6 joined,
reportable6 joined,
benchable6 joined,
squashable6 joined,
statisfiable6 joined,
ChanServ sets mode: +v statisfiable6,
p6bannerbot sets mode: +v bloatable6,
p6bannerbot sets mode: +v notable6
19:27
p6bannerbot sets mode: +v quotable6,
p6bannerbot left,
p6bannerbot joined
19:30
lookatme_q left,
JustTheDoctor16 left
|
|||
robertle | can I check my understanding of Supplies? does the tap() block get executed by the thread that does the emit()? if I want multiple worker threads, I would have to do a start { ... } within the tap block? | 19:38 | |
19:39
damaxi left
|
|||
timotimo | there's also a .start method on Supplies; it results in a supply of supplies that emit the single result value from the promise, though | 19:41 | |
masak | jnthn: thank you for the explanation about user-level distinction. that's what I was looking for (and where I will continue my train of thought) | 19:44 | |
jnthn: also, noted about pretty unifications ;) | |||
robertle | hmm, my problem is that I have a single thread that creates events (async I/O), but many supplies (e.g. one per socket). I want to do stuff in parallel, but I do not want to execute two items from the same supply in parallel because then they could get reordered. currently I have a tap( ->$i { $!lock.lock; start { .... $!lock.unlock; } } ) | 19:45 | |
this does what I want I think, but seems like a very C-like construct with the explicit locking and unlocking, also the fact that the lock() and unlock() happen in different threads... | |||
there must be a cleaner way... | |||
19:45
sotona left
|
|||
timotimo | react blocks have "only one thread in the block at one time" semantics | 19:46 | |
they probably do what you want | |||
so you don't have to fiddle with taps manually | |||
robertle | timotimo: ok, but is that also true if there is only one thread calling emit() on the supply? | ||
19:46
RoBz9 joined
|
|||
timotimo | not sure if i understand, but i think so? | 19:47 | |
robertle | I will try, but I thought react is just syntactic sugar over act() | ||
19:48
RoBz9 left
|
|||
robertle | well, perhaps a bit more in the sense that it could protect more than one supply | 19:48 | |
but is the general assumption for tap() and act() correct that the tap()/act() block is executed by the thread that calls emit()? | |||
timotimo | react is more than just act, it also does lots of super helpful subscription management for you | 19:50 | |
19:56
unicodable6 joined,
evalable6 joined,
ChanServ sets mode: +v unicodable6,
ChanServ sets mode: +v evalable6,
undersightable6 joined
|
|||
jnthn | robertle: Yes, supplies are a mechanism primarily for concurrency control, not for introducing parallel processing | 20:02 | |
20:03
change joined
|
|||
jnthn | The $supply.Channel.Supply idiom is one way to stick a Channel in as a buffer and have events handled on another thread | 20:04 | |
20:05
change left
|
|||
robertle | jnthn: ok, that matches my observations. so if I do IO::Socket::Async.listen().tap(-> $client-socket { $client-socket.Supply(:bin).tap( -> $input { handle-input($input) }) }) | 20:06 | |
then all calls to handle-input are run by the one thread dealing with async I/O, right? | 20:07 | ||
jnthn | robertle: No | ||
Because it inserts the events into the ThreadPoolScheduler's input queue | |||
So you could have different threads handling different clients concurrently there | 20:08 | ||
Of course, it'll only "do one accept" at a time and process one bit of input for a given client at a time | 20:09 | ||
robertle | right, that would be fab. but it's not what I am seeing, let me golf this... | ||
gist.github.com/robertlemmen/9d082...cb48f4ec8e | 20:15 | ||
as I said, I have a way to work around it, but it seems ugly | |||
jnthn | robertle: You're just not doing enough work to make it need more than one thread :) | 20:19 | |
robertle | I did have sleeps in there before, but I guess they do not count as work? | 20:21 | |
jnthn | I stuck a sleep 0.5 in there and I see stuff like: | ||
input, handled in thread 19 | |||
input, handled in thread 30 | |||
robertle | interesting, my sleep was 0.1 and it did not trigger it! with 0.5 it does do things in parallel | 20:22 | |
where is the logic that decides when to put work on the thread pool and when to do it directly? would be very interesting to have a look... | 20:24 | ||
jnthn | It *never* does these directly | 20:25 | |
The event loop thread never runs user code, it only ever puts stuff into the queue | 20:26 | ||
But see src/core/ThreadPoolScheduler.pm6 for the place it decides how many threads | |||
In particular, grep for affinity-worker or some such | |||
robertle | hmm, when you run it with sleep(0.1), do you get execution on multiple threads? | 20:27 | |
jnthn | No | ||
It's a heuristic algorithm trying to start a sensible number of threads, so it's maybe that it wants a tweak in some cases | 20:28 | ||
robertle | ah! I looked that that a while ago! | ||
the heuristic is largely based on cpu utilisation! | |||
jnthn | Ah :) | 20:29 | |
So sleep is a pretty poor fake after all :) | |||
Though being tuned for real apps rather than fakery is probably sensible :) | |||
robertle | well, the reason I was remembering it is that I have apps at work that primarily shovel data around, so they do not sleep but would send onwards and wait for a response. they are not written in perl 6, but they also have the problem that they have low cpu utilistaion yet need more threads to handle the work | 20:31 | |
without blocking I/O mind you, I think it's just the task switching that kills it | |||
20:36
kerframil left
|
|||
robertle | weirdly if i remove the sleep and run it in a tight loop, I get about 125% cpu utilisation yet still only one thread that does the work. but perhaps it is now throttled by the accept() that always happens sequentially | 20:39 | |
jnthn | Well, there's an event loop thread running in the background dispatching the work too | 20:41 | |
robertle | I'll play some more with it. but you must have some benchmarks or real-world apps for cro, right? can you get more than a few hundred RQ/s through it? | 20:43 | |
jnthn | I've seen 700+ in the past | 20:44 | |
That's for the full HTTP/router stack | |||
away for a bit | 20:46 | ||
robertle | that's cool. I don't get any more than that for a really simple case | ||
jnthn | Tested with ab also, fwiw | 20:47 | |
robertle | I wish ab was able to do keepalive | ||
21:10
alphor16 joined,
alphor16 left
21:29
lizmat joined
21:30
varesa joined
21:33
varesa left
21:34
sotona joined
21:38
sotona left
21:43
msm7 joined,
pmurias left
21:52
msm7 left
21:58
Madkiss17 joined,
sotona joined
22:00
Rob___ left
22:05
Madkiss17 left,
Guest97826 joined
22:06
Guest97826 left
22:14
rindolf left
22:17
espadrine left
22:55
stmuk_ joined
22:57
stmuk left
23:15
sotona left
23:16
sotona joined
23:20
sotona left
|
|||
Garland_g[m] | Say I declare an enum Color <Red Green Blue>. I don't want "Red" to become a symbol in the current scope, but want to only be able to access it with "Color::Red" instead. Is there a way to do this? | 23:31 | |
23:51
nolsen17 joined
|
|||
timotimo | Garland_g[m]: try this: | 23:51 | |
m: constant Color = do { enum Color <Red Green Blue>; Color }; say Color::Red | |||
camelia | Red | ||
timotimo | m: constant Color = do { enum Color <Red Green Blue>; Color }; say Red | ||
camelia | Red | ||
timotimo | oh damn | ||
forget about this! | |||
23:52
nolsen17 left
|
|||
Garland_g[m] | I tried something similar, and I was surprised that it escaped the block too. | 23:53 | |
23:56
dalek joined,
ChanServ sets mode: +v dalek,
sergot_ left,
p6lert_ joined,
Geth joined,
ChanServ sets mode: +v Geth,
synopsebot_ joined,
ChanServ sets mode: +v synopsebot_,
SourceBaby left,
synopsebot left,
p6lert left
|