2008年 01月 28日

wikiforme の (だいたい) 最小の syntax 定義と部分編集

セクション編集ができる wiki がほしいなぁとおもって wikiforme だとどうなんかなぁと思いつつ、syntax 定義をもぞもぞ書く (内部でどういう構造になってるのかよくわからないのでためしに)

HTML のセクションから、ソースのその範囲を取得できればいいのだから、トップレベルのセクションを列挙して、番号をふり (直接ふらなくてもいいけど)、それがソースではどの範囲にあたるかをとれればいい。行番号は parse した直後のやつには含まれているけど、それを保存して、構造化 HTML をはく process はないみたいなので自分で書くしかない。


とおもいながら書いていたのだけど、process で行番号がとれないことに気付いた。行番号はエラー表示のためだけにあるみたいだ (assemble.rb L42 あたり)。なおそうと思うと結構広範囲に影響しそうでやりにくい。のでとりあえずやめた。

#!/usr/bin/env ruby

require "pp"

$LOAD_PATH << "core"

require "wikiforme"

wikiforme = WikiForme.new("foobar.4me")

array =  wikiforme.parse(DATA)

params    = {}
root      = :page
root_text = "test"

pp array

p array.assemble(params, root, root_text).process(:html)

__END__
** Foobar

aaa

** Baz

bbb
# foobar.4me/foobar.rb

Format.block :page  do
	contain        :section
	module_eval do
		def process_html
			@children
		end
	end
end

Format.block :section do
	default_syntax "**"
	contain        :@contents, :@blank
	module_eval do
		def preprocess
			super
		end

		def process_html
			p self
			XML[
				:div, {:class => "section"},
					[:div, {:class => "heading"}, @text.process],
					@children
			]
		end
	end
end

Format.block :blank do
	default_syntax :blank
	group          :@blank
	module_eval do
		def process_html
			""
		end
	end
end

Format.block :paragraph do
	group          :@contents
	default_syntax :text
	module_eval do
		def process_html
			XML[:p, @text.process]
		end
	end
end

勝手にブロック引数とって DSL っぽく書けるようにした。(検索しにくくなるのであんまりファイルわけたくない。ファイルわけないとなるとインデントして定義の範囲を明確にしたい。)

Ruby. サブクラスでの定数の再定義

class Foo
	AAA   = "aaa"
	@@foo = "aaa"
	@foo  = "aaa"

	def aaa
		"aaa"
	end

	def c
		AAA
	end

	def cv
		@@foo
	end

	def iv
		self.class.instance_variable_get(:@foo)
	end

	def cg
		self.class.const_get(:AAA)
	end

	def m
		aaa
	end
end

class Bar < Foo
	AAA   = "bbb"
	@@foo = "bbb"
	@foo  = "bbb"

	def aaa
		"bbb"
	end
end

puts
p Foo.new.c  #=> "aaa"
p Bar.new.c  #=> "aaa"

puts
p Foo.new.cv #=> "bbb"
p Bar.new.cv #=> "bbb"

puts
p Foo.new.iv #=> "aaa"
p Bar.new.iv #=> "bbb"

puts
p Foo.new.cg #=> "aaa"
p Bar.new.cg #=> "bbb"

puts
p Foo.new.m  #=> "aaa"
p Bar.new.m  #=> "bbb"

なんか勘違いしてた……クラス変数はサブクラスでうわがきしてもスーパークラスに影響はないとおもってた。

RSpec

RSpec つかうときは、同じようなテストも全部コピペしてずらずら書いたほうがよみやすい (謎のデータ構造がならぶよりはコピペのほうがマシ)

ustream

フォントサイズ 33 でやっとよめる……(全画面にしたターミナルをきりぬいて)

2008年 01月 26日

irc

irc ライブラリをかく -> chokan の設計みなおす

2008年 01月 25日

lig.rb

Linger の IRC gateway を Ruby でかきました。

  • 部屋に入れる (パスワードつきの部屋にも入れる)
  • 発言できる

だけです。

  • チャンネル名は URL の末尾のやつ (チャンネルの名前ではない)
  • leave しないで放置して繋ぎなおすと、いっぱいメッセージが流れるかもしれないですが処理していません。
  • 部屋の nick がそのまま IRC の nick として流れます。なのでクライアントが u8 の nick を処理できないと死にます。

Ruby のライブラリが一応公開されていたのでそれつかっています。http://svn.lingr.com/api/toolkits/ruby/infoteria/api_client.rb

chokan の rice/irc が必要です。

$ mkdir lig
$ cd lig
$ svn export http://svn.coderepos.org/share/lang/ruby/chokan/trunk/rice/
$ wget http://svn.lingr.com/api/toolkits/ruby/infoteria/api_client.rb
$ wget http://svn.coderepos.org/share/lang/ruby/misc/lig.rb

今は net-irc gem の一部になっています。HEAD をかなり頻繁に更新しているので

$ svn co http://svn.coderepos.org/share/lang/ruby/net-irc/trunk/ net-irc
$ ruby examples/lig.rb --help

