1
0
mirror of https://github.com/minetest-mods/irc.git synced 2025-06-29 22:50:32 +02:00

57 Commits

Author SHA1 Message Date
fc46594dbb Merge remote-tracking branch 'upstream/master' 2023-11-22 23:42:44 +01:00
s20
c088ba4e40 Add number of connected players to players command (#73) 2023-11-04 18:56:07 +01:00
bb8b755362 Merge remote-tracking branch 'upstream/master' 2022-05-27 18:36:11 +02:00
758e9b6361 Fix error caused by ident check notice (#71)
Fixed the error where it cannot find an user at the notice hook. 
It happened when you get the `NOTICE * :*** Looking up your hostname and checking ident`
Because `*` is not in the `<nick>!<ident>@<host>`
2022-03-23 22:13:51 +01:00
ee81559532 Merge remote-tracking branch 'upstream/master' 2020-07-19 22:39:46 +02:00
7fbbfd6cdb Fix failing luacheck 2020-07-18 18:00:38 +02:00
cc78f12a4c Display total number of players with /who (#65) 2020-07-18 17:57:42 +02:00
0f46251d00 Merge remote-tracking branch 'upstream/master' into nalc-1.2-dev 2020-02-19 23:56:48 +01:00
ceb40e2bb3 Add luacheck GitHub integration (#62) 2020-02-19 18:46:29 +01:00
612a94bbf1 Merge branch 'master' of yunohost.local:minetest-mods/irc into nalc-1.2-dev 2019-12-22 13:32:22 +01:00
5e3659761b Add extra library search path (#60) 2019-10-17 21:29:02 +02:00
ac0387786c Fix deprecated functions, update to 5.x (#59) 2019-10-05 09:25:05 +02:00
05ab5e9fbd Fix message when a player on another server times out (#58) 2019-09-21 15:22:41 +02:00
2a88c47de4 Merge branch 'nalc' into nalc-1.2 2019-05-11 22:40:34 +02:00
0f00fa8c7e Mise à jour de l'URL du submodule irc again 2019-05-11 22:37:09 +02:00
351a86cbf2 Mise à jour de l'URL du submodule irc 2019-05-11 19:53:46 +02:00
1b71c304c5 Mise à jour de l'URL du submodule irc 2019-05-11 19:46:31 +02:00
47f889c178 Merge branch 'master' into nalc-1.2 2019-05-09 22:41:39 +02:00
1c23f8987b add another lua search path for JIT 2019-02-15 20:32:28 -03:00
66bb7fc47d Prevent players from joining the channel when logged in from IRC 2019-02-12 19:17:09 -03:00
6a7053582d Ajoute message de chargement du mod dans le journal "action" 2018-12-26 00:00:52 +01:00
5e877956a5 Corrige l'url du submodule irc 2018-12-09 21:36:12 +01:00
60bf32e157 Mise à jour du submodule irc 2018-12-09 21:19:42 +01:00
b4fbccd64a Add support for configurable coloring of IRC messages in-game
IRC channel messages are colored green by default
IRC PMs are colored purple by default
2018-11-02 21:54:36 -07:00
c9c57a6f93 Avoid deprecation warnings.
* This change avoids 21 deprecation warnings in debug.txt on every server start

2018-05-29 23:46:10: WARNING[Main]: WARNING: minetest.setting_* functions are deprecated.  Use methods on the minetest.settings object.

* Provide backward compatibility by testing for existence of new methods before using them
2018-06-18 16:45:44 -03:00
f57bdba5e9 Make username and realname configurable. 2017-06-14 19:55:28 -03:00
070eb51236 Remove minetest colour codes before sending messages to IRC. 2017-05-04 18:59:58 -03:00
e80bbe3a62 Fix warning about deprecated call.
Fixes #39.
2017-05-02 21:52:44 -03:00
1d4fd5a162 Better method to avoid impersonation. 2017-03-24 22:33:43 -03:00
6bf4e111c2 Major cleanup.
- Use `irc.foo` notation instead of `irc:foo`. It still
  supports the `irc:foo` usage, but will helpfully issue
  a warning with the location of the offending code.
- Remove unused arguments from functions.
2017-03-15 21:40:12 -03:00
5f8850bc15 Stop saying "try list" on an invalid command.
As the list command is deprecated, this reference to it should be changed.
2017-03-02 01:11:13 -03:00
2f55e0f9a0 Add option to broadcast kick messages.
Default value is false.
2017-02-21 02:07:36 -03:00
78fbe26a2c Fix error if @ with no name is used. 2017-02-16 02:38:44 -03:00
33542b07fe Add .luacheckrc and fix warnings. 2017-02-16 02:36:04 -03:00
6bbb26f9f9 Add description.txt. 2017-02-12 02:58:40 -03:00
ae0cb08e3e Remove leading whitespace from command before processing.
Fixes bug where `Server:  asdf` (note the double space)
gets taken as an empty command name.
2017-01-29 15:05:42 -03:00
bb5f549193 Don't remove characters above 0x80. 2017-01-11 22:37:54 -03:00
4c334e9967 Update README. 2016-12-09 03:16:10 -03:00
a18820356a Fix error in previous help merge. 2016-12-03 18:41:01 -03:00
0c8538bfb8 Fix issue with previous commit.
Mea culpa. It was possible an error caused `require` to
not be reset, causing possible errors in the future.
2016-12-03 03:15:17 -03:00
9f8b4fd4af Fix SASL auth under secure environment. 2016-12-02 21:47:21 -03:00
73cdb58c99 Queue NickServ message for later.
Fixes #35.
2016-12-02 20:43:08 -03:00
3e2d98f9ef Silence warnings about module in ltn12. 2016-12-01 02:57:56 -03:00
12248cc847 Minor changes to botcmds.lua.
- Merge `list` into `help`.
- Use `table.concat` to remove trailing comma.
2016-11-28 22:17:08 -03:00
160088c232 Use return values whenever possible in chatcmds.lua.
Also minor fixes.
2016-11-28 02:02:40 -03:00
03070e41c4 Check nickname using RFC1459 rules in botcmds.lua. 2016-11-28 01:05:46 -03:00
b5786979ab Use return values in player_part.lua.
Also minor style fixes.
2016-11-20 20:53:01 -03:00
tai
d5ad8ffca4 Add IRC messages to log. 2016-11-20 15:21:37 -03:00
0f6e1dacc4 Create mod.conf 2016-11-17 11:23:53 -05:00
ecc1d450ba Add settingtypes.txt.
This allows configuring the mod from the GUI.
2016-11-13 12:13:17 -03:00
18f286f4b5 Reset require function after loading all sub-modules.
Fixes an issue with `hooks.lua` calling the (old, disabled)
`require` function.
2016-11-09 22:47:12 -03:00
0c47e10a90 Update installation instructions to use new repo URL. 2016-10-06 21:09:59 -03:00
43493eb2ea Report when players time out instead of leaving normally. (#25) 2016-06-19 23:20:20 -03:00
f98282818d Print reconnect interval, clean up reconnect comment.
Follows #23
2016-05-21 22:43:14 -07:00
03edbd29ed Add "reconnect" time variable to config. (#23)
Allow server admin to specify how long until a reconnect occurs after a timeout (default 600 seconds) without having to modify the core code.
2016-05-18 15:03:34 -07:00
464f2febee Switch to luarocks installation method for Debian and derivatives
Debian's LuaSocket packages are broken.  Then seem to
package the 5.1 version of the library as simply a copy
of the 5.2 version; however, the libraries are incompatible.
Additionally, the package seems to take a number of
different names depending on the version of the distro.
However, the LuaRocks package seems to be fine, so install
that first and then install LuaSocket through LuaRocks.
2016-01-09 15:47:08 -05:00
0c900dbac2 Add support for mod security 2015-05-16 19:54:24 -04:00
16 changed files with 572 additions and 346 deletions

11
.github/workflows/check-release.yml vendored Normal file
View File

@ -0,0 +1,11 @@
on: [push, pull_request]
name: Check & Release
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: lint
uses: Roang-zero1/factorio-mod-luacheck@master
with:
luacheckrc_url: https://raw.githubusercontent.com/minetest-mods/irc/master/.luacheckrc

4
.gitmodules vendored
View File

@ -1,3 +1,3 @@
[submodule "src/LuaIRC"]
[submodule "irc"]
path = irc
url = https://github.com/ShadowNinja/LuaIRC.git
url = https://sys4.fr/gitea/mtcontrib/LuaIRC.git

14
.luacheckrc Normal file
View File

@ -0,0 +1,14 @@
allow_defined_top = true
read_globals = {
"minetest"
}
exclude_files = {
"irc/*",
}
globals = {
"irc",
}

16
API.md
View File

@ -13,14 +13,14 @@ to your mod's `depends.txt` file.
Reference
---------
irc:say([name,] message)
irc.say([name,] message)
Sends <message> to either the channel (if <name> is nil or not specified),
or to the given user (if <name> is specified).
Example:
irc:say("Hello, Channel!")
irc:say("john1234", "How are you?")
irc.say("Hello, Channel!")
irc.say("john1234", "How are you?")
irc:register_bot_command(name, cmdDef)
irc.register_bot_command(name, cmdDef)
Registers a new bot command named <name>.
When an user sends a private message to the bot with the command name, the
command's function is called.
@ -38,7 +38,7 @@ irc:register_bot_command(name, cmdDef)
end,
};
Example:
irc:register_bot_command("hello", {
irc.register_bot_command("hello", {
params = "",
description = "Greet user",
func = function(user, param)
@ -55,12 +55,12 @@ irc.joined_players[name]
-- Joe is talking on IRC
end
irc:register_hook(name, func)
irc.register_hook(name, func)
Registers a function to be called when an event happens. <name> is the name
of the event, and <func> is the function to be called. See HOOKS below
for more information
Example:
irc:register_hook("OnSend", function(line)
irc.register_hook("OnSend", function(line)
print("SEND: "..line)
end)
@ -83,7 +83,7 @@ not modify these settings at runtime or you might crash the server!
Hooks
-----
The `irc:register_hook` function can register functions to be called
The `irc.register_hook` function can register functions to be called
when some events happen. The events supported are the same as the LuaIRC
ones with a few added (mostly for internal use).
See src/LuaIRC/doc/irc.luadoc for more information.

116
README.md
View File

@ -1,12 +1,17 @@
[![](https://github.com/minetest-mods/irc/workflows/Check%20&%20Release/badge.svg)](https://github.com/minetest-mods/irc/actions)
IRC Mod for Minetest
====================
Introduction
------------
This mod is just a glue between IRC and Minetest. It provides two-way
communication between the in-game chat, and an arbitrary IRC channel.
The forum topic is at https://forum.minetest.net/viewtopic.php?f=11&t=3905
The forum topic is [here][forum].
[forum]: https://forum.minetest.net/viewtopic.php?f=11&t=3905
Installing
@ -14,10 +19,10 @@ Installing
Quick one line install for Linux:
cd <Mods directory> && git clone --recursive https://github.com/kaeza/minetest-irc.git irc
cd <Mods directory> && git clone --recursive https://github.com/minetest-mods/irc.git
Please change `<Mods directory>` to fit your installation of Minetest.
For more information, see [the wiki](http://wiki.minetest.net/Installing_mods).
For more information, see [the wiki][wiki].
The IRC mod's git repository uses submodules, therefore you will have to run
`git submodule init` when first installing the mod (unless you used
@ -30,59 +35,71 @@ many distributions, for example:
# # On Arch Linux:
# pacman -S lua51-socket
# # On Debian/Ubuntu:
# apt-get install lua-socket
# # Debian/Ubuntu's LuaSocket packages are broken, so use LuaRocks.
# apt-get install luarocks
# luarocks install luasocket
You will also need to add IRC to your trusted mods if you haven't disabled mod
security. Here's an example configuration line:
secure.trusted_mods = irc
[wiki]: https://wiki.minetest.net/Installing_mods
Settings
--------
All settings are changed in `minetest.conf`. If any of these settings
are not set, the default value is used.
* `irc.server` (string)
* `irc.server` (string):
The address of the IRC server to connect to.
* `irc.channel` (string)
* `irc.channel` (string):
The IRC channel to join.
* `irc.interval` (number, default 2.0)
* `irc.interval` (number, default 2.0):
This prevents the server from flooding. It should be at
least 2.0 but can be higher. After four messages this much
time must pass between folowing messages.
* `irc.nick` (string)
* `irc.nick` (string):
Nickname the server uses when it connects to IRC.
* `irc.password` (string, default nil)
* `irc.password` (string, default nil):
Password to use when connecting to the server.
* `irc.NSPass` (string, default nil)
* `irc.NSPass` (string, default nil):
NickServ password. Don't set this if you use SASL authentication.
* `irc.sasl.pass` (string, default nil)
* `irc.sasl.pass` (string, default nil):
SASL password, same as nickserv password.
You should use this instead of NickServ authentication
if the server supports it.
* `irc.sasl.user` (string, default `irc.nick`)
The SASL username. This should normaly be set to your NickServ account name.
* `irc.sasl.user` (string, default `irc.nick`):
The SASL username. This should normaly be set to your
NickServ account name.
* `irc.debug` (boolean, default false)
* `irc.debug` (boolean, default false):
Whether to output debug information.
* `irc.disable_auto_connect` (boolean, default false)
* `irc.disable_auto_connect` (boolean, default false):
If false, the bot is connected by default. If true, a player with
the 'irc_admin' privilege has to use the /irc_connect command to
the 'irc_admin' privilege has to use the `/irc_connect` command to
connect to the server.
* `irc.disable_auto_join` (boolean, default false)
* `irc.disable_auto_join` (boolean, default false):
If false, players join the channel automatically upon entering the
game. If true, each user must manually use the /join command to
join the channel. In any case, the players may use the /part
game. If true, each user must manually use the `/join` command to
join the channel. In any case, the players may use the `/part`
command to opt-out of being in the channel.
* `irc.send_join_part` (boolean, default true)
* `irc.send_join_part` (boolean, default true):
Determines whether to send player join and part messages to the channel.
Usage
-----
@ -90,33 +107,33 @@ Once the game is connected to the IRC channel, chatting in-game will send
messages to the channel, and will be visible by anyone. Also, messages sent
to the channel will be visible in-game.
Messages that begin with `[off]` from in-game or IRC are not sent to the other side.
Messages that begin with `[off]` from in-game or IRC are not sent to the
other side.
This mod also adds a few chat commands:
* `/irc_msg <nick> <message>`
Sends a private message to a IRC user.
* `/irc_msg <nick> <message>`:
Send a private message to a IRC user.
* `/join`
* `/join`:
Join the IRC chat.
* `/part`
* `/part`:
Part the IRC chat.
* `/irc_connect`
* `/irc_connect`:
Connect the bot manually to the IRC network.
* `/irc_disconnect`
* `/irc_disconnect`:
Disconnect the bot manually from the IRC network (this does not
shutdown the game).
* `/irc_reconnect`
Equivilant to `/irc_disconnect` followed by `/irc_connect`.
* `/irc_reconnect`:
Equivalent to `/irc_disconnect` followed by `/irc_connect`.
You can also send private messages from IRC to in-game players.
To do so, you must send a private message to the bot (set with
the `irc.nick` option above), in the following format:
You can also send private messages from IRC to in-game players
by sending a private message to the bot (set with the `irc.nick`
option above), in the following format:
@playername message
@ -125,21 +142,29 @@ a private message from IRC with:
/msg server_nick @mtuser Hello!
To avoid possible misunderstandings (since all in-game players use the
same IRC user to converse with you), the "proxy" user will reject any
private messages that are not in that format, and will send back a
nice reminder as a private message.
The bot also supports some basic commands, which are invoked by saying
the bot name followed by either a colon or a comma and the command, or
sending a private message to it. For example: `ServerBot: help whereis`.
The bot also supports some basic commands, which are invoked by sending
a private message to it. Use `!list` to get a list of commands, and
`!help <command>` to get help about a specific command.
* `help [<command>]`:
Prints help about a command, or a list of supported commands if no
command is given.
* `uptime`:
Prints the server's running time.
* `whereis <player>`:
Prints the coordinates of the given player.
* `players`:
Lists players currently in the server.
Thanks
------
I'd like to thank the users who supported this mod both on the Minetest
Forums and on the #minetest channel. In no particular order:
Forums and on the `#minetest` channel. In no particular order:
0gb.us, ShadowNinja, Shaun/kizeren, RAPHAEL, DARGON, Calinou, Exio,
vortexlabs/mrtux, marveidemanis, marktraceur, jmf/john\_minetest,
@ -151,10 +176,7 @@ forum topic. Thanks to you all!
License
-------
Copyright © 2012-2013 Diego Martínez <kaeza@users.sf.net>
See LICENSE.txt for licensing information.
The files in the irc directory are part of the LuaIRC project.
See irc/LICENSE.txt for licensing information.
See `LICENSE.txt` for details.
The files in the `irc` directory are part of the LuaIRC project.
See `irc/LICENSE.txt` for details.

View File

@ -1,39 +1,59 @@
irc.bot_commands = {}
function irc:check_botcmd(msg)
-- From RFC1459:
-- "Because of IRCs scandanavian origin, the characters {}| are
-- considered to be the lower case equivalents of the characters
-- []\, respectively."
local irctolower = { ["["]="{", ["\\"]="|", ["]"]="}" }
local function irclower(s)
return (s:lower():gsub("[%[%]\\]", irctolower))
end
local function nickequals(nick1, nick2)
return irclower(nick1) == irclower(nick2)
end
function irc.check_botcmd(msg)
local prefix = irc.config.command_prefix
local nick = irc.conn.nick:lower()
local nick = irc.conn.nick
local text = msg.args[2]
local nickpart = text:sub(1, #nick + 2):lower()
local nickpart = text:sub(1, #nick)
local suffix = text:sub(#nick+1, #nick+2)
-- First check for a nick prefix
if nickpart == nick..": " or
nickpart == nick..", " then
self:bot_command(msg, text:sub(#nick + 3))
if nickequals(nickpart, nick)
and (suffix == ": " or suffix == ", ") then
irc.bot_command(msg, text:sub(#nick + 3))
return true
-- Then check for the configured prefix
elseif prefix and text:sub(1, #prefix):lower() == prefix:lower() then
self:bot_command(msg, text:sub(#prefix + 1))
irc.bot_command(msg, text:sub(#prefix + 1))
return true
end
return false
end
function irc:bot_command(msg, text)
function irc.bot_command(msg, text)
-- Remove leading whitespace
text = text:match("^%s*(.*)")
if text:sub(1, 1) == "@" then
local found, _, player_to, message = text:find("^.([^%s]+)%s(.+)$")
if not minetest.get_player_by_name(player_to) then
irc:reply("User '"..player_to.."' is not in the game.")
local _, _, player_to, message = text:find("^.([^%s]+)%s(.+)$")
if not player_to then
return
elseif not minetest.get_player_by_name(player_to) then
irc.reply("User '"..player_to.."' is not in the game.")
return
elseif not irc.joined_players[player_to] then
irc:reply("User '"..player_to.."' is not using IRC.")
irc.reply("User '"..player_to.."' is not using IRC.")
return
end
minetest.chat_send_player(player_to,
"PM from "..msg.user.nick.."@IRC: "..message, false)
irc:reply("Message sent!")
minetest.colorize(irc.config.pm_color,
"PM from "..msg.user.nick.."@IRC: "..message, false))
irc.reply("Message sent!")
return
end
local pos = text:find(" ", 1, true)
@ -46,44 +66,50 @@ function irc:bot_command(msg, text)
args = ""
end
if not self.bot_commands[cmd] then
self:reply("Unknown command '"..cmd.."'. Try 'list'."
if not irc.bot_commands[cmd] then
irc.reply("Unknown command '"..cmd.."'. Try 'help'."
.." Or use @playername <message> to send a private message")
return
end
local success, message = self.bot_commands[cmd].func(msg.user, args)
local _, message = irc.bot_commands[cmd].func(msg.user, args)
if message then
self:reply(message)
irc.reply(message)
end
end
function irc:register_bot_command(name, def)
function irc.register_bot_command(name, def)
if (not def.func) or (type(def.func) ~= "function") then
error("Erroneous bot command definition. def.func missing.", 2)
elseif name:sub(1, 1) == "@" then
error("Erroneous bot command name. Command name begins with '@'.", 2)
end
self.bot_commands[name] = def
irc.bot_commands[name] = def
end
irc:register_bot_command("help", {
irc.register_bot_command("help", {
params = "<command>",
description = "Get help about a command",
func = function(user, args)
func = function(_, args)
if args == "" then
return false, "No command name specified. Use 'list' for a list of commands."
local cmdlist = { }
for name in pairs(irc.bot_commands) do
cmdlist[#cmdlist+1] = name
end
return true, "Available commands: "..table.concat(cmdlist, ", ")
.." -- Use 'help <command name>' to get"
.." help about a specific command."
end
local cmd = irc.bot_commands[args]
if not cmd then
return false, "Unknown command '"..cmdname.."'."
return false, "Unknown command '"..args.."'."
end
return true, ("Usage: %c%s %s -- %s"):format(
irc.config.command_prefix,
return true, ("Usage: %s%s %s -- %s"):format(
irc.config.command_prefix or "",
args,
cmd.params or "<no parameters>",
cmd.description or "<no description>")
@ -91,24 +117,20 @@ irc:register_bot_command("help", {
})
irc:register_bot_command("list", {
irc.register_bot_command("list", {
params = "",
description = "List available commands.",
func = function(user, args)
local cmdlist = "Available commands: "
for name, cmd in pairs(irc.bot_commands) do
cmdlist = cmdlist..name..", "
end
return true, cmdlist.." -- Use 'help <command name>' to get"
.." help about a specific command."
func = function()
return false, "The `list` command has been merged into `help`."
.." Use `help` with no arguments to get a list."
end
})
irc:register_bot_command("whereis", {
irc.register_bot_command("whereis", {
params = "<player>",
description = "Tell the location of <player>",
func = function(user, args)
func = function(_, args)
if args == "" then
return false, "Player name required."
end
@ -117,16 +139,16 @@ irc:register_bot_command("whereis", {
return false, "There is no player named '"..args.."'"
end
local fmt = "Player %s is at (%.2f,%.2f,%.2f)"
local pos = player:getpos()
local pos = player:get_pos()
return true, fmt:format(args, pos.x, pos.y, pos.z)
end
})
local starttime = os.time()
irc:register_bot_command("uptime", {
irc.register_bot_command("uptime", {
description = "Tell how much time the server has been up",
func = function(user, args)
func = function()
local cur_time = os.time()
local diff = os.difftime(cur_time, starttime)
local fmt = "Server has been running for %d:%02d:%02d"
@ -139,16 +161,18 @@ irc:register_bot_command("uptime", {
})
irc:register_bot_command("players", {
irc.register_bot_command("players", {
description = "List the players on the server",
func = function(user, args)
func = function()
local players = minetest.get_connected_players()
local names = {}
for _, player in pairs(players) do
table.insert(names, player:get_player_name())
end
return true, "Connected players: "
..table.concat(names, ", ")
return true, string.format("%d connected player(s): %s",
#players,
table.concat(names, ", ")
)
end
})

View File

@ -5,15 +5,16 @@
minetest.register_on_joinplayer(function(player)
local name = player:get_player_name()
if irc.connected and irc.config.send_join_part then
irc:say("*** "..name.." joined the game")
irc.say("*** "..name.." joined the game")
end
end)
minetest.register_on_leaveplayer(function(player)
minetest.register_on_leaveplayer(function(player, timed_out)
local name = player:get_player_name()
if irc.connected and irc.config.send_join_part then
irc:say("*** "..name.." left the game")
irc.say("*** "..name.." left the game"..
(timed_out and " (Timed out)" or ""))
end
end)
@ -30,11 +31,11 @@ minetest.register_on_chat_message(function(name, message)
if nl then
message = message:sub(1, nl - 1)
end
irc:say(irc:playerMessage(name, message))
irc.say(irc.playerMessage(name, minetest.strip_colors(message)))
end)
minetest.register_on_shutdown(function()
irc:disconnect("Game shutting down.")
irc.disconnect("Game shutting down.")
end)

View File

@ -11,32 +11,30 @@ minetest.register_chatcommand("irc_msg", {
privs = {shout=true},
func = function(name, param)
if not irc.connected then
minetest.chat_send_player(name, "Not connected to IRC. Use /irc_connect to connect.")
return
return false, "Not connected to IRC. Use /irc_connect to connect."
end
local found, _, toname, message = param:find("^([^%s]+)%s(.+)")
if not found then
minetest.chat_send_player(name, "Invalid usage, see /help irc_msg.")
return
return false, "Invalid usage, see /help irc_msg."
end
local toname_l = toname:lower()
local validNick = false
for nick, user in pairs(irc.conn.channels[irc.config.channel].users) do
local hint = "They have to be in the channel"
for nick in pairs(irc.conn.channels[irc.config.channel].users) do
if nick:lower() == toname_l then
validNick = true
break
end
end
if toname_l:find("serv$") or toname_l:find("bot$") then
hint = "it looks like a bot or service"
validNick = false
end
if not validNick then
minetest.chat_send_player(name,
"You can not message that user. (Hint: They have to be in the channel)")
return
return false, "You can not message that user. ("..hint..")"
end
irc:say(toname, irc:playerMessage(name, message))
minetest.chat_send_player(name, "Message sent!")
irc.say(toname, irc.playerMessage(name, message))
return true, "Message sent!"
end
})
@ -44,16 +42,15 @@ minetest.register_chatcommand("irc_msg", {
minetest.register_chatcommand("irc_names", {
params = "",
description = "List the users in IRC.",
func = function(name, params)
func = function()
if not irc.connected then
minetest.chat_send_player(name, "Not connected to IRC. Use /irc_connect to connect.")
return
return false, "Not connected to IRC. Use /irc_connect to connect."
end
local users = { }
for k, v in pairs(irc.conn.channels[irc.config.channel].users) do
table.insert(users, k)
for nick in pairs(irc.conn.channels[irc.config.channel].users) do
table.insert(users, nick)
end
minetest.chat_send_player(name, "Users in IRC: "..table.concat(users, ", "))
return true, "Users in IRC: "..table.concat(users, ", ")
end
})
@ -61,13 +58,12 @@ minetest.register_chatcommand("irc_names", {
minetest.register_chatcommand("irc_connect", {
description = "Connect to the IRC server.",
privs = {irc_admin=true},
func = function(name, param)
func = function(name)
if irc.connected then
minetest.chat_send_player(name, "You are already connected to IRC.")
return
return false, "You are already connected to IRC."
end
minetest.chat_send_player(name, "IRC: Connecting...")
irc:connect()
irc.connect()
end
})
@ -78,13 +74,12 @@ minetest.register_chatcommand("irc_disconnect", {
privs = {irc_admin=true},
func = function(name, param)
if not irc.connected then
minetest.chat_send_player(name, "You are not connected to IRC.")
return
return false, "Not connected to IRC. Use /irc_connect to connect."
end
if params == "" then
params = "Manual disconnect by "..name
if param == "" then
param = "Manual disconnect by "..name
end
irc:disconnect(param)
irc.disconnect(param)
end
})
@ -92,13 +87,13 @@ minetest.register_chatcommand("irc_disconnect", {
minetest.register_chatcommand("irc_reconnect", {
description = "Reconnect to the IRC server.",
privs = {irc_admin=true},
func = function(name, param)
func = function(name)
if not irc.connected then
minetest.chat_send_player(name, "You are not connected to IRC.")
return
return false, "Not connected to IRC. Use /irc_connect to connect."
end
irc:disconnect("Reconnecting...")
irc:connect()
minetest.chat_send_player(name, "IRC: Reconnecting...")
irc.disconnect("Reconnecting...")
irc.connect()
end
})
@ -109,18 +104,31 @@ minetest.register_chatcommand("irc_quote", {
privs = {irc_admin=true},
func = function(name, param)
if not irc.connected then
minetest.chat_send_player(name, "You are not connected to IRC.")
return
return false, "Not connected to IRC. Use /irc_connect to connect."
end
irc:queue(param)
irc.queue(param)
minetest.chat_send_player(name, "Command sent!")
end
})
local oldme = minetest.chatcommands["me"].func
-- luacheck: ignore
minetest.chatcommands["me"].func = function(name, param, ...)
oldme(name, param, ...)
irc:say(("* %s %s"):format(name, param))
irc.say(("* %s %s"):format(name, param))
return oldme(name, param, ...)
end
if irc.config.send_kicks and minetest.chatcommands["kick"] then
local oldkick = minetest.chatcommands["kick"].func
-- luacheck: ignore
minetest.chatcommands["kick"].func = function(name, param, ...)
local plname, reason = param:match("^(%S+)%s*(.*)$")
if not plname then
return false, "Usage: /kick player [reason]"
end
irc.say(("*** Kicked %s.%s"):format(name,
reason~="" and " Reason: "..reason or ""))
return oldkick(name, param, ...)
end
end

View File

@ -6,12 +6,14 @@ irc.config = {}
local function setting(stype, name, default, required)
local value
if minetest.settings and minetest.settings.get and minetest.settings.get_bool then
if stype == "bool" then
value = minetest.setting_getbool("irc."..name)
value = minetest.settings:get_bool("irc."..name)
elseif stype == "string" then
value = minetest.setting_get("irc."..name)
value = minetest.settings:get("irc."..name)
elseif stype == "number" then
value = tonumber(minetest.setting_get("irc."..name))
value = tonumber(minetest.settings:get("irc."..name))
end
end
if value == nil then
if required then
@ -32,10 +34,13 @@ setting("string", "server", nil, true) -- Server address to connect to
setting("number", "port", 6667) -- Server port to connect to
setting("string", "NSPass") -- NickServ password
setting("string", "sasl.user", irc.config.nick) -- SASL username
setting("string", "username", "Minetest") -- Username/ident
setting("string", "realname", "Minetest") -- Real name/GECOS
setting("string", "sasl.pass") -- SASL password
setting("string", "channel", nil, true) -- Channel to join
setting("string", "key") -- Key for the channel
setting("bool", "send_join_part", true) -- Whether to send player join and part messages to the channel
setting("bool", "send_kicks", false) -- Whether to send player kicked messages to the channel
-----------------------
-- ADVANCED SETTINGS --
@ -44,9 +49,11 @@ setting("bool", "send_join_part", true) -- Whether to send player join and par
setting("string", "password") -- Server password
setting("bool", "secure", false) -- Enable a TLS connection, requires LuaSEC
setting("number", "timeout", 60) -- Underlying socket timeout in seconds.
setting("number", "reconnect", 600) -- Time between reconnection attempts, in seconds.
setting("string", "command_prefix") -- Prefix to use for bot commands
setting("bool", "debug", false) -- Enable debug output
setting("bool", "enable_player_part", true) -- Whether to enable players joining and parting the channel
setting("bool", "auto_join", true) -- Whether to automatically show players in the channel when they join
setting("bool", "auto_connect", true) -- Whether to automatically connect to the server on mod load
setting("string", "chat_color", "#339933") -- Color of IRC chat in-game, green by default
setting("string", "pm_color", "#8800AA") -- Color of IRC PMs in-game, purple by default

View File

@ -1,19 +1,16 @@
-- This file is licensed under the terms of the BSD 2-clause license.
-- See LICENSE.txt for details.
local ie = ...
-- MIME is part of LuaSocket
local b64e = require("mime").b64
local b64e = ie.require("mime").b64
irc.hooks = {}
irc.registered_hooks = {}
-- TODO: Add proper conversion from CP1252 to UTF-8.
local stripped_chars = {"\2", "\31"}
for c = 127, 255 do
table.insert(stripped_chars, string.char(c))
end
stripped_chars = "["..table.concat(stripped_chars, "").."]"
local stripped_chars = "[\2\31]"
local function normalize(text)
-- Strip colors
@ -23,8 +20,8 @@ local function normalize(text)
end
function irc:doHook(conn)
for name, hook in pairs(self.registered_hooks) do
function irc.doHook(conn)
for name, hook in pairs(irc.registered_hooks) do
for _, func in pairs(hook) do
conn:hook(name, func)
end
@ -32,9 +29,9 @@ function irc:doHook(conn)
end
function irc:register_hook(name, func)
self.registered_hooks[name] = self.registered_hooks[name] or {}
table.insert(self.registered_hooks[name], func)
function irc.register_hook(name, func)
irc.registered_hooks[name] = irc.registered_hooks[name] or {}
table.insert(irc.registered_hooks[name], func)
end
@ -83,13 +80,13 @@ function irc.hooks.ctcp(msg)
local command = args[1]:upper()
local function reply(s)
irc:queue(irc.msgs.notice(msg.user.nick,
irc.queue(irc.msgs.notice(msg.user.nick,
("\1%s %s\1"):format(command, s)))
end
if command == "ACTION" and msg.args[1] == irc.config.channel then
local action = text:sub(8, -1)
irc:sendLocal(("* %s@IRC %s"):format(msg.user.nick, action))
irc.sendLocal(("* %s@IRC %s"):format(msg.user.nick, action))
elseif command == "VERSION" then
reply(("Minetest version %s, IRC mod version %s.")
:format(get_core_version(), irc.version))
@ -104,11 +101,12 @@ end
function irc.hooks.channelChat(msg)
local text = normalize(msg.args[2])
irc:check_botcmd(msg)
irc.check_botcmd(msg)
-- Don't let a user impersonate someone else by using the nick "IRC"
if msg.user.nick == "IRC" then
irc:sendLocal("<IRC@IRC> "..text)
local fake = msg.user.nick:lower():match("^[il|]rc$")
if fake then
irc.sendLocal("<"..msg.user.nick.."@IRC> "..text)
return
end
@ -122,25 +120,30 @@ function irc.hooks.channelChat(msg)
text:find("^%*%*%* ([^%s]+) joined the game$")
local foundleave, _, leavenick =
text:find("^%*%*%* ([^%s]+) left the game$")
local foundtimedout, _, timedoutnick =
text:find("^%*%*%* ([^%s]+) left the game %(Timed out%)$")
local foundaction, _, actionnick, actionmessage =
text:find("^%* ([^%s]+) (.*)$")
if text:sub(1, 5) == "[off]" then
return
elseif foundchat then
irc:sendLocal(("<%s@%s> %s")
irc.sendLocal(("<%s@%s> %s")
:format(chatnick, msg.user.nick, chatmessage))
elseif foundjoin then
irc:sendLocal(("*** %s joined %s")
irc.sendLocal(("*** %s joined %s")
:format(joinnick, msg.user.nick))
elseif foundleave then
irc:sendLocal(("*** %s left %s")
irc.sendLocal(("*** %s left %s")
:format(leavenick, msg.user.nick))
elseif foundtimedout then
irc.sendLocal(("*** %s left %s (Timed out)")
:format(timedoutnick, msg.user.nick))
elseif foundaction then
irc:sendLocal(("* %s@%s %s")
irc.sendLocal(("* %s@%s %s")
:format(actionnick, msg.user.nick, actionmessage))
else
irc:sendLocal(("<%s@IRC> %s"):format(msg.user.nick, text))
irc.sendLocal(("<%s@IRC> %s"):format(msg.user.nick, text))
end
end
@ -152,24 +155,24 @@ function irc.hooks.pm(msg)
if prefix and text:sub(1, #prefix) == prefix then
text = text:sub(#prefix + 1)
end
irc:bot_command(msg, text)
irc.bot_command(msg, text)
end
function irc.hooks.kick(channel, target, prefix, reason)
if target == irc.conn.nick then
minetest.chat_send_all("IRC: kicked from "..channel.." by "..prefix.nick..".")
irc:disconnect("Kicked")
irc.disconnect("Kicked")
else
irc:sendLocal(("-!- %s was kicked from %s by %s [%s]")
irc.sendLocal(("-!- %s was kicked from %s by %s [%s]")
:format(target, channel, prefix.nick, reason))
end
end
function irc.hooks.notice(user, target, message)
if user.nick and target == irc.config.channel then
irc:sendLocal("-"..user.nick.."@IRC- "..message)
if user and user.nick and target == irc.config.channel then
irc.sendLocal("-"..user.nick.."@IRC- "..message)
end
end
@ -190,31 +193,31 @@ end
function irc.hooks.nick(user, newNick)
irc:sendLocal(("-!- %s is now known as %s")
irc.sendLocal(("-!- %s is now known as %s")
:format(user.nick, newNick))
end
function irc.hooks.join(user, channel)
irc:sendLocal(("-!- %s joined %s")
irc.sendLocal(("-!- %s joined %s")
:format(user.nick, channel))
end
function irc.hooks.part(user, channel, reason)
reason = reason or ""
irc:sendLocal(("-!- %s has left %s [%s]")
irc.sendLocal(("-!- %s has left %s [%s]")
:format(user.nick, channel, reason))
end
function irc.hooks.quit(user, reason)
irc:sendLocal(("-!- %s has quit [%s]")
irc.sendLocal(("-!- %s has quit [%s]")
:format(user.nick, reason))
end
function irc.hooks.disconnect(message, isError)
function irc.hooks.disconnect(_, isError)
irc.connected = false
if isError then
minetest.log("error", "IRC: Error: Disconnected, reconnecting in one minute.")
@ -242,19 +245,19 @@ function irc.hooks.preregister(conn)
end
irc:register_hook("PreRegister", irc.hooks.preregister)
irc:register_hook("OnRaw", irc.hooks.raw)
irc:register_hook("OnSend", irc.hooks.send)
irc:register_hook("DoPrivmsg", irc.hooks.chat)
irc:register_hook("OnPart", irc.hooks.part)
irc:register_hook("OnKick", irc.hooks.kick)
irc:register_hook("OnJoin", irc.hooks.join)
irc:register_hook("OnQuit", irc.hooks.quit)
irc:register_hook("NickChange", irc.hooks.nick)
irc:register_hook("OnCTCP", irc.hooks.ctcp)
irc:register_hook("PrivateMessage", irc.hooks.pm)
irc:register_hook("OnNotice", irc.hooks.notice)
irc:register_hook("OnChannelChat", irc.hooks.channelChat)
irc:register_hook("OnModeChange", irc.hooks.mode)
irc:register_hook("OnDisconnect", irc.hooks.disconnect)
irc.register_hook("PreRegister", irc.hooks.preregister)
irc.register_hook("OnRaw", irc.hooks.raw)
irc.register_hook("OnSend", irc.hooks.send)
irc.register_hook("DoPrivmsg", irc.hooks.chat)
irc.register_hook("OnPart", irc.hooks.part)
irc.register_hook("OnKick", irc.hooks.kick)
irc.register_hook("OnJoin", irc.hooks.join)
irc.register_hook("OnQuit", irc.hooks.quit)
irc.register_hook("NickChange", irc.hooks.nick)
irc.register_hook("OnCTCP", irc.hooks.ctcp)
irc.register_hook("PrivateMessage", irc.hooks.pm)
irc.register_hook("OnNotice", irc.hooks.notice)
irc.register_hook("OnChannelChat", irc.hooks.channelChat)
irc.register_hook("OnModeChange", irc.hooks.mode)
irc.register_hook("OnDisconnect", irc.hooks.disconnect)

205
init.lua
View File

@ -3,24 +3,50 @@
local modpath = minetest.get_modpath(minetest.get_current_modname())
package.path =
-- Handle mod security if needed
local ie, req_ie = _G, minetest.request_insecure_environment
if req_ie then ie = req_ie() end
if not ie then
error("The IRC mod requires access to insecure functions in order "..
"to work. Please add the irc mod to your secure.trusted_mods "..
"setting or disable the irc mod.")
end
ie.package.path =
-- To find LuaIRC's init.lua
modpath.."/?/init.lua;"
-- For LuaIRC to find its files
..modpath.."/?.lua;"
..package.path
..ie.package.path
-- The build of Lua that Minetest comes with only looks for libraries under
-- /usr/local/share and /usr/local/lib but LuaSocket is often installed under
-- /usr/share and /usr/lib.
if not rawget(_G, "jit") and package.config:sub(1, 1) == "/" then
package.path = package.path..
ie.package.path = ie.package.path..
";/usr/share/lua/5.1/?.lua"..
";/usr/share/lua/5.1/?/init.lua"
package.cpath = package.cpath..
";/usr/lib/lua/5.1/?.so"
ie.package.cpath = ie.package.cpath..
";/usr/lib/lua/5.1/?.so"..
";/usr/lib64/lua/5.1/?.so"
ie.package.cpath = "/usr/lib/x86_64-linux-gnu/lua/5.1/?.so;"..ie.package.cpath
end
-- Temporarily set require so that LuaIRC can access it
local old_require = require
require = ie.require
-- Silence warnings about `module` in `ltn12`.
local old_module = rawget(_G, "module")
rawset(_G, "module", ie.module)
local lib = ie.require("irc")
irc = {
version = "0.2.0",
connected = false,
@ -29,45 +55,82 @@ irc = {
recent_message_count = 0,
joined_players = {},
modpath = modpath,
lib = require("irc"),
lib = lib,
}
-- Compatibility
mt_irc = irc
rawset(_G, "mt_irc", irc)
local getinfo = debug.getinfo
local warned = { }
local function warn_deprecated(k)
local info = getinfo(3)
local loc = info.source..":"..info.currentline
if warned[loc] then return end
warned[loc] = true
print("COLON: "..tostring(k))
minetest.log("warning", "Deprecated use of colon notation when calling"
.." method `"..tostring(k).."` at "..loc)
end
-- This is a hack.
setmetatable(irc, {
__newindex = function(t, k, v)
if type(v) == "function" then
local f = v
v = function(me, ...)
if rawequal(me, t) then
warn_deprecated(k)
return f(...)
else
return f(me, ...)
end
end
end
rawset(t, k, v)
end,
})
dofile(modpath.."/config.lua")
dofile(modpath.."/messages.lua")
dofile(modpath.."/hooks.lua")
loadfile(modpath.."/hooks.lua")(ie)
dofile(modpath.."/callback.lua")
dofile(modpath.."/chatcmds.lua")
dofile(modpath.."/botcmds.lua")
-- Restore old (safe) functions
require = old_require
rawset(_G, "module", old_module)
if irc.config.enable_player_part then
dofile(modpath.."/player_part.lua")
else
setmetatable(irc.joined_players, {__index = function(index) return true end})
setmetatable(irc.joined_players, {__index = function() return true end})
end
minetest.register_privilege("irc_admin", {
description = "Allow IRC administrative tasks to be performed.",
give_to_singleplayer = true
give_to_singleplayer = true,
give_to_admin = true,
})
local stepnum = 0
minetest.register_globalstep(function(dtime) return irc:step(dtime) end)
minetest.register_globalstep(function(dtime) return irc.step(dtime) end)
function irc:step(dtime)
function irc.step()
if stepnum == 3 then
if self.config.auto_connect then
self:connect()
if irc.config.auto_connect then
irc.connect()
end
end
stepnum = stepnum + 1
if not self.connected then return end
if not irc.connected then return end
-- Hooks will manage incoming messages and errors
local good, err = xpcall(function() self.conn:think() end, debug.traceback)
local good, err = xpcall(function() irc.conn:think() end, debug.traceback)
if not good then
print(err)
return
@ -75,104 +138,90 @@ function irc:step(dtime)
end
function irc:connect()
if self.connected then
function irc.connect()
if irc.connected then
minetest.log("error", "IRC: Ignoring attempt to connect when already connected.")
return
end
self.conn = irc.lib.new({
nick = self.config.nick,
username = "Minetest",
realname = "Minetest",
irc.conn = irc.lib.new({
nick = irc.config.nick,
username = irc.config.username,
realname = irc.config.realname,
})
self:doHook(self.conn)
irc.doHook(irc.conn)
-- We need to swap the `require` function again since
-- LuaIRC `require`s `ssl` if `irc.secure` is true.
old_require = require
require = ie.require
local good, message = pcall(function()
self.conn:connect({
host = self.config.server,
port = self.config.port,
password = self.config.password,
timeout = self.config.timeout,
secure = self.config.secure
irc.conn:connect({
host = irc.config.server,
port = irc.config.port,
password = irc.config.password,
timeout = irc.config.timeout,
reconnect = irc.config.reconnect,
secure = irc.config.secure
})
end)
require = old_require
if not good then
minetest.log("error", ("IRC: Connection error: %s: %s -- Reconnecting in ten minutes...")
:format(self.config.server, message))
minetest.after(600, function() self:connect() end)
minetest.log("error", ("IRC: Connection error: %s: %s -- Reconnecting in %d seconds...")
:format(irc.config.server, message, irc.config.reconnect))
minetest.after(irc.config.reconnect, function() irc.connect() end)
return
end
if self.config.NSPass then
self:say("NickServ", "IDENTIFY "..self.config.NSPass)
if irc.config.NSPass then
irc.conn:queue(irc.msgs.privmsg(
"NickServ", "IDENTIFY "..irc.config.NSPass))
end
self.conn:join(self.config.channel, self.config.key)
self.connected = true
irc.conn:join(irc.config.channel, irc.config.key)
irc.connected = true
minetest.log("action", "IRC: Connected!")
minetest.chat_send_all("IRC: Connected!")
end
function irc:disconnect(message)
if self.connected then
--The OnDisconnect hook will clear self.connected and print a disconnect message
self.conn:disconnect(message)
function irc.disconnect(message)
if irc.connected then
--The OnDisconnect hook will clear irc.connected and print a disconnect message
irc.conn:disconnect(message)
end
end
-- Split messages into smaller messages of this size to avoid cutting
-- off large messages at the end.
-- Note: RFC 2812 specifies a maximum of 512 characters per "line"
-- (that includes the command, parameter(s), and the "\r\n" at the
-- end). We just use a smaller number to avoid having to compute the
-- actual max length ourselves, and because it makes it a nice round
-- number :)
local MESSAGE_CHUNK_SIZE = 400
-- Maximum message size processed.
local MESSAGE_MAX_SIZE = MESSAGE_CHUNK_SIZE * 4
function irc:say(to, message)
function irc.say(to, message)
if not message then
message = to
to = self.config.channel
to = irc.config.channel
end
to = to or self.config.channel
to = to or irc.config.channel
message = message:sub(1, MESSAGE_MAX_SIZE)
-- Split the message into MESSAGE_CHUNK_SIZE chunks and queue each
-- chunk as a separate message. The message is split into at most
-- MAX_CHUNKS chunks. The rest of the message is dropped to prevent
-- flooding and/or locking up the server.
local msglen = #message
for pos = 1, msglen, MESSAGE_CHUNK_SIZE do
-- If we have more text to show, indicate so by appending an
-- ellipsis to this line.
local endl = (pos <= (msglen - MESSAGE_CHUNK_SIZE)) and "\2[…more…]\2" or ""
self:queue(irc.msgs.privmsg(to,
message:sub(pos, pos + MESSAGE_CHUNK_SIZE - 1)..endl))
end
irc.queue(irc.msgs.privmsg(to, message))
end
function irc:reply(message)
if not self.last_from then
function irc.reply(message)
if not irc.last_from then
return
end
message = message:gsub("[\r\n%z]", " \\n ")
self:say(self.last_from, message)
irc.say(irc.last_from, message)
end
function irc:send(msg)
if not self.connected then return end
self.conn:send(msg)
function irc.send(msg)
if not irc.connected then return end
irc.conn:send(msg)
end
function irc:queue(msg)
if not self.connected then return end
self.conn:queue(msg)
function irc.queue(msg)
if not irc.connected then return end
irc.conn:queue(msg)
end
minetest.log("action", "[irc] loaded.")

2
irc

Submodule irc updated: e49a52ede1...b8d594e651

View File

@ -3,11 +3,15 @@
irc.msgs = irc.lib.msgs
function irc:sendLocal(message)
minetest.chat_send_all(message)
function irc.logChat(message)
minetest.log("action", "IRC CHAT: "..message)
end
function irc:playerMessage(name, message)
function irc.sendLocal(message)
minetest.chat_send_all(minetest.colorize(irc.config.chat_color, message))
irc.logChat(message)
end
function irc.playerMessage(name, message)
return ("<%s> %s"):format(name, message)
end

5
mod.conf Normal file
View File

@ -0,0 +1,5 @@
name = irc
description = """
This mod is just a glue between IRC and Minetest.
It provides two-way communication between the in-game chat, and an arbitrary IRC channel.
"""

View File

@ -2,50 +2,52 @@
-- See LICENSE.txt for details.
function irc:player_part(name)
if not self.joined_players[name] then
minetest.chat_send_player(name, "IRC: You are not in the channel.")
return
function irc.player_part(name)
if not irc.joined_players[name] then
return false, "You are not in the channel"
end
self.joined_players[name] = nil
minetest.chat_send_player(name, "IRC: You are now out of the channel.")
irc.joined_players[name] = nil
return true, "You left the channel"
end
function irc:player_join(name)
if self.joined_players[name] then
minetest.chat_send_player(name, "IRC: You are already in the channel.")
return
function irc.player_join(name)
if irc.joined_players[name] then
return false, "You are already in the channel"
elseif not minetest.get_player_by_name(name) then
return false, "You need to be in-game to join the channel"
end
self.joined_players[name] = true
minetest.chat_send_player(name, "IRC: You are now in the channel.")
irc.joined_players[name] = true
return true, "You joined the channel"
end
minetest.register_chatcommand("join", {
description = "Join the IRC channel",
privs = {shout=true},
func = function(name, param)
irc:player_join(name)
func = function(name)
return irc.player_join(name)
end
})
minetest.register_chatcommand("part", {
description = "Part the IRC channel",
privs = {shout=true},
func = function(name, param)
irc:player_part(name)
func = function(name)
return irc.player_part(name)
end
})
minetest.register_chatcommand("who", {
description = "Tell who is currently on the channel",
privs = {},
func = function(name, param)
local s = ""
for name, _ in pairs(irc.joined_players) do
s = s..", "..name
func = function()
local out, n = { }, 0
for plname in pairs(irc.joined_players) do
n = n + 1
out[n] = plname
end
minetest.chat_send_player(name, "Players On Channel:"..s)
table.sort(out)
return true, n.." player(s) in channel: "..table.concat(out, ", ")
end
})
@ -61,9 +63,10 @@ minetest.register_on_leaveplayer(function(player)
irc.joined_players[name] = nil
end)
function irc:sendLocal(message)
for name, _ in pairs(self.joined_players) do
minetest.chat_send_player(name, message)
function irc.sendLocal(message)
for name, _ in pairs(irc.joined_players) do
minetest.chat_send_player(name,
minetest.colorize(irc.config.chat_color, message))
end
irc.logChat(message)
end

75
settingtypes.txt Normal file
View File

@ -0,0 +1,75 @@
[Basic]
# Whether to automatically connect to the server on mod load.
# If false, you must use /irc_connect to connect.
irc.auto_connect (Auto-connect on load) bool true
# Nickname for the bot. May only contain characters A-Z, 0-9
# '{', '}', '[', ']', '|', '^', '-', or '_'.
irc.nick (Bot nickname) string Minetest
# Server to connect to.
irc.server (IRC server) string irc.freenode.net
# Server port.
# The standard IRC protocol port is 6667 for regular servers,
# or 6697 for SSL-enabled servers.
# If unsure, leave at 6667.
irc.port (IRC server port) int 6667 1 65535
# Channel the bot joins after connecting.
irc.channel (Channel to join) string ##mt-irc-mod
[Authentication]
# Password for authenticating to NickServ.
# Leave empty to not authenticate with NickServ.
irc.NSPass (NickServ password) string
# IRC server password.
# Leave empty for no password.
irc.password (Server password) string
# Password for joining the channel.
# Leave empty if your channel is not protected.
irc.key (Channel key) string
# Enable TLS connection.
# Requires LuaSEC <https://github.com/brunoos/luasec>.
irc.secure (Use TLS) bool false
# Username for SASL authentication.
# Leave empty to use the nickname.
irc.sasl.user (SASL username) string
# Password for SASL authentication.
# Leave empty to not authenticate via SASL.
irc.sasl.pass (SASL password) string
[Advanced]
# Enable this to make the bot send messages when players join
# or leave the game server.
irc.send_join_part (Send join and part messages) bool true
# Enable this to make the bot send messages when players are kicked.
irc.send_kicks (Send kick messages) bool false
# Underlying socket timeout in seconds.
irc.timeout (Timeout) int 60 1
# Time between reconnection attempts, in seconds.
irc.reconnect (Reconnect delay) int 600 1
# Prefix to use for bot commands.
irc.command_prefix (Command prefix) string
# Enable debug output.
irc.debug (Debug mode) bool false
# Whether to enable players joining and parting the channel.
irc.enable_player_part (Allow player join/part) bool true
# Whether to automatically show players in the channel when they join.
irc.auto_join (Auto join players) bool true