mirror of
https://github.com/Refactorio/RedMew.git
synced 2024-12-12 10:04:40 +02:00
168 lines
6.0 KiB
Lua
168 lines
6.0 KiB
Lua
-- This feature auto-responds to key words or phrases. We use the name/actor Hodor because it is Redmew's beloved discord bot.
|
|
|
|
local Game = require 'utils.game'
|
|
local Event = require 'utils.event'
|
|
require 'utils.list_utils'
|
|
local Hodor = require 'resources.hodor_messages'
|
|
|
|
local prefix = '## - '
|
|
|
|
global.mention_enabled = true
|
|
|
|
local auto_replies = {
|
|
['discord'] = {'Did you ask about our discord server?', 'You can find it here: redmew.com/discord'},
|
|
['patreon'] = {'Did you ask about our patreon?', 'You can find it here: patreon.com/redmew'},
|
|
['donate'] = {'Did you ask about donating to the server?', 'You can find our patreon here: patreon.com/redmew'},
|
|
['grief'] = {'To report grief please use the /report function.', 'If no admins are online use #moderation-requests on the discord and make sure the @mention the appropriate role.'}
|
|
}
|
|
|
|
global.naughty_words_enabled = false
|
|
global.naughty_words = {
|
|
['ass'] = true,
|
|
['bugger'] = true,
|
|
['butt'] = true,
|
|
['bum'] = true,
|
|
['bummer'] = true,
|
|
['christ'] = true,
|
|
['crikey'] = true,
|
|
['darn'] = true,
|
|
['dam'] = true,
|
|
['damn'] = true,
|
|
['dang'] = true,
|
|
['dagnabit'] = true,
|
|
['dagnabbit'] = true,
|
|
['drat'] = true,
|
|
['fart'] = true,
|
|
['feck'] = true,
|
|
['frack'] = true,
|
|
['freaking'] = true,
|
|
['frick'] = true,
|
|
['gay'] = true,
|
|
['gee'] = true,
|
|
['geez'] = true,
|
|
['git'] = true,
|
|
['god'] = true,
|
|
['golly'] = true,
|
|
['gosh'] = true,
|
|
['heavens'] = true,
|
|
['heck'] = true,
|
|
['hell'] = true,
|
|
['holy'] = true,
|
|
['jerk'] = true,
|
|
['jesus'] = true,
|
|
['petes'] = true,
|
|
["pete's"] = true,
|
|
['poo'] = true,
|
|
['satan'] = true,
|
|
['willy'] = true,
|
|
['wee'] = true,
|
|
['yikes'] = true
|
|
}
|
|
|
|
local function hodor(event)
|
|
local message = event.message:lower()
|
|
|
|
if message:match('hodor') then
|
|
|
|
game.print('Hodor: ' .. table.get_random_weighted(Hodor, 1, 2))
|
|
end
|
|
|
|
-- player_index is nil if the message came from the server,
|
|
-- and indexing Game.players with nil is apparently an error.
|
|
local player = Game.get_player_by_index(event.player_index)
|
|
local player_index = event.player_index
|
|
if not player_index then
|
|
return
|
|
end
|
|
|
|
if not player or not player.valid then
|
|
return
|
|
end
|
|
|
|
if not player.admin then
|
|
for trigger, replies in pairs(auto_replies) do
|
|
if message:match(trigger) then
|
|
for _, reply in pairs(replies) do
|
|
player.print(reply)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if global.naughty_words_enabled then
|
|
local naughty_words = global.naughty_words
|
|
for word in message:gmatch('%S+') do
|
|
if naughty_words[word] then
|
|
game.print(player.name .. ' this is a Christian Factorio server, no swearing please!')
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Gives a sound notification to a mentioned player using #[player-name]
|
|
if global.mention_enabled then
|
|
local missing_player_string
|
|
local not_found = 0
|
|
local cannot_mention = {}
|
|
for word in event.message:gmatch('%S+') do
|
|
local lower_word = word:lower()
|
|
local trimmed_word = string.sub(word, 0, string.len(word)-1)
|
|
local lower_trimmed_word = string.sub(lower_word, 0, string.len(lower_word)-1)
|
|
local success = false
|
|
local admin_call = false
|
|
if lower_word == 'admin' or lower_word == 'moderator' or lower_trimmed_word == 'admin' or lower_trimmed_word == 'moderator' then
|
|
admin_call = true
|
|
end
|
|
print(string.sub(word, 0, 1))
|
|
if not admin_call and string.sub(word, 0, 1) ~= '#' then
|
|
break;
|
|
end
|
|
for _, p in ipairs(game.connected_players) do
|
|
word = (lower_trimmed_word == 'admin' or lower_trimmed_word == 'moderator') and trimmed_word or word
|
|
if admin_call and p.admin then
|
|
p.print(prefix..Game.get_player_by_index(event.player_index).name..' mentioned '..word..'!', {r = 1, g = 1, b = 0, a = 1})
|
|
p.play_sound{path='utility/new_objective', volume_modifier = 1 }
|
|
success = true
|
|
end
|
|
|
|
if not admin_call and ('#'..p.name == word or '#'..p.name == trimmed_word) then
|
|
if p.name == player.name then
|
|
if _DEBUG then
|
|
player.print(prefix..'Can\'t mention yourself!', {r = 1, g = 0, b = 0, a = 1})
|
|
end
|
|
success = true
|
|
break;
|
|
end
|
|
p.print(prefix..Game.get_player_by_index(event.player_index).name..' mentioned you!', {r = 1, g = 1, b = 0, a = 1})
|
|
p.play_sound{path='utility/new_objective', volume_modifier = 1 }
|
|
success = true
|
|
if _DEBUG then
|
|
player.print(prefix..'Successful mentioned '..p.name, {r = 0, g = 1, b = 0, a = 1})
|
|
end
|
|
break;
|
|
end
|
|
end
|
|
if not success then
|
|
if admin_call then
|
|
word = 'no '.. word .. 's online!'
|
|
end
|
|
not_found = not_found + 1
|
|
table.insert(cannot_mention, (word .. ', '))
|
|
end
|
|
end
|
|
for _, pname in ipairs(cannot_mention) do
|
|
missing_player_string = missing_player_string~=nil and missing_player_string .. pname or pname
|
|
end
|
|
if missing_player_string ~= nil then
|
|
missing_player_string = string.sub(missing_player_string, 1, (string.len(missing_player_string)-2))
|
|
if not_found > 1 then
|
|
player.print(prefix..'Players not found: ' .. missing_player_string, {r = 1, g = 1, b = 0, a = 1})
|
|
else
|
|
player.print(prefix..'Player not found: ' .. missing_player_string, {r = 1, g = 1, b = 0, a = 1})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
Event.add(defines.events.on_console_chat, hodor)
|