してください


tiarra の設定例

lingr {
	host: localhost
	port: 16669
	name: username@example.com
	password: password on lingr
	in-encoding: utf8
	out-encoding: utf8
}

haskell_hackathon_2008 を IRC から見たかったのでつくりました。最初は http://search.cpan.org/src/MIYAGAWA/POE-Component-Client-Lingr-0.04/eg/lingr-ircd.pl を使おう/いじってみようとおもったのですが、せっかくなので Lingr の API をさわってみた感じです。

rice をもとにして IRC サーバをもっと簡単にかくライブラリを書いて gem にするとよさそうかもしれない。あんまソース綺麗じゃないしなぁ (てきとうに書いたわりにそこそこ安定してる)

なんかうんこみたいなバグがいっぱいあったのでたくさんなおしました。日記書くとバグがみつかる

Lingr めも

セッションは同じアカウントでも完全別々にはれる。lig.rb で接続しっぱで Web から見てもきられないし、occupant_id も違う。でも完全に別人として扱われるわけではなく、chatters では重複しないようになってる (よくわからない。occupant_id で判断しているんじゃないのか)

あ、user_id ってのが別にあった。occupant_id は anonymous でも絶対にあるけど、user_id はない。

Y

Y コンビネータが今の僕には理解できない。

JSDeferred の parallel が直接繋げられない理由

http://void.heteml.jp/blog/archives/2008/01/asdeferred.html ASDeferred !

parallel に直接つなげられない理由をとりあえず書いておきます。(ASDeferred での回避法はちゃんと読んでない><)

まずそもそも

next(function ..).
wait(1).
next(function ..);

みたいなときの wait(1) は

next(function ..).
next(function () {
    return wait(1);
}).
next(function ..);

を簡単に書くためだけにあります。でもこの二つには決定的な違いがあって、それは wait(..) の引数の評価タイミングです。wait みたいに引数がいつ評価してもかわらないようなのならいいのですが、parallel みたいなのだと困ります。(wait でも、変数を書いて、非同期にその値を書きかえる、っていう場合は同じように問題でてきます)

next(function () {
	alert(0);
	return wait(3).next(function () {
		alert(1);
	});
}).
next(function () {
	return parallel({
		foo: wait(1).next(function () { alert(2) }),
		bar: wait(2).next(function () { alert(3) })
	});
}).
next(function (results) {
	alert(4);
});

これは正しく 0, 1, 2, 3, 4 と表示されますが、

Deferred.register("parallel", parallel);

next(function () {
	alert(0);
	return wait(3).next(function () {
		alert(1);
	});
}).
parallel({
	foo: wait(1).next(function () { alert(2) }),
	bar: wait(2).next(function () { alert(3) })
}).
next(function (results) {
	alert(4);
});

これは parallel の引数の wait(1) と wait(2) が、最初の next() とかと同時に評価されるので、順がくずれ 0, 2, 3, 1 になります。(4 もよばれないけど、あとから継続をセットしてもよばないせい。変えようか迷ってるけど変えてない)


でもって、あんまり深く考えず、next().wait().next() みたいに書くのはあくまで速記法だから parallel はなくてイイヤーってのが今の状態です><

ちなみに call() の速記版がないのは、もともと prototype.call があるので名前に困ってつけてないだけです (この二つは全然ちがうものです)。

2008年 01月 22日

freenode の ChanServ

access #*** add <nick> 10

