comboy-autumn 3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. data/README.textile +1192 -0
  2. data/autumn.gemspec +25 -0
  3. data/bin/autumn +27 -0
  4. data/lib/autumn.rb +2 -0
  5. data/lib/autumn/authentication.rb +290 -0
  6. data/lib/autumn/channel_leaf.rb +107 -0
  7. data/lib/autumn/coder.rb +166 -0
  8. data/lib/autumn/console_boot.rb +9 -0
  9. data/lib/autumn/ctcp.rb +250 -0
  10. data/lib/autumn/daemon.rb +207 -0
  11. data/lib/autumn/datamapper_hacks.rb +290 -0
  12. data/lib/autumn/foliater.rb +231 -0
  13. data/lib/autumn/formatting.rb +236 -0
  14. data/lib/autumn/generator.rb +231 -0
  15. data/lib/autumn/genesis.rb +191 -0
  16. data/lib/autumn/inheritable_attributes.rb +162 -0
  17. data/lib/autumn/leaf.rb +738 -0
  18. data/lib/autumn/log_facade.rb +49 -0
  19. data/lib/autumn/misc.rb +87 -0
  20. data/lib/autumn/script.rb +74 -0
  21. data/lib/autumn/speciator.rb +165 -0
  22. data/lib/autumn/stem.rb +919 -0
  23. data/lib/autumn/stem_facade.rb +176 -0
  24. data/resources/daemons/Anothernet.yml +3 -0
  25. data/resources/daemons/AustHex.yml +29 -0
  26. data/resources/daemons/Bahamut.yml +67 -0
  27. data/resources/daemons/Dancer.yml +3 -0
  28. data/resources/daemons/GameSurge.yml +3 -0
  29. data/resources/daemons/IRCnet.yml +3 -0
  30. data/resources/daemons/Ithildin.yml +7 -0
  31. data/resources/daemons/KineIRCd.yml +56 -0
  32. data/resources/daemons/PTlink.yml +6 -0
  33. data/resources/daemons/QuakeNet.yml +20 -0
  34. data/resources/daemons/RFC1459.yml +158 -0
  35. data/resources/daemons/RFC2811.yml +16 -0
  36. data/resources/daemons/RFC2812.yml +36 -0
  37. data/resources/daemons/RatBox.yml +25 -0
  38. data/resources/daemons/Ultimate.yml +24 -0
  39. data/resources/daemons/Undernet.yml +6 -0
  40. data/resources/daemons/Unreal.yml +110 -0
  41. data/resources/daemons/_Other.yml +7 -0
  42. data/resources/daemons/aircd.yml +33 -0
  43. data/resources/daemons/bdq-ircd.yml +3 -0
  44. data/resources/daemons/hybrid.yml +38 -0
  45. data/resources/daemons/ircu.yml +67 -0
  46. data/resources/daemons/tr-ircd.yml +8 -0
  47. data/skel/Rakefile +135 -0
  48. data/skel/config/global.yml +2 -0
  49. data/skel/config/seasons/testing/database.yml +7 -0
  50. data/skel/config/seasons/testing/leaves.yml +7 -0
  51. data/skel/config/seasons/testing/season.yml +2 -0
  52. data/skel/config/seasons/testing/stems.yml +9 -0
  53. data/skel/leaves/administrator/README +20 -0
  54. data/skel/leaves/administrator/controller.rb +67 -0
  55. data/skel/leaves/administrator/views/autumn.txt.erb +1 -0
  56. data/skel/leaves/administrator/views/reload.txt.erb +11 -0
  57. data/skel/leaves/insulter/README +17 -0
  58. data/skel/leaves/insulter/controller.rb +65 -0
  59. data/skel/leaves/insulter/views/about.txt.erb +1 -0
  60. data/skel/leaves/insulter/views/help.txt.erb +1 -0
  61. data/skel/leaves/insulter/views/insult.txt.erb +1 -0
  62. data/skel/leaves/scorekeeper/README +34 -0
  63. data/skel/leaves/scorekeeper/config.yml +2 -0
  64. data/skel/leaves/scorekeeper/controller.rb +104 -0
  65. data/skel/leaves/scorekeeper/helpers/general.rb +64 -0
  66. data/skel/leaves/scorekeeper/models/channel.rb +12 -0
  67. data/skel/leaves/scorekeeper/models/person.rb +14 -0
  68. data/skel/leaves/scorekeeper/models/pseudonym.rb +11 -0
  69. data/skel/leaves/scorekeeper/models/score.rb +14 -0
  70. data/skel/leaves/scorekeeper/tasks/stats.rake +17 -0
  71. data/skel/leaves/scorekeeper/views/about.txt.erb +1 -0
  72. data/skel/leaves/scorekeeper/views/change.txt.erb +5 -0
  73. data/skel/leaves/scorekeeper/views/history.txt.erb +11 -0
  74. data/skel/leaves/scorekeeper/views/points.txt.erb +5 -0
  75. data/skel/leaves/scorekeeper/views/usage.txt.erb +1 -0
  76. data/skel/script/console +34 -0
  77. data/skel/script/daemon +29 -0
  78. data/skel/script/destroy +48 -0
  79. data/skel/script/generate +48 -0
  80. data/skel/script/server +15 -0
  81. metadata +170 -0
