2018-11-11 06:00:28 +02:00
-- 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 '
2018-11-26 03:07:03 +02:00
require ' utils.table '
2018-11-17 13:56:03 +02:00
local Hodor = require ' resources.hodor_messages '
2018-11-11 06:00:28 +02:00
2018-11-17 15:22:51 +02:00
local prefix = ' ## - '
2018-11-11 19:12:38 +02:00
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. ' }
2018-11-11 06:00:28 +02:00
}
2018-11-26 08:49:18 +02:00
--- Check for player and get player
local function get_player ( event )
2018-11-11 06:00:28 +02:00
-- player_index is nil if the message came from the server,
-- and indexing Game.players with nil is apparently an error.
local player_index = event.player_index
if not player_index then
2018-11-26 17:50:06 +02:00
return nil
2018-11-11 06:00:28 +02:00
end
2018-11-22 14:17:07 +02:00
local player = Game.get_player_by_index ( event.player_index )
2018-11-11 06:00:28 +02:00
if not player or not player.valid then
2018-11-26 17:50:06 +02:00
return nil
2018-11-11 06:00:28 +02:00
end
2018-11-26 08:49:18 +02:00
return player
end
2018-11-17 13:56:03 +02:00
2018-11-26 08:49:18 +02:00
--- Emulates the discord bot hodor's reaction to his name
local function hodor ( event )
-- first check for a match, since 99% of messages aren't a match for 'hodor'
local message = event.message : lower ( )
if message : match ( ' hodor ' ) then
game.print ( ' Hodor: ' .. table.get_random_weighted ( Hodor , 1 , 2 ) )
end
end
--- Automatically responds to preset trigger words
local function auto_respond ( event )
local message = event.message : lower ( )
local player = get_player ( event )
if player and not player.admin then
2018-11-11 19:12:38 +02:00
for trigger , replies in pairs ( auto_replies ) do
if message : match ( trigger ) then
for _ , reply in pairs ( replies ) do
player.print ( reply )
2018-11-11 06:00:28 +02:00
end
end
end
end
2018-11-26 08:49:18 +02:00
end
2018-11-11 06:00:28 +02:00
2018-11-26 08:49:18 +02:00
--- Create notifications when a player's name is mentioned
local function mentions ( event )
2018-11-27 21:12:50 +02:00
-- Gives a sound notification to a mentioned player using #[player-name], [player-name]#, @[player-name], [player-name]@ or to admins with admin with prefix or postfix
2018-11-26 08:49:18 +02:00
local missing_player_string
local not_found = 0
local cannot_mention = { }
local player = get_player ( event )
if not player or not player.valid then
return
2018-11-11 06:00:28 +02:00
end
2018-11-15 16:06:03 +02:00
2018-11-26 08:49:18 +02:00
for w in event.message : gmatch ( ' %S+ ' ) do
local word = w : lower ( )
local trimmed_word = string.sub ( word , 0 , string.len ( word ) - 1 )
local first_char = string.sub ( word , 0 , 1 )
local last_char = string.sub ( word , string.len ( word ) )
local success = false
local admin_call = false
2018-11-27 21:12:50 +02:00
if ( first_char ~= ' # ' and last_char ~= ' # ' ) and ( first_char ~= ' @ ' and last_char ~= ' @ ' ) then
2018-11-26 08:49:18 +02:00
success = true
end
if not success then
for _ , p in ipairs ( game.connected_players ) do
local word_front_trim = string.sub ( word , 2 , string.len ( word ) )
local word_back_trim = trimmed_word
local word_front_back_trim = string.sub ( word_front_trim , 0 , string.len ( word_front_trim ) - 1 )
local word_back_double_trim = string.sub ( word_back_trim , 0 , string.len ( word_back_trim ) - 1 )
2018-11-27 21:12:50 +02:00
if word_front_trim == ' admin ' or word_back_trim == ' admin ' or word_back_double_trim == ' admin ' or word_front_back_trim == ' admin ' then
admin_call = true
word = ' admin '
end
2018-11-26 08:49:18 +02:00
if admin_call and p.admin then
2018-11-27 02:23:12 +02:00
local message = string.format ( ' %s%s mentioned %s! ' , prefix , Game.get_player_by_index ( event.player_index ) . name , word )
p.print ( message , { r = 1 , g = 1 , b = 0 , a = 1 } )
2018-11-26 08:49:18 +02:00
p.play_sound { path = ' utility/new_objective ' , volume_modifier = 1 }
success = true
end
if not admin_call and ( p.name : lower ( ) == word_front_trim or p.name : lower ( ) == word_back_trim or p.name : lower ( ) == word_back_double_trim or p.name : lower ( ) == word_front_back_trim ) then
if p.name == player.name then
2018-11-18 14:26:15 +02:00
if _DEBUG then
2018-11-26 08:49:18 +02:00
player.print ( prefix .. " Can't mention yourself! " , { r = 1 , g = 0 , b = 0 , a = 1 } )
2018-11-18 14:26:15 +02:00
end
2018-11-26 08:49:18 +02:00
success = true
break
2018-11-15 16:06:03 +02:00
end
2018-11-26 08:49:18 +02:00
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
2018-11-15 16:06:03 +02:00
end
end
2018-11-17 15:22:51 +02:00
end
2018-11-26 08:49:18 +02:00
if not success then
if admin_call then
word = ' no ' .. word .. ' s online! '
2018-11-15 17:03:46 +02:00
end
2018-11-26 08:49:18 +02:00
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 } )
2018-11-17 15:22:51 +02:00
end
2018-11-15 16:06:03 +02:00
end
2018-11-11 06:00:28 +02:00
end
2018-11-26 08:49:18 +02:00
local function on_console_chat ( event )
if global.config . hodor then
hodor ( event )
end
if global.config . auto_respond then
auto_respond ( event )
end
if global.config . mentions then
mentions ( event )
end
end
2018-11-18 14:26:15 +02:00
2018-11-26 08:49:18 +02:00
Event.add ( defines.events . on_console_chat , on_console_chat )