<cho45> level #*** list
-ChanServ@fn(ChanServ@services.)- -- Access Levels for [#***] --
-ChanServ@fn(ChanServ@services.)- Index Level Type      Description
-ChanServ@fn(ChanServ@services.)- ----- ----- ----      -----------
-ChanServ@fn(ChanServ@services.)- 1     -1    AUTODEOP  Automatic deop/devoice
-ChanServ@fn(ChanServ@services.)- 2     OFF   AUTOVOICE Automatic voice
-ChanServ@fn(ChanServ@services.)- 3     8     CMDVOICE  Use of command VOICE
-ChanServ@fn(ChanServ@services.)- 4     30    ACCESS    Allow ACCESS modification
-ChanServ@fn(ChanServ@services.)- 5     5     CMDINVITE Use of command INVITE
-ChanServ@fn(ChanServ@services.)- 6     30    AUTOOP    Automatic op
-ChanServ@fn(ChanServ@services.)- 7     10    CMDOP     Use of command OP
-ChanServ@fn(ChanServ@services.)- 8     10    CMDUNBAN  Use of command UNBAN
-ChanServ@fn(ChanServ@services.)- 9     15    AUTOKICK  Allow AKICK modification
-ChanServ@fn(ChanServ@services.)- 10    20    CMDCLEAR  Use of command CLEAR
-ChanServ@fn(ChanServ@services.)- 11    25    SET       Modify channel SETs
-ChanServ@fn(ChanServ@services.)- 14    10    TOPIC     Change the channel topic
-ChanServ@fn(ChanServ@services.)- 15    50    LEVEL     Use of command LEVEL
-ChanServ@fn(ChanServ@services.)- -- End of list --

を ChanServ に送ると指定 nick をチャンネルのアクセスリストに加えられる。30 とかやると autoop になる?
一定以上の level は contact じゃないと設定できない 。contact の nick でログインし NickServ で identify していても、 ChanServ に identify しないとだめ。現在の自分の level 未満しか設定できないっぽい。contact は level 50 みたいで、49 までしか設定できない (すなわち 50 になるためには contact にならないといけない?)。help すると mask を設定すると書いてあるけど、http://freenode.net/using_the_network.shtml では registered nick を指定するように書いてある。

デフォルトだと split したあとに level 0 のユーザ (access list にないユーザ) は deop される。


ある nick が登録されているかどうかは /msg NickServ info nick すればいいみたいだ。登録されてない nick を access list に入れるとどうなるんだろう。 Nick [fagaslgol] is not registered みたいにおこられた。


以下ヘルプ転載 (これまとめてあるのどこにあるんだろ……)
ChanServ

<cho45> help
-ChanServ@fn(ChanServ@services.)- ChanServ allows you to register and control various
-ChanServ@fn(ChanServ@services.)- aspects of channels.  ChanServ can often prevent
-ChanServ@fn(ChanServ@services.)- malicious users from "taking over" channels by limiting
-ChanServ@fn(ChanServ@services.)- who is allowed channel operator priviliges.  Any channel
-ChanServ@fn(ChanServ@services.)- which is not used for 120 days will be expired and may
-ChanServ@fn(ChanServ@services.)- be dropped.  ChanServ's commands are listed below.
-ChanServ@fn(ChanServ@services.)- For more information on a specific command, type
-ChanServ@fn(ChanServ@services.)- /msg ChanServ help <command>.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)-     REGISTER   Register a channel
-ChanServ@fn(ChanServ@services.)-     DROP       Cancel the registration of a channel
-ChanServ@fn(ChanServ@services.)-     IDENTIFY   Identify yourself with your password
-ChanServ@fn(ChanServ@services.)-     SET        Set various channel options
-ChanServ@fn(ChanServ@services.)-     ACCESS     Modify the list of privileged users
-ChanServ@fn(ChanServ@services.)-     AUTOREM    Maintain the AutoRemove list
-ChanServ@fn(ChanServ@services.)-     LEVEL      Change the level required for functions
-ChanServ@fn(ChanServ@services.)-     LIST       Display list of channels matching a pattern
-ChanServ@fn(ChanServ@services.)-     INFO       Display information for a channel
-ChanServ@fn(ChanServ@services.)-     GETKEY     Retrieve the key (+k) to a channel
-ChanServ@fn(ChanServ@services.)-     INVITE     Invite yourself to a channel
-ChanServ@fn(ChanServ@services.)-     OP         Op yourself on a channel
-ChanServ@fn(ChanServ@services.)-     VOICE      Voice yourself on a channel
-ChanServ@fn(ChanServ@services.)-     UNBAN      Unban yourself on a channel
-ChanServ@fn(ChanServ@services.)-     CLEAR      Clear various channel modes
<cho45> help register
-ChanServ@fn(ChanServ@services.)- Syntax: REGISTER <channel> [password]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Registers <channel> in ChanServ's database.  [password] is
-ChanServ@fn(ChanServ@services.)- used via ChanServ IDENTIFY to identify the channel contact
-ChanServ@fn(ChanServ@services.)- for some functions. If no password is specified, only
-ChanServ@fn(ChanServ@services.)- the channel contact nick can use ChanServ IDENTIFY.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Guidelines for running a freenode channel are found here:
-ChanServ@fn(ChanServ@services.)- http://freenode.net/channel_guidelines.shtml Pick someone
-ChanServ@fn(ChanServ@services.)- to register your project channel who is around frequently. 
-ChanServ@fn(ChanServ@services.)- If your channel contact's nick expires,
-ChanServ@fn(ChanServ@services.)- ChanServ will drop their channel when NickServ drops
-ChanServ@fn(ChanServ@services.)- their nick. Consider setting an ALTERNATE (/msg
-ChanServ@fn(ChanServ@services.)- ChanServ HELP SET ALTERNATE) to avoid
-ChanServ@fn(ChanServ@services.)- this situation.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Give channel staffers the ability to maintain
-ChanServ@fn(ChanServ@services.)- your channel via the ACCESS command (/msg ChanServ
-ChanServ@fn(ChanServ@services.)- HELP ACCESS).  Level '10' lets them gain ops,
-ChanServ@fn(ChanServ@services.)- voice and devoice users, etc. Try to ensure your
-ChanServ@fn(ChanServ@services.)- channel has 24-hour coverage.  Staffers should
-ChanServ@fn(ChanServ@services.)- IDENTIFY to NickServ so that their nicks don't expire,
-ChanServ@fn(ChanServ@services.)- and so that ChanServ will recognize them.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- If no one on a channel's ACCESS list enters the
-ChanServ@fn(ChanServ@services.)- channel within 120 days, the channel will be
-ChanServ@fn(ChanServ@services.)- considered expired and may be dropped.
<cho45> help drop
-ChanServ@fn(ChanServ@services.)- Syntax: DROP <channel> [password]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Cancels the registration of <channel>.  Only a
-ChanServ@fn(ChanServ@services.)- channel contact may DROP a channel.  Also,
-ChanServ@fn(ChanServ@services.)- the contact must IDENTIFY before using this
-ChanServ@fn(ChanServ@services.)- command, or supply the correct channel password.
<cho45> help identify
-ChanServ@fn(ChanServ@services.)- Syntax: IDENTIFY <channel> [password]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Identifies you as the channel contact for <channel>. 
-ChanServ@fn(ChanServ@services.)- Some ChanServ commands require that you IDENTIFY before
-ChanServ@fn(ChanServ@services.)- using them.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- If you are the contact (your master nick is equal to
-ChanServ@fn(ChanServ@services.)- the stored contact nick), you need not use the channel
-ChanServ@fn(ChanServ@services.)- password, otherwise you have to. If there is no channel
-ChanServ@fn(ChanServ@services.)- password, only the contact nick can use this command.
<cho45> help set
-ChanServ@fn(ChanServ@services.)- Syntax: SET <channel> <option> [parameters]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Allows the channel contact or level 25 to set various
-ChanServ@fn(ChanServ@services.)- channel options and other information. All options may
-ChanServ@fn(ChanServ@services.)- be abbreviated, such as:
-ChanServ@fn(ChanServ@services.)- /msg ChanServ set #channel CONT newcontact
-ChanServ@fn(ChanServ@services.)- to set the CONTACT nickname to "newcontact".  For more
-ChanServ@fn(ChanServ@services.)- specific information on each option, type:
-ChanServ@fn(ChanServ@services.)- /msg ChanServ HELP SET <option>
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Available options:
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)-     CONTACT     Set the contact of a channel (contact)
-ChanServ@fn(ChanServ@services.)-     ALTERNATE   Set the alternate contact for the channel
-ChanServ@fn(ChanServ@services.)-     PASSWORD    Set the contact password (contact)
-ChanServ@fn(ChanServ@services.)-     MLOCK       Lock channel modes on or off
-ChanServ@fn(ChanServ@services.)-     TOPICLOCK   Restrict topic changes
-ChanServ@fn(ChanServ@services.)-     PRIVATE     Hide channel from ChanServ lists
-ChanServ@fn(ChanServ@services.)-     SECUREOPS   Stricter control of chanop status
-ChanServ@fn(ChanServ@services.)-     SECURE      Activate ChanServ security features
-ChanServ@fn(ChanServ@services.)-     ENTRYMSG    Send a message to users upon entry
-ChanServ@fn(ChanServ@services.)-     EMAIL       Set the channel email address
-ChanServ@fn(ChanServ@services.)-     URL         Set the channel url
-ChanServ@fn(ChanServ@services.)-     GUARD       Have ChanServ join your channel
-ChanServ@fn(ChanServ@services.)-     SPLITOPS    Let anyone keep ops from a netsplit
-ChanServ@fn(ChanServ@services.)-     VERBOSE     Notify chanops on access changes
<cho45> help access
-ChanServ@fn(ChanServ@services.)- Syntax: ACCESS <channel> ADD <mask> <level>
-ChanServ@fn(ChanServ@services.)-         ACCESS <channel> DEL <mask | index>
-ChanServ@fn(ChanServ@services.)-         ACCESS <channel> LIST [mask]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Maintains the channel access list for <channel>.
-ChanServ@fn(ChanServ@services.)- Users matching a hostmask on the access list will
-ChanServ@fn(ChanServ@services.)- have access to various ChanServ commands depending on
-ChanServ@fn(ChanServ@services.)- what level they have (/msg ChanServ HELP LEVEL for
-ChanServ@fn(ChanServ@services.)- how to view and change the level required for each
-ChanServ@fn(ChanServ@services.)- command).  Anyone not on the channel's access list
-ChanServ@fn(ChanServ@services.)- has a default access level of 0.  You may type:
-ChanServ@fn(ChanServ@services.)- /msg ChanServ HELP ACCESS {ADD|DEL|LIST} for more
-ChanServ@fn(ChanServ@services.)- specific information on each command.
<cho45> help autorem
-ChanServ@fn(ChanServ@services.)- Syntax: AUTOREM <channel> ADD <mask> [reason]
-ChanServ@fn(ChanServ@services.)-         AUTOREM <channel> DEL <mask | index>
-ChanServ@fn(ChanServ@services.)-         AUTOREM <channel> LIST [mask]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Maintains the channel autoremove list for <channel>.
-ChanServ@fn(ChanServ@services.)- If a user on the autoremove list attempts to join the
-ChanServ@fn(ChanServ@services.)- channel, ChanServ will ban/remove the user.
-ChanServ@fn(ChanServ@services.)- /msg ChanServ HELP AUTOREM {ADD|DEL|LIST} for more
-ChanServ@fn(ChanServ@services.)- specific information on each command.
<cho45> help level
-ChanServ@fn(ChanServ@services.)- Syntax: LEVEL <channel> SET <type|index> <level>
-ChanServ@fn(ChanServ@services.)-         LEVEL <channel> RESET <type|index|ALL>
-ChanServ@fn(ChanServ@services.)-         LEVEL <channel> LIST
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Changes the access level required to be able to execute
-ChanServ@fn(ChanServ@services.)- certain commands.  This allows the channel contact to be
-ChanServ@fn(ChanServ@services.)- able to customize the access level list to the needs of
-ChanServ@fn(ChanServ@services.)- the channel.  For more specific help on each command,
-ChanServ@fn(ChanServ@services.)- type: /msg ChanServ HELP LEVEL {SET|RESET|LIST}
<cho45> help list
-ChanServ@fn(ChanServ@services.)- Syntax: LIST <pattern>
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Lists all registered channels that match <pattern>.
-ChanServ@fn(ChanServ@services.)- Channels that have SET PRIVATE ON, will not be
-ChanServ@fn(ChanServ@services.)- displayed.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Example: LIST #*bleh*
-ChanServ@fn(ChanServ@services.)-            Lists all channels that contain bleh
<cho45> help info
-ChanServ@fn(ChanServ@services.)- Syntax: INFO <channel>
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Displays information for <channel>, including channel
-ChanServ@fn(ChanServ@services.)- contact, time of registration, topic, and mode lock, if
-ChanServ@fn(ChanServ@services.)- any.
<cho45> help getkey
-ChanServ@fn(ChanServ@services.)- Syntax: GETKEY <channel>
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Returns the key to <channel>.  Useful if the channel
-ChanServ@fn(ChanServ@services.)- is set +k.
<cho45> help invite
-ChanServ@fn(ChanServ@services.)- Syntax: INVITE <channel>
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Invites the sender to <channel>.  Useful if SET MLOCK
-ChanServ@fn(ChanServ@services.)- is set to +i on the channel.
-ChanServ@fn(ChanServ@services.)- Example:
-ChanServ@fn(ChanServ@services.)-         /msg ChanServ INVITE #channel
-ChanServ@fn(ChanServ@services.)-           ChanServ will invite you to #channel.
<cho45> help op
-ChanServ@fn(ChanServ@services.)- Syntax: OP <channel | ALL> [nicknames]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Gives channel operator status to [nicknames].  If no
-ChanServ@fn(ChanServ@services.)- nicknames are specified, ChanServ will op the nick who gave
-ChanServ@fn(ChanServ@services.)- the command.  Placing a - in front of a nick will
-ChanServ@fn(ChanServ@services.)- deop that nick.  If SECUREOPS is ON, ChanServ will not
-ChanServ@fn(ChanServ@services.)- op nicks who do not have a level of CmdOp or higher.
-ChanServ@fn(ChanServ@services.)- Examples:
-ChanServ@fn(ChanServ@services.)-          /msg ChanServ OP #channel
-ChanServ@fn(ChanServ@services.)-            Ops the nick who gave the command on #channel.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)-          /msg ChanServ OP #channel nick1 -nick2 nick3
-ChanServ@fn(ChanServ@services.)-            Ops nick1 and nick3, but deops nick2 on #channel.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)-          /msg ChanServ OP ALL
-ChanServ@fn(ChanServ@services.)-            Ops you in all channels you are currently in, if
-ChanServ@fn(ChanServ@services.)-           you have CMDOP access.
<cho45> help voice
-ChanServ@fn(ChanServ@services.)- Syntax: VOICE <channel> [nicknames]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Gives voice status to [nicknames].  If no nicknames
-ChanServ@fn(ChanServ@services.)- are specified, ChanServ will voice the nick who gave the 
-ChanServ@fn(ChanServ@services.)- command.  Placing a - in front of a nick will
-ChanServ@fn(ChanServ@services.)- devoice that nick.
-ChanServ@fn(ChanServ@services.)- ChanServ will refuse to voice an user who is on the access
-ChanServ@fn(ChanServ@services.)- list as autodevoiced. To disable this, prefix the nick
-ChanServ@fn(ChanServ@services.)- with a +.
-ChanServ@fn(ChanServ@services.)- Examples:
-ChanServ@fn(ChanServ@services.)-          /msg ChanServ VOICE #channel
-ChanServ@fn(ChanServ@services.)-            Voices the nick who gave the command on #channel.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)-          /msg ChanServ VOICE #channel nick1 -nick2 +nick3
-ChanServ@fn(ChanServ@services.)-            Voices nick1, nick3 even if autodevoiced,
-ChanServ@fn(ChanServ@services.)-            but devoices nick2 on #channel.
<cho45> help unban
-ChanServ@fn(ChanServ@services.)- Syntax: UNBAN <channel> [ALL]
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Unbans every ban matching your user@host or user@ip and
-ChanServ@fn(ChanServ@services.)- every gecos ban matching your ircname on <channel>. If
-ChanServ@fn(ChanServ@services.)- you specify ALL, every ban and gecos ban on <channel>
-ChanServ@fn(ChanServ@services.)- will be cleared. You must have CMDCLEAR access to
-ChanServ@fn(ChanServ@services.)- <channel> to use the ALL option.
-ChanServ@fn(ChanServ@services.)- Examples:
-ChanServ@fn(ChanServ@services.)-          /msg ChanServ UNBAN #channel
-ChanServ@fn(ChanServ@services.)-             Clears every ban on #channel matching you
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)-          /msg ChanServ UNBAN #channel ALL
-ChanServ@fn(ChanServ@services.)-             Clears every ban on #channel.
<cho45> help clear
-ChanServ@fn(ChanServ@services.)- Syntax: CLEAR <channel> <option>
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- ChanServ will clear certain channel modes depending on
-ChanServ@fn(ChanServ@services.)- <option>.
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)- Options:
-ChanServ@fn(ChanServ@services.)- 
-ChanServ@fn(ChanServ@services.)-      OPS       - Deops every channel op
-ChanServ@fn(ChanServ@services.)-      VOICES    - Devoices every voiced user
-ChanServ@fn(ChanServ@services.)-      MODES     - Clears all channel modes
-ChanServ@fn(ChanServ@services.)-      BANS      - Removes all channel bans
-ChanServ@fn(ChanServ@services.)-      GECOSBANS - Remove all channel gecos bans
-ChanServ@fn(ChanServ@services.)-      USERS     - Removes all users from channel
-ChanServ@fn(ChanServ@services.)-      ALL       - Combination of OPS, VOICES, MODES,
-ChanServ@fn(ChanServ@services.)-                      and BANS (does not remove users)

