comboy-autumn 3.1

Sign up to get free protection for your applications and to get access to all the features.
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