autumn 3.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/AUTHORS +11 -0
  2. data/CHANGELOG +567 -0
  3. data/MANIFEST +110 -0
  4. data/README +1114 -0
  5. data/README.textile +1153 -0
  6. data/Rakefile +75 -0
  7. data/autumn.gemspec +44 -0
  8. data/bin/autumn +11 -0
  9. data/lib/autumn.rb +8 -0
  10. data/lib/autumn/authentication.rb +238 -0
  11. data/lib/autumn/channel_leaf.rb +107 -0
  12. data/lib/autumn/coder.rb +166 -0
  13. data/lib/autumn/console_boot.rb +10 -0
  14. data/lib/autumn/ctcp.rb +250 -0
  15. data/lib/autumn/daemon.rb +207 -0
  16. data/lib/autumn/datamapper_hacks.rb +290 -0
  17. data/lib/autumn/foliater.rb +231 -0
  18. data/lib/autumn/formatting.rb +236 -0
  19. data/lib/autumn/generator.rb +231 -0
  20. data/lib/autumn/genesis.rb +190 -0
  21. data/lib/autumn/inheritable_attributes.rb +162 -0
  22. data/lib/autumn/leaf.rb +738 -0
  23. data/lib/autumn/log_facade.rb +49 -0
  24. data/lib/autumn/misc.rb +87 -0
  25. data/lib/autumn/resources/daemons/Anothernet.yml +3 -0
  26. data/lib/autumn/resources/daemons/AustHex.yml +29 -0
  27. data/lib/autumn/resources/daemons/Bahamut.yml +67 -0
  28. data/lib/autumn/resources/daemons/Dancer.yml +3 -0
  29. data/lib/autumn/resources/daemons/GameSurge.yml +3 -0
  30. data/lib/autumn/resources/daemons/IRCnet.yml +3 -0
  31. data/lib/autumn/resources/daemons/Ithildin.yml +7 -0
  32. data/lib/autumn/resources/daemons/KineIRCd.yml +56 -0
  33. data/lib/autumn/resources/daemons/PTlink.yml +6 -0
  34. data/lib/autumn/resources/daemons/QuakeNet.yml +20 -0
  35. data/lib/autumn/resources/daemons/RFC1459.yml +158 -0
  36. data/lib/autumn/resources/daemons/RFC2811.yml +16 -0
  37. data/lib/autumn/resources/daemons/RFC2812.yml +36 -0
  38. data/lib/autumn/resources/daemons/RatBox.yml +25 -0
  39. data/lib/autumn/resources/daemons/Ultimate.yml +24 -0
  40. data/lib/autumn/resources/daemons/Undernet.yml +6 -0
  41. data/lib/autumn/resources/daemons/Unreal.yml +110 -0
  42. data/lib/autumn/resources/daemons/_Other.yml +7 -0
  43. data/lib/autumn/resources/daemons/aircd.yml +33 -0
  44. data/lib/autumn/resources/daemons/bdq-ircd.yml +3 -0
  45. data/lib/autumn/resources/daemons/hybrid.yml +38 -0
  46. data/lib/autumn/resources/daemons/ircu.yml +67 -0
  47. data/lib/autumn/resources/daemons/tr-ircd.yml +8 -0
  48. data/lib/autumn/script.rb +74 -0
  49. data/lib/autumn/speciator.rb +165 -0
  50. data/lib/autumn/stem.rb +919 -0
  51. data/lib/autumn/stem_facade.rb +176 -0
  52. data/lib/autumn/tool/bin.rb +301 -0
  53. data/lib/autumn/tool/create.rb +48 -0
  54. data/lib/autumn/tool/project_creator.rb +110 -0
  55. data/lib/autumn/version.rb +3 -0
  56. data/lib/skel/Rakefile +163 -0
  57. data/lib/skel/config/global.yml +2 -0
  58. data/lib/skel/config/seasons/testing/database.yml +4 -0
  59. data/lib/skel/config/seasons/testing/leaves.yml +9 -0
  60. data/lib/skel/config/seasons/testing/season.yml +2 -0
  61. data/lib/skel/config/seasons/testing/stems.yml +10 -0
  62. data/lib/skel/leaves/administrator/README +20 -0
  63. data/lib/skel/leaves/administrator/controller.rb +67 -0
  64. data/lib/skel/leaves/administrator/views/autumn.txt.erb +1 -0
  65. data/lib/skel/leaves/administrator/views/reload.txt.erb +11 -0
  66. data/lib/skel/leaves/insulter/README +17 -0
  67. data/lib/skel/leaves/insulter/controller.rb +65 -0
  68. data/lib/skel/leaves/insulter/views/about.txt.erb +1 -0
  69. data/lib/skel/leaves/insulter/views/help.txt.erb +1 -0
  70. data/lib/skel/leaves/insulter/views/insult.txt.erb +1 -0
  71. data/lib/skel/leaves/scorekeeper/README +34 -0
  72. data/lib/skel/leaves/scorekeeper/config.yml +2 -0
  73. data/lib/skel/leaves/scorekeeper/controller.rb +104 -0
  74. data/lib/skel/leaves/scorekeeper/helpers/general.rb +64 -0
  75. data/lib/skel/leaves/scorekeeper/models/channel.rb +12 -0
  76. data/lib/skel/leaves/scorekeeper/models/person.rb +14 -0
  77. data/lib/skel/leaves/scorekeeper/models/pseudonym.rb +11 -0
  78. data/lib/skel/leaves/scorekeeper/models/score.rb +14 -0
  79. data/lib/skel/leaves/scorekeeper/tasks/stats.rake +17 -0
  80. data/lib/skel/leaves/scorekeeper/views/about.txt.erb +1 -0
  81. data/lib/skel/leaves/scorekeeper/views/change.txt.erb +5 -0
  82. data/lib/skel/leaves/scorekeeper/views/history.txt.erb +11 -0
  83. data/lib/skel/leaves/scorekeeper/views/points.txt.erb +5 -0
  84. data/lib/skel/leaves/scorekeeper/views/usage.txt.erb +1 -0
  85. data/lib/skel/log/README +1 -0
  86. data/lib/skel/script/console +28 -0
  87. data/lib/skel/script/destroy +48 -0
  88. data/lib/skel/script/generate +48 -0
  89. data/lib/skel/shared/README +1 -0
  90. data/lib/skel/tmp/README +1 -0
  91. data/spec/authentication_spec.rb +328 -0
  92. data/spec/channel_leaf_spec.rb +142 -0
  93. data/spec/coder_spec.rb +146 -0
  94. data/spec/ctcp_spec.rb +222 -0
  95. data/spec/daemon_spec.rb +202 -0
  96. data/spec/datamapper_hacks_spec.rb +164 -0
  97. data/tasks/authors.rake +30 -0
  98. data/tasks/changelog.rake +18 -0
  99. data/tasks/copyright.rake +21 -0
  100. data/tasks/doc.rake +7 -0
  101. data/tasks/gem.rake +23 -0
  102. data/tasks/gem_installer.rake +76 -0
  103. data/tasks/install_dependencies.rake +6 -0
  104. data/tasks/manifest.rake +4 -0
  105. data/tasks/rcov.rake +23 -0
  106. data/tasks/release.rake +52 -0
  107. data/tasks/reversion.rake +8 -0
  108. data/tasks/setup.rake +24 -0
  109. data/tasks/spec.rake +7 -0
  110. data/tasks/yard.rake +4 -0
  111. metadata +188 -0