@@ -0,0 +1,176 @@
1
+ # Defines the Autumn::StemFacade class, which provides additional convenience
2
+ # methods to Autumn::Stem.
3
+
4
+ module Autumn
5
+
6
+ # A collection of convenience methods that are added to the Stem class. These
7
+ # methods serve two purposes; one, to allow easier backwards compatibility
8
+ # with Autumn Leaves 1.0 (which had a simpler one-stem-per-leaf approach), and
9
+ # two, to make it easier or more Ruby-like to perform certain IRC actions.
10
+
11
+ module StemFacade
12
+
13
+ # Sends a message to one or more channels or nicks. If no channels or nicks
14
+ # are specified, broadcasts the message to every channel the stem is in. If
15
+ # you are sending a message to a channel you must prefix it correctly; the
16
+ # "#" will not be added before the channel name for you.
17
+ #
18
+ # message "Look at me!" # Broadcasts to all channels
19
+ # message "I love kitties", '#kitties' # Sends a message to one channel or person
20
+ # message "Learn to RTFM", '#help', 'NoobGuy' # Sends a message to two channels or people
21
+
22
+ def message(msg, *chans)
23
+ return if msg.nil? or msg.empty?
24
+ chans = channels if chans.empty?
25
+ if @throttle then
26
+ Thread.exclusive { msg.each_line { |line| privmsgt chans.to_a, line.strip unless line.strip.empty? } }
27
+ else
28
+ msg.each_line { |line| privmsg chans.to_a, line.strip unless line.strip.empty? }
29
+ end
30
+ end
31
+
32
+ # Sets the topic for one or more channels. If no channels are specified,
33
+ # sets the topic of every channel the stem is in.
34
+ #
35
+ # set_topic "Bots sure are fun!", 'bots', 'morebots'
36
+
37
+ def set_topic(motd, *chans)
38
+ return if motd.nil?
39
+ chans = chans.empty? ? channels : chans.map { |chan| normalized_channel_name chan }
40
+ chans.each { |chan| topic chan, motd }
41
+ end
42
+
43
+ # Joins a channel by name. If the channel is password-protected, specify the
44
+ # +password+ parameter. Of course, you could always just call the +join+
45
+ # method (since each IRC command has a method named after it), but the
46
+ # advantage to using this method is that it will also update the
47
+ # <tt>@channel_passwords</tt> instance variable. Internal consistency is a
48
+ # good thing, so please use this method.
49
+
50
+ def join_channel(channel, password=nil)
51
+ channel = normalized_channel_name(channel)
52
+ return if channels.include? channel
53
+ join channel, password
54
+ @channel_passwords[channel] = password if password
55
+ end
56
+
57
+ # Leaves a channel, specified by name.
58
+
59
+ def leave_channel(channel)
60
+ channel = normalized_channel_name(channel)
61
+ return unless channels.include? channel
62
+ part channel
63
+ end
64
+
65
+ # Changes this stem's IRC nick. Note that the stem's original nick will
66
+ # still be used by the logger.
67
+
68
+ def change_nick(new_nick)
69
+ nick new_nick
70
+ end
71
+
72
+ # Grants a privilege to a channel member, such as voicing a member. The stem
73
+ # must have the required privilege level to perform this command.
74
+ # +privilege+ can either be a symbol from the Daemon instance or a string
75
+ # with the letter code for the privilege.
76
+ #
77
+ # grant_user_privilege 'mychannel', 'Somedude', :operator
78
+ # grant_user_privilege '#mychannel', 'Somedude', 'oa'
79
+
80
+ def grant_user_privilege(channel, nick, privilege)
81
+ channel = normalized_channel_name(channel)
82
+ privcode = server_type.privilege.index(privilege).chr if server_type.privilege.value? privilege
83
+ privcode ||= privilege
84
+ mode channel, "+#{privcode}", nick
85
+ end
86
+
87
+ # Removes a privilege to a channel member, such as voicing a member. The
88
+ # stem must have the required privilege level to perform this command.
89
+ # +privilege+ can either be a symbol from the Daemon instance or a string
90
+ # with the letter code for the privilege.
91
+
92
+ def remove_user_privilege(channel, nick, privilege)
93
+ channel = normalized_channel_name(channel)
94
+ privcode = server_type.privilege.index(privilege).chr if server_type.privilege.value? privilege
95
+ privcode ||= privilege
96
+ mode channel, "-#{privcode}", nick
97
+ end
98
+
99
+ # Grants a usermode to an IRC nick, such as making a nick invisible.
100
+ # The stem must have the required privilege level to perform this command.
101
+ # (Generally, one can only change his own usermode unless he is a server
102
+ # op.) +mode+ can either be a symbol from the Daemon instance or a string
103
+ # with the letter code for the usermode.
104
+ #
105
+ # grant_usermode 'Spycloak', :invisible
106
+ # grant_usermode 'UpMobility', 'os'
107
+
108
+ def grant_usermode(nick, property)
109
+ propcode = server_type.usermode.index(property).chr if server_type.usermode.value? property
110
+ propcode ||= property
111
+ mode nick, "+#{property}"
112
+ end
113
+
114
+ # Revokes a usermode from an IRC nick, such as removing invisibility. The
115
+ # stem must have the required privilege level to perform this command.
116
+ # (Generally, one can only change his own usermode unless he is a server
117
+ # op.) +mode+ can either be a symbol from the Daemon instance or a string
118
+ # with the letter code for the usermode.
119
+
120
+ def remove_usermode(nick, property)
121
+ propcode = server_type.usermode.index(property).chr if server_type.usermode.value? property
122
+ propcode ||= property
123
+ mode nick, "-#{property}"
124
+ end
125
+
126
+ # Sets a property of a channel, such as moderated. The stem must have the
127
+ # required privilege level to perform this command. +property+ can either be
128
+ # a symbol from the Daemon instance or a string with the letter code for the
129
+ # property. If the property takes an argument (such as when setting a
130
+ # channel password), pass it as the +argument+ paramter.
131
+ #
132
+ # set_channel_property '#mychannel', :secret
133
+ # set_channel_property 'mychannel', :keylock, 'mypassword'
134
+ # set_channel_property '#mychannel', 'ntr'
135
+
136
+ def set_channel_property(channel, property, argument=nil)
137
+ channel = normalized_channel_name(channel)
138
+ propcode = server_type.channel_property.index(property).chr if server_type.channel_property.value? property
139
+ propcode ||= property
140
+ mode channel, "+#{propcode}", argument
141
+ end
142
+
143
+ # Removes a property of a channel, such as moderated. The stem must have the
144
+ # required privilege level to perform this command. +property+ can either be
145
+ # a symbol from the Daemon instance or a string with the letter code for the
146
+ # property. If the property takes an argument (such as when removing a
147
+ # channel password), pass it as the +argument+ paramter.
148
+
149
+ def unset_channel_property(channel, property, argument=nil)
150
+ channel = normalized_channel_name(channel)
151
+ propcode = server_type.channel_property.index(property).chr if server_type.channel_property.value? property
152
+ propcode ||= property
153
+ mode channel, "-#{propcode}", argument
154
+ end
155
+
156
+ # Returns an array of nicks for users that are in a channel.
157
+
158
+ def users(channel)
159
+ channel = normalized_channel_name(channel)
160
+ @chan_mutex.synchronize { @channel_members[channel] && @channel_members[channel].keys }
161
+ end
162
+
163
+ # Returns the privilege level of a channel member. The privilege level will
164
+ # be a symbol from the Daemon instance. Returns nil if the channel member
165
+ # doesn't exist or if the bot is not on the given channel. Returns an array
166
+ # of privileges if the server supports multiple privileges per user, and the
167
+ # user has more than one privilege.
168
+ #
169
+ # +user+ can be a nick or a sender hash.
170
+
171
+ def privilege(channel, user)
172
+ user = user[:nick] if user.kind_of? Hash
173
+ @chan_mutex.synchronize { @channel_members[channel] && @channel_members[channel][user] }
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ event:
3
+ 320: :rpl_whois_hidden
@@ -0,0 +1,29 @@
1
+ ---
2
+ channel_mode:
3
+ e: :event
4
+ event:
5
+ 434: :err_servicenameinuse
6
+ 357: :rpl_map
7
+ 385: :rpl_notoperanymore
8
+ 380: :rpl_yourhelper
9
+ 358: :rpl_mapmore
10
+ 430: :err_eventnickchange
11
+ 320: :rpl_whoisvirt
12
+ 309: :rpl_whoishelper
13
+ 480: :err_nouline
14
+ 359: :rpl_mapend
15
+ 310: :rpl_whoisservice
16
+ 503: :err_vworldwarn
17
+ 520: :err_whotrunc
18
+ 377: :rpl_spam
19
+ 328: :rpl_channel_url
20
+ 240: :rpl_statsxline
21
+ 378: :rpl_motd
22
+ 307: :rpl_suserhost
23
+ usermode:
24
+ v: :host_hiding
25
+ l: :listall
26
+ a: :errors
27
+ h: :helper
28
+ T: :w_lined
29
+ t: :z_lined
@@ -0,0 +1,67 @@
1
+ ---
2
+ channel_mode:
3
+ L: :listed
4
+ M: :modreg
5
+ c: :nocolour
6
+ O: :oper_only
7
+ R: :regonly
8
+ r: :registered
9
+ event:
10
+ 522: :err_whosyntax
11
+ 225: :rpl_statszline
12
+ 605: :rpl_nowoff
13
+ 484: :err_desync
14
+ 440: :err_servicesdown
15
+ 429: :err_toomanyaway
16
+ 308: :rpl_whoisadmin
17
+ 220: :rpl_statsbline
18
+ 600: :rpl_logon
19
+ 523: :err_wholimexceed
20
+ 512: :err_toomanywatch
21
+ 468: :err_onlyserverscanchange
22
+ 435: :err_banonchan
23
+ 226: :rpl_statscount
24
+ 617: :rpl_dccstatus
25
+ 606: :rpl_watchlist
26
+ 408: :err_nocolorsonchan
27
+ 309: :rpl_whoissadmin
28
+ 265: :rpl_localusers
29
+ 601: :rpl_logoff
30
+ 227: :rpl_statsgline
31
+ 618: :rpl_dcclist
32
+ 607: :rpl_endofwatchlist
33
+ 310: :rpl_whoissvcmsg
34
+ 266: :rpl_globalusers
35
+ 222: :rpl_statsbline
36
+ 602: :rpl_watchoff
37
+ 514: :err_toomanydcc
38
+ 338: :rpl_whoisactually
39
+ 619: :rpl_endofdcclist
40
+ 487: :err_msgservices
41
+ 245: :rpl_statssline
42
+ 223: :rpl_statseline
43
+ 999: :err_numeric_err
44
+ 603: :rpl_watchstat
45
+ 328: :rpl_channel_url
46
+ 620: :rpl_dccinfo
47
+ 521: :err_listsyntax
48
+ 477: :err_needreggednick
49
+ 334: :rpl_commandsyntax
50
+ 224: :rpl_statsfline
51
+ 604: :rpl_nowon
52
+ 329: :rpl_creationtime
53
+ 307: :rpl_whoisregnick
54
+ usermode:
55
+ k: :kills
56
+ A: :server_admin
57
+ a: :services_admin
58
+ m: :spambots
59
+ b: :chatops
60
+ y: :stats_links
61
+ n: :routing
62
+ d: :debug
63
+ f: :floods
64
+ R: :no_non_registered
65
+ r: :registered
66
+ g: :globops
67
+ h: :helper
@@ -0,0 +1,3 @@
1
+ ---
2
+ channel_mode:
3
+ J: :join_throttle
@@ -0,0 +1,3 @@
1
+ ---
2
+ event:
3
+ 345: :rpl_invited
@@ -0,0 +1,3 @@
1
+ ---
2
+ channel_mode:
3
+ R: :reop_list
@@ -0,0 +1,7 @@
1
+ ---
2
+ event:
3
+ 771: :rpl_xinfo
4
+ 672: :rpl_unknownmodes
5
+ 673: :rpl_cannotsetmodes
6
+ 773: :rpl_xinfostart
7
+ 774: :rpl_xinfoend
@@ -0,0 +1,56 @@
1
+ ---
2
+ server_mode:
3
+ L: :default_language
4
+ l: :lazy_leaf
5
+ A: :auto_tbs
6
+ a: :autoconnect
7
+ M: :modes_locked
8
+ n: :no_oper
9
+ D: :debugging
10
+ F: :full
11
+ H: :hidden
12
+ T: :testlink
13
+ channel_mode:
14
+ "!": :service
15
+ event:
16
+ 973: :err_cannotchangeumode
17
+ 687: :rpl_yourlanguageis
18
+ 665: :rpl_otherumodeis
19
+ 979: :err_servermodelock
20
+ 682: :rpl_networks
21
+ 671: :rpl_whoissecure
22
+ 660: :rpl_traceroute_hop
23
+ 974: :err_cannotchangechanmode
24
+ 688: :rpl_language
25
+ 666: :rpl_endof_generic
26
+ 980: :err_badcharencoding
27
+ 661: :rpl_traceroute_start
28
+ 975: :err_cannotchangeservermode
29
+ 689: :rpl_whoisstaff
30
+ 678: :rpl_luserstaff
31
+ 981: :err_toomanylanguages
32
+ 662: :rpl_modechangewarn
33
+ 976: :err_cannotsendtonick
34
+ 690: :rpl_whoislanguage
35
+ 679: :rpl_timeonserveris
36
+ 982: :err_nolanguage
37
+ 663: :rpl_chanredir
38
+ 977: :err_unknownservermode
39
+ 983: :err_texttooshort
40
+ 664: :rpl_servmodeis
41
+ 301: :rpl_away
42
+ 4: :rpl_myinfo
43
+ 670: :rpl_whowasdetails
44
+ user_prefix:
45
+ "!": :service
46
+ usermode:
47
+ d: :deaf
48
+ R: :no_non_registered
49
+ g: :callerid
50
+ s: :server_notices
51
+ h: :helper
52
+ channel_prefix:
53
+ .: :softchan
54
+ "~": :global
55
+ privilege:
56
+ "!": :service
@@ -0,0 +1,6 @@
1
+ ---
2
+ event:
3
+ 247: :rpl_statsxline
4
+ 484: :err_desync
5
+ 485: :err_cantkickadmin
6
+ 615: :rpl_mapmore
@@ -0,0 +1,20 @@
1
+ ---
2
+ channel_mode:
3
+ D: :deljoins
4
+ d: :has_hidden
5
+ u: :noquitparts
6
+ event:
7
+ 291: :rpl_endofcheck
8
+ 550: :err_badhostmask
9
+ 286: :rpl_chkhead
10
+ 551: :err_hostunavail
11
+ 485: :err_isrealservice
12
+ 287: :rpl_chanuser
13
+ 552: :err_usingsline
14
+ 486: :err_accountonly
15
+ 288: :rpl_patchhead
16
+ 553: :err_statssline
17
+ 355: :rpl_namreply_
18
+ 289: :rpl_patchcon
19
+ 290: :rpl_datastr
20
+ 285: :rpl_newhostis
@@ -0,0 +1,158 @@
1
+ ---
2
+ channel_mode:
3
+ v: :voice
4
+ k: :keylock
5
+ l: :limit
6
+ m: :moderated
7
+ b: :ban
8
+ n: :no_external_msgs
9
+ o: :oper
10
+ p: :private
11
+ s: :secret
12
+ t: :topic_lock
13
+ i: :invite_only
14
+ event:
15
+ 462: :err_alreadyregistered
16
+ 203: :rpl_traceunknown
17
+ 314: :rpl_whowasuser
18
+ 351: :rpl_version
19
+ 481: :err_noprivileges
20
+ 407: :err_toomanytargets
21
+ 444: :err_nologin
22
+ 259: :rpl_adminemail
23
+ 463: :err_nopermforhost
24
+ 204: :rpl_traceoperator
25
+ 241: :rpl_statslline
26
+ 315: :rpl_endofwho
27
+ 352: :rpl_whoreply
28
+ 482: :err_chanoprivsneeded
29
+ 445: :err_summondisabled
30
+ 371: :rpl_info
31
+ 501: :err_umodeunknownflag
32
+ 464: :err_passwdmismatch
33
+ 205: :rpl_traceuser
34
+ 242: :rpl_statsuptime
35
+ 316: :rpl_whoischanop
36
+ 353: :rpl_namreply
37
+ 483: :err_cantkillserver
38
+ 261: :rpl_tracelog
39
+ 372: :rpl_motd
40
+ 409: :err_noorigin
41
+ 446: :err_usersdisabled
42
+ 502: :err_usersdontmatch
43
+ 465: :err_yourebannedcreep
44
+ 206: :rpl_traceserver
45
+ 243: :rpl_statsoline
46
+ 317: :rpl_whoisidle
47
+ 391: :rpl_time
48
+ 373: :rpl_infostart
49
+ 466: :err_youwillbebanned
50
+ 244: :rpl_statshline
51
+ 318: :rpl_endofwhois
52
+ 392: :rpl_usersstart
53
+ 300: :rpl_none
54
+ 374: :rpl_endofinfo
55
+ 411: :err_norecipient
56
+ 467: :err_keyset
57
+ 208: :rpl_tracenewtype
58
+ 319: :rpl_whoischannels
59
+ 393: :rpl_users
60
+ 301: :rpl_away
61
+ 375: :rpl_motdstart
62
+ 412: :err_notexttosend
63
+ 394: :rpl_endofusers
64
+ 431: :err_nonicknamegiven
65
+ 302: :rpl_userhost
66
+ 376: :rpl_endofmotd
67
+ 413: :err_notoplevel
68
+ 321: :rpl_liststart
69
+ 395: :rpl_nousers
70
+ 432: :err_erroneusnickname
71
+ 303: :rpl_ison
72
+ 414: :err_wildtoplevel
73
+ 451: :err_notregistered
74
+ 322: :rpl_list
75
+ 433: :err_nicknameinuse
76
+ 211: :rpl_statslinkinfo
77
+ 341: :rpl_inviting
78
+ 471: :err_channelisfull
79
+ 212: :rpl_statscommands
80
+ 323: :rpl_listend
81
+ 231: :rpl_serviceinfo
82
+ 305: :rpl_unaway
83
+ 342: :rpl_summoning
84
+ 472: :err_unknownmode
85
+ 213: :rpl_statscline
86
+ 324: :rpl_channelmodeis
87
+ 361: :rpl_killdone
88
+ 491: :err_nooperhost
89
+ 232: :rpl_endofservices
90
+ 306: :rpl_nowaway
91
+ 473: :err_inviteonlychan
92
+ 436: :err_nickcollision
93
+ 214: :rpl_statsnline
94
+ 251: :rpl_luserclient
95
+ 362: :rpl_closing
96
+ 492: :err_noservicehost
97
+ 233: :rpl_service
98
+ 381: :rpl_youreoper
99
+ 474: :err_bannedfromchan
100
+ 215: :rpl_statsiline
101
+ 252: :rpl_luserop
102
+ 363: :rpl_closeend
103
+ 382: :rpl_rehashing
104
+ 475: :err_badchannelkey
105
+ 216: :rpl_statskline
106
+ 253: :rpl_luserunknown
107
+ 364: :rpl_links
108
+ 401: :err_nosuchnick
109
+ 217: :rpl_statsqline
110
+ 254: :rpl_luserchannels
111
+ 365: :rpl_endoflinks
112
+ 402: :err_nosuchserver
113
+ 384: :rpl_myportis
114
+ 421: :err_unknowncommand
115
+ 255: :rpl_luserme
116
+ 366: :rpl_endofnames
117
+ 403: :err_nosuchchannel
118
+ 218: :rpl_statsyline
119
+ 311: :rpl_whoisuser
120
+ 422: :err_nomotd
121
+ 200: :rpl_tracelink
122
+ 367: :rpl_banlist
123
+ 404: :err_cannotsendtochan
124
+ 441: :err_usernotinchannel
125
+ 219: :rpl_endofstats
126
+ 256: :rpl_adminme
127
+ 312: :rpl_whoisserver
128
+ 423: :err_noadmininfo
129
+ 201: :rpl_traceconnecting
130
+ 331: :rpl_notopic
131
+ 368: :rpl_endofbanlist
132
+ 405: :err_toomanychannels
133
+ 442: :err_notonchannel
134
+ 257: :rpl_adminloc1
135
+ 424: :err_fileerror
136
+ 461: :err_needmoreparams
137
+ 202: :rpl_tracehandshake
138
+ 313: :rpl_whoisoperator
139
+ 369: :rpl_endofwhowas
140
+ 406: :err_wasnosuchnick
141
+ 443: :err_useronchannel
142
+ 221: :rpl_umodeis
143
+ 258: :rpl_adminloc2
144
+ 332: :rpl_topic
145
+ user_prefix:
146
+ "@": :operator
147
+ +: :voiced
148
+ usermode:
149
+ w: :wallops
150
+ o: :global_operator
151
+ s: :server_notices
152
+ i: :invisible
153
+ channel_prefix:
154
+ "#": :network
155
+ "&": :local
156
+ privilege:
157
+ v: :voiced
158
+ o: :operator