merged with jsimmons/master

This commit is contained in:
Jakob Ovrum 2010-07-19 07:17:38 +09:00
commit 2fe692f2ae
5 changed files with 35 additions and 19 deletions

View File

@ -1,4 +1,4 @@
--[[ --[[
Lua IRC library Lua IRC library
Copyright (c) 2010 Jakob Ovrum Copyright (c) 2010 Jakob Ovrum
@ -22,4 +22,5 @@
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.]] OTHER DEALINGS IN THE SOFTWARE.]]

View File

@ -8,6 +8,10 @@ Dependencies
* [LuaSocket](http://w3.impa.br/~diego/software/luasocket/) * [LuaSocket](http://w3.impa.br/~diego/software/luasocket/)
**Only required if you want to make use of the TLS support**
* [LuaSec](http://www.inf.puc-rio.br/~brunoos/luasec/)
Documentation Documentation
------------- -------------
Documentation can be automatically generated from the doc/irc.luadoc file, pre-generated documentation can be found in the gh-branch. Documentation can be automatically generated from the doc/irc.luadoc file, pre-generated documentation can be found in the gh-branch.

View File

@ -29,27 +29,27 @@ end
function meta:sendChat(target, msg) function meta:sendChat(target, msg)
-- Split the message into segments if it includes newlines. -- Split the message into segments if it includes newlines.
for line in msg:gmatch("([^\r\n]+)") for line in msg:gmatch("([^\r\n]+)")
self:send("PRIVMSG %s :%s", verify(target, 2), msg) self:send("PRIVMSG %s :%s", verify(target, 3), msg)
end end
end end
function meta:sendNotice(target, msg) function meta:sendNotice(target, msg)
-- Split the message into segments if it includes newlines. -- Split the message into segments if it includes newlines.
for line in msg:gmatch("([^\r\n]+)") for line in msg:gmatch("([^\r\n]+)")
self:send("NOTICE %s :%s", verify(target, 2), msg) self:send("NOTICE %s :%s", verify(target, 3), msg)
end end
end end
function meta:join(channel, key) function meta:join(channel, key)
if key then if key then
self:send("JOIN %s :%s", verify(channel, 2), verify(key, 2)) self:send("JOIN %s :%s", verify(channel, 3), verify(key, 3))
else else
self:send("JOIN %s", verify(channel, 2)) self:send("JOIN %s", verify(channel, 3))
end end
end end
function meta:part(channel) function meta:part(channel)
channel = verify(channel, 2) channel = verify(channel, 3)
self:send("PART %s", channel) self:send("PART %s", channel)
if self.track_users then if self.track_users then
self.channels[channel] = nil self.channels[channel] = nil
@ -71,7 +71,7 @@ function meta:setMode(t)
local add, rem = t.add, t.remove local add, rem = t.add, t.remove
assert(add or rem, "table contains neither 'add' nor 'remove'") assert(add or rem, "table contains neither 'add' nor 'remove'")
if add then if add then
mode = table.concat{"+", add} mode = table.concat{"+", add}
end end
@ -79,6 +79,6 @@ function meta:setMode(t)
if rem then if rem then
mode = table.concat{mode, "-", rem} mode = table.concat{mode, "-", rem}
end end
self:send("MODE %s %s", verify(target, 2), verify(mode, 2)) self:send("MODE %s %s", verify(target, 3), verify(mode, 3))
end end

View File

@ -23,13 +23,13 @@ require "irc.asyncoperations"
local meta_preconnect = {} local meta_preconnect = {}
function meta_preconnect.__index(o, k) function meta_preconnect.__index(o, k)
local v = rawget(meta_preconnect, k) local v = rawget(meta_preconnect, k)
if not v and meta[k] then if not v and meta[k] then
error("field '"..k.."' is not accessible before connecting", 2) error("field '"..k.."' is not accessible before connecting", 2)
end end
return v return v
end end
function new(user) function new(user)
local o = { local o = {
nick = assert(user.nick, "Field 'nick' is required"); nick = assert(user.nick, "Field 'nick' is required");
@ -55,7 +55,7 @@ function meta:unhook(name, id)
assert(hooks, "no hooks exist for this event") assert(hooks, "no hooks exist for this event")
assert(hooks[id], "hook ID not found") assert(hooks[id], "hook ID not found")
hooks[id] = nil hooks[id] = nil
end end
meta_preconnect.unhook = meta.unhook meta_preconnect.unhook = meta.unhook
@ -134,7 +134,7 @@ end
function meta:disconnect(message) function meta:disconnect(message)
local message = message or "Bye!" local message = message or "Bye!"
self:invoke("OnDisconnect", message, false) self:invoke("OnDisconnect", message, false)
self:send("QUIT :%s", message) self:send("QUIT :%s", message)
@ -200,7 +200,7 @@ handlers["JOIN"] = function(o, prefix, channel)
o.channels[channel].users[user.nick] = user o.channels[channel].users[user.nick] = user
end end
end end
o:invoke("OnJoin", user, channel) o:invoke("OnJoin", user, channel)
end end
@ -247,7 +247,7 @@ end
handlers["353"] = function(o, prefix, me, chanType, channel, names) handlers["353"] = function(o, prefix, me, chanType, channel, names)
if o.track_users then if o.track_users then
o.channels[channel] = o.channels[channel] or {users = {}, type = chanType} o.channels[channel] = o.channels[channel] or {users = {}, type = chanType}
local users = o.channels[channel].users local users = o.channels[channel].users
for nick in names:gmatch("(%S+)") do for nick in names:gmatch("(%S+)") do
local access, name = parseNick(nick) local access, name = parseNick(nick)
@ -286,6 +286,18 @@ handlers["KICK"] = function(o, prefix, channel, kicked, reason)
o:invoke("OnKick", channel, kicked, parsePrefix(prefix), reason) o:invoke("OnKick", channel, kicked, parsePrefix(prefix), reason)
end end
--RPL_UMODEIS
--To answer a query about a client's own mode, RPL_UMODEIS is sent back
handlers["221"] = function(o, prefix, modes)
o:invoke("OnUserModeIs", modes)
end
--RPL_CHANNELMODEIS
--The result from common irc servers differs from that defined by the rfc
handlers["324"] = function(o, prefix, user, channel, modes)
o:invoke("OnChannelModeIs", user, channel, modes)
end
handlers["ERROR"] = function(o, prefix, message) handlers["ERROR"] = function(o, prefix, message)
o:invoke("OnDisconnect", message, true) o:invoke("OnDisconnect", message, true)
o:shutdown() o:shutdown()
@ -311,7 +323,7 @@ function meta:whois(nick)
self:send("WHOIS %s", nick) self:send("WHOIS %s", nick)
local result = {} local result = {}
while true do while true do
local line = getline(self, 3) local line = getline(self, 3)
if line then if line then
@ -330,7 +342,6 @@ function meta:whois(nick)
if result.account then if result.account then
result.account = result.account[3] result.account = result.account[3]
elseif result.registered then elseif result.registered then
result.account = result.registered[2] result.account = result.registered[2]
end end

View File

@ -16,7 +16,7 @@ function parse(line)
prefix = line:sub(2, space-1) prefix = line:sub(2, space-1)
lineStart = space lineStart = space
end end
local _, trailToken = line:find("%s+:", lineStart) local _, trailToken = line:find("%s+:", lineStart)
local lineStop = line:len() local lineStop = line:len()
local trailing local trailing