@@ -0,0 +1,49 @@
1
+ # Defines the Autumn::LogFacade class, which makes it easier for Stems and
2
+ # Leaves to add their information to outgoing log messages.
3
+
4
+ module Autumn
5
+
6
+ # This class is a facade for Ruby's +Logger+ that adds additional information
7
+ # to log entries. LogFacade will pass any method calls onto a Logger instance,
8
+ # but reformat log entries to include an Autumn object's type and name.
9
+ #
10
+ # For example, if you wanted a LogFacade for a Leaf named "Scorekeeper", you
11
+ # could instantiate one:
12
+ #
13
+ # facade = LogFacade.new(logger, 'Leaf', 'Scorekeeper')
14
+ #
15
+ # And a call such as:
16
+ #
17
+ # facade.info "Starting up"
18
+ #
19
+ # Would be reformatted as "Scorekeeper (Leaf): Starting up".
20
+ #
21
+ # In addition, this class will log messages to STDOUT if the +debug+ global
22
+ # option is set. Instantiation of this class is handled by Genesis and should
23
+ # not normally be done by the user.
24
+
25
+ class LogFacade
26
+ # The Autumn object type (typically "Stem" or "Leaf").
27
+ attr :type
28
+ # The name of the Autumn object.
29
+ attr :name
30
+
31
+ # Creates a new facade for +logger+ that prepends type and name information
32
+ # to each log message.
33
+
34
+ def initialize(logger, type, name)
35
+ @type = type
36
+ @name = name
37
+ @logger = logger
38
+ @stdout = Speciator.instance.season(:logging) == 'debug'
39
+ end
40
+
41
+ def method_missing(meth, *args) # :nodoc:
42
+ if args.size == 1 and args.only.kind_of? String then
43
+ args = [ "#{name} (#{type}): #{args.only}" ]
44
+ end
45
+ @logger.send meth, *args
46
+ puts (args.first.kind_of?(Exception) ? (args.first.to_s + "\n" + args.first.backtrace.join("\n")) : args.first) if @stdout
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,87 @@
1
+ # Miscellaneous extra methods and objects used by Autumn, and additions to Ruby
2
+ # Core objects.
3
+
4
+ require 'thread'
5
+ require 'english/style'
6
+
7
+ class Numeric # :nodoc:
8
+
9
+ # Possibly pluralizes a noun based on this number's value. Returns this number
10
+ # and the noun as a string. This method attempts to use the Ruby English gem
11
+ # if available, and falls back on the very simple default of appending an "s"
12
+ # to the word to make it plural. If the Ruby English gem is not available, you
13
+ # can specify a custom plural form for the word. Examples:
14
+ #
15
+ # 5.pluralize('dog') #=> "5 dogs"
16
+ # 1.pluralize('car') #=> "1 car"
17
+ # 7.pluralize('mouse', 'mice') #=> "7 mice" (only necessary if Ruby English is not installed)
18
+
19
+ def pluralize(singular, plural=nil)
20
+ begin
21
+ return "#{to_s} #{self == 1 ? singular : singular.plural}"
22
+ rescue Gem::LoadError
23
+ plural ||= singular + 's'
24
+ return "#{to_s} #{(self == 1) ? singular : plural}"
25
+ end
26
+ end
27
+ end
28
+
29
+ class String # :nodoc:
30
+ include English::Style
31
+
32
+ # Returns a copy of this string with the first character dropped.
33
+
34
+ def except_first
35
+ self[1, size-1]
36
+ end
37
+ end
38
+
39
+ class Hash # :nodoc:
40
+
41
+ # Returns a hash that gives back the key if it has no value for that key.
42
+
43
+ def self.parroting(hsh={})
44
+ hsh ||= Hash.new
45
+ Hash.new { |h, k| k }.update(hsh)
46
+ end
47
+ end
48
+
49
+ # An implementation of +SizedQueue+ that, instead of blocking when the queue is
50
+ # full, simply discards the overflow, forgetting it.
51
+
52
+ class ForgetfulQueue < Queue # :nodoc:
53
+
54
+ # Creates a new sized queue.
55
+
56
+ def initialize(capacity)
57
+ @max = capacity
58
+ end
59
+
60
+ # Returns true if this queue is at maximum size.
61
+
62
+ def full?
63
+ size == @max
64
+ end
65
+
66
+ # Pushes an object onto the queue. If there is no space left on the queue,
67
+ # does nothing.
68
+
69
+ def push(obj)
70
+ Thread.exclusive { super unless full? }
71
+ end
72
+ alias_method :<<, :push
73
+ alias_method :enq, :push
74
+ end
75
+
76
+ # Adds the only method to Set.
77
+
78
+ class Set # :nodoc:
79
+
80
+ # Returns the only element of a one-element set. Raises an exception if there
81
+ # isn't exactly one element in the set.
82
+
83
+ def only
84
+ raise IndexError, "Set#only called on non-single-element set" unless size == 1
85
+ to_a.first
86
+ end
87
+ 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