NichServ

<cho45> help
-NickServ@fn(NickServ@services.)- NickServ allows you to "register" a nickname and
-NickServ@fn(NickServ@services.)- prevent others from using it. The following
-NickServ@fn(NickServ@services.)- commands allow for registration and maintenance of
-NickServ@fn(NickServ@services.)- nicknames; to use them, type /msg NickServ <command>.
-NickServ@fn(NickServ@services.)- For more information on a specific command, type
-NickServ@fn(NickServ@services.)- /msg NickServ help <command>.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)-     REGISTER   Register a nickname
-NickServ@fn(NickServ@services.)-     DROP       Cancel the registration of a nickname
-NickServ@fn(NickServ@services.)-     IDENTIFY   Identify yourself with your password
-NickServ@fn(NickServ@services.)-     ACCESS     Modify the list of authorized addresses
-NickServ@fn(NickServ@services.)-     SET        Set various options for your nickname
-NickServ@fn(NickServ@services.)-     LIST       Display list of nicks matching a pattern
-NickServ@fn(NickServ@services.)-     RECOVER    Kill another user who has taken your nick
-NickServ@fn(NickServ@services.)-     RELEASE    Regain custody of your nick after RECOVER
-NickServ@fn(NickServ@services.)-     GHOST      Kill a ghosted nickname
-NickServ@fn(NickServ@services.)-     INFO       Get information for a nickname
-NickServ@fn(NickServ@services.)-     LINK       Link your nickname to another
-NickServ@fn(NickServ@services.)-     UNLINK     UnLink your nickname
<cho45> help register
-NickServ@fn(NickServ@services.)- Syntax: REGISTER <password>
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- This enables you to register your nickname with a
-NickServ@fn(NickServ@services.)- password so only you can use it.  Please try to
-NickServ@fn(NickServ@services.)- use obscure passwords that cannot be easily guessed.
-NickServ@fn(NickServ@services.)- Passwords *ARE* case sensitive.  Once you have
-NickServ@fn(NickServ@services.)- registered a nickname, you can use the SET and
-NickServ@fn(NickServ@services.)- ACCESS commands to configure it.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Please IDENTIFY yourself to nickserv when you
-NickServ@fn(NickServ@services.)- connect to the network. Many clients will allow you
-NickServ@fn(NickServ@services.)- to automate this function.  If you don't IDENTIFY
-NickServ@fn(NickServ@services.)- to NickServ for a period of 60 days or more, your
-NickServ@fn(NickServ@services.)- nickname will be considered to be expired and it
-NickServ@fn(NickServ@services.)- may be dropped.
<cho45> help drop
-NickServ@fn(NickServ@services.)- Syntax: DROP <nickname> <password>
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- DROP allows you to cancel the registration of your
-NickServ@fn(NickServ@services.)- nickname, thus allowing others to re-register it.
<cho45> help identify
-NickServ@fn(NickServ@services.)- Syntax: IDENTIFY <password>
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Most commands require that you identify yourself, in order to
-NickServ@fn(NickServ@services.)- use them.  Also, nicknames which have kill protection will
-NickServ@fn(NickServ@services.)- be killed if the user has not identified within one minute.
-NickServ@fn(NickServ@services.)- If SET AUTOMASK is ON, and you IDENTIFY from a host
-NickServ@fn(NickServ@services.)- which is not on your ACCESS list, the new hostmask will
-NickServ@fn(NickServ@services.)- automatically be added to it.
<cho45> help access
-NickServ@fn(NickServ@services.)- Syntax: ACCESS {ADD|DEL|LIST} [mask]
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- The ACCESS command allows you to modify the list of
-NickServ@fn(NickServ@services.)- recognized hostmasks for your nickname.  If you use a
-NickServ@fn(NickServ@services.)- hostmask that is not on your ACCESS list, you must
-NickServ@fn(NickServ@services.)- IDENTIFY with NickServ.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Examples:
-NickServ@fn(NickServ@services.)-     ACCESS ADD *wnder@*underworld.net
-NickServ@fn(NickServ@services.)-        Gives users matching *wnder@*underworld.net
-NickServ@fn(NickServ@services.)-        permission to use your nickname.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)-     ACCESS DEL *wnder@*underworld.net
-NickServ@fn(NickServ@services.)-        Opposite of previous command.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)-     ACCESS LIST
-NickServ@fn(NickServ@services.)-        Displays list of authorized hostmasks for your
-NickServ@fn(NickServ@services.)-        nickname.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Type: /msg NickServ HELP ACCESS <option> for more information
<cho45> help set
-NickServ@fn(NickServ@services.)- Syntax: SET <option> [parameters]
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Configures various nickname options.
-NickServ@fn(NickServ@services.)- Options:
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)-     KILL       Turn kill protection on or off
-NickServ@fn(NickServ@services.)-     AUTOMASK   Auto add new hostmasks on IDENTIFY
-NickServ@fn(NickServ@services.)-     PASSWORD   Reset your nickname password
-NickServ@fn(NickServ@services.)-     SECURE     Turn nickname security on or off
-NickServ@fn(NickServ@services.)-     UNSECURE   Set nickname security very low
-NickServ@fn(NickServ@services.)-     PRIVATE    Hide nickname information from LISTs
-NickServ@fn(NickServ@services.)-     MEMOS      Allow memos sent to your nick
-NickServ@fn(NickServ@services.)-     NOTIFY     Turn notification of new memos on/off
-NickServ@fn(NickServ@services.)-     SIGNON     Turn notification of memos on signon on/off
-NickServ@fn(NickServ@services.)-     EMAIL      Associate an email address with your nick
-NickServ@fn(NickServ@services.)-     URL        Associate a url with your nick
-NickServ@fn(NickServ@services.)-     HIDE       Hide information in your INFO reply
-NickServ@fn(NickServ@services.)-     UIN        Set ICQ UIN for this user
-NickServ@fn(NickServ@services.)-     GSM        Set number of mobile phone for this user
-NickServ@fn(NickServ@services.)-     PHONE      Set the phone for this user
-NickServ@fn(NickServ@services.)-     UNFILTERED Allow messages from unregistered users
-NickServ@fn(NickServ@services.)-     MASTER     Reset the master nickname for your link
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Type /msg NickServ HELP SET option for more information
-NickServ@fn(NickServ@services.)- on a specific option.
<cho45> help list
-NickServ@fn(NickServ@services.)- Syntax: LIST <pattern>
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Lists all registered nicknames that match <pattern>.
-NickServ@fn(NickServ@services.)- Nicknames that have SET PRIVATE ON, will not be
-NickServ@fn(NickServ@services.)- displayed.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Example: LIST *nick*
-NickServ@fn(NickServ@services.)-            Lists all nicknames that contain nick
<cho45> help recover
-NickServ@fn(NickServ@services.)- Syntax: RECOVER <nickname> [password]
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- If someone has stolen your nickname, you can use
-NickServ@fn(NickServ@services.)- RECOVER to get it back.  RECOVER performs
-NickServ@fn(NickServ@services.)- a nick collide on <nickname> and enforces the
-NickServ@fn(NickServ@services.)- nickname until you use the RELEASE command on
-NickServ@fn(NickServ@services.)- it, or just wait until the release timeout.  If
-NickServ@fn(NickServ@services.)- you match a hostmask on <nickname>'s ACCESS
-NickServ@fn(NickServ@services.)- list, and <nickname> has NOT SET SECURE ON,
-NickServ@fn(NickServ@services.)- or if you are identified to a linked nickname,
-NickServ@fn(NickServ@services.)- you do not need to supply a password.
-NickServ@fn(NickServ@services.)- Otherwise, you have to supply the correct
-NickServ@fn(NickServ@services.)- password.
<cho45> help release
-NickServ@fn(NickServ@services.)- Syntax: RELEASE <nickname> [password]
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- If NickServ is enforcing your nickname, as it would
-NickServ@fn(NickServ@services.)- after a RECOVER or if you didn't IDENTIFY
-NickServ@fn(NickServ@services.)- in time, you can use RELEASE to regain control
-NickServ@fn(NickServ@services.)- of your nickname.  If you match a hostmask on
-NickServ@fn(NickServ@services.)- <nickname>'s ACCESS list, and <nickname>'s
-NickServ@fn(NickServ@services.)- SET SECURE is OFF, or if you are
-NickServ@fn(NickServ@services.)- identified to a linked nickname, you do not
-NickServ@fn(NickServ@services.)- need to supply a password.  Otherwise, you
-NickServ@fn(NickServ@services.)- have to supply the correct password.
<cho45> help ghost
-NickServ@fn(NickServ@services.)- Syntax: GHOST <nickname> [password]
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- If you suddenly get disconnected from your isp or
-NickServ@fn(NickServ@services.)- the irc server, sometimes a ghosted client will
-NickServ@fn(NickServ@services.)- be left behind.  This command can be used to
-NickServ@fn(NickServ@services.)- kill the ghosted client so you can get your
-NickServ@fn(NickServ@services.)- nickname back.  If <nickname> has SET SECURE
-NickServ@fn(NickServ@services.)- OFF, and you match a hostmask on <nickname>'s
-NickServ@fn(NickServ@services.)- ACCESS LIST, or if you are identified to a linked
-NickServ@fn(NickServ@services.)- nickname, you do not need to supply a password.
-NickServ@fn(NickServ@services.)- Otherwise, you have to supply the correct
-NickServ@fn(NickServ@services.)- password.
<cho45> help info
-NickServ@fn(NickServ@services.)- Syntax: INFO <nickname>
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Displays information for <nickname> such as time registered,
-NickServ@fn(NickServ@services.)- SET options, whether they are online, etc.
<cho45> help link
-NickServ@fn(NickServ@services.)- Syntax: LINK <nickname> <password>
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- This command will link your current nickname to
-NickServ@fn(NickServ@services.)- <nickname>, assuming you have supplied the correct
-NickServ@fn(NickServ@services.)- password for <nickname>. Once you have linked nicknames,
-NickServ@fn(NickServ@services.)- your ACCESS list will be deleted, and you will share
-NickServ@fn(NickServ@services.)- <nickname>'s access list. Your memos will also be added
-NickServ@fn(NickServ@services.)- to <nickname>'s memos. Your channel access will be merged
-NickServ@fn(NickServ@services.)- with <nickname>'s access. If <nickname> was previously
-NickServ@fn(NickServ@services.)- unlinked, it will become the master nickname for your
-NickServ@fn(NickServ@services.)- link.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- When any nickname in your link gives a command to services,
-NickServ@fn(NickServ@services.)- it will be processed as if it came from the master nickname,
-NickServ@fn(NickServ@services.)- with the exception of DROP, UNLINK, SET PASSWORD,
-NickServ@fn(NickServ@services.)- SET EMAIL, and SET URL.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- The advantage of linked nicknames is whenever you
-NickServ@fn(NickServ@services.)- IDENTIFY for one nick, you will be identified for
-NickServ@fn(NickServ@services.)- every nick in the link. Also, memos sent to any nickname
-NickServ@fn(NickServ@services.)- will all be stored in the master nickname's record, for
-NickServ@fn(NickServ@services.)- any nickname in the link to read. Furthermore, if any
-NickServ@fn(NickServ@services.)- nickname in the link is on a channel's access list, all
-NickServ@fn(NickServ@services.)- nicknames will receive the same access. Also, all
-NickServ@fn(NickServ@services.)- linked nicknames have the same cloak.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Example:
-NickServ@fn(NickServ@services.)-         /msg NickServ LINK CoolGuy CoolGuysPassword
-NickServ@fn(NickServ@services.)-           Links your nickname to "CoolGuy".
<cho45> help unlink
-NickServ@fn(NickServ@services.)- Syntax: UNLINK [nickname [password]]
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- This command will unlink your nickname from your current
-NickServ@fn(NickServ@services.)- link. Or, if [nickname [password]] is specified, it will
-NickServ@fn(NickServ@services.)- unlink [nickname] from its current link. When you unlink,
-NickServ@fn(NickServ@services.)- the access list of the master of the link will be copied
-NickServ@fn(NickServ@services.)- to your own. Memos, however, are not copied. The channel
-NickServ@fn(NickServ@services.)- access remains with the other nicks; the unlinked nick
-NickServ@fn(NickServ@services.)- will not have any channel access. If you are unlinking
-NickServ@fn(NickServ@services.)- the master nickname, the next nickname in the link will
-NickServ@fn(NickServ@services.)- become the new master.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)- Example:
-NickServ@fn(NickServ@services.)-         /msg NickServ UNLINK
-NickServ@fn(NickServ@services.)-           Unlinks your nickname from your link.
-NickServ@fn(NickServ@services.)- 
-NickServ@fn(NickServ@services.)-         /msg NickServ UNLINK CoolGuy CoolGuysPassword
-NickServ@fn(NickServ@services.)-           Unlinks "CoolGuy" from whatever link he
-NickServ@fn(NickServ@services.)-           was in.