script_name("Shut Up")
script_author("Maku Kenesu")
require "lib.moonloader"
require "lib.sampfuncs"
local ev = require "lib.samp.events"
local inicfg = require "inicfg"
------------------------------------------------------------
-- BASIC CONFIG
------------------------------------------------------------
local PRIMARY_COLOR = 0xFF5A5A
local LABEL_COLOR = "{FF5A5A}" -- primary cool red
local ACCENT_COLOR = "{00CED1}" -- accent teal
local label = LABEL_COLOR .. "[Shut Up]{FFFFFF} "
local iniFilePath = "ShutUp.ini"
-- Load or create INI
local config = inicfg.load({
global = {},
newbie = {},
anywhere = {}
}, iniFilePath)
------------------------------------------------------------
-- HELPERS
------------------------------------------------------------
local function saveConfig()
inicfg.save(config, iniFilePath)
end
-- Ensure the INI file exists on first run
if not doesFileExist(iniFilePath) then
saveConfig()
end
local function cleanName(name)
if not name then return "" end
return name:gsub("_", " "):lower()
end
local function formatName(name)
return (name:gsub("(%a)([%w_']*)", function(first, rest)
return first:upper() .. rest:lower()
end))
end
local function nameInTable(tbl, name)
local checkName = cleanName(name)
for _, n in ipairs(tbl) do
if cleanName(n) == checkName then return true end
end
return false
end
local function removeName(tbl, name)
local checkName = cleanName(name)
for i, n in ipairs(tbl) do
if cleanName(n) == checkName then
table.remove(tbl, i)
return true
end
end
return false
end
------------------------------------------------------------
-- CHAT FILTER
------------------------------------------------------------
function ev.onServerMessage(color, text)
for _, n in ipairs(config.anywhere) do
if text:lower():find(cleanName(n)) then
sampAddChatMessage(label .. "[Blocked Chat Anywhere]: " .. formatName(n), PRIMARY_COLOR)
return false
end
end
local globalName = text:match("%(%(.-%s([%w_]+%s?[%w_]*)%:%s")
if globalName and nameInTable(config.global, globalName) then
sampAddChatMessage(label .. "[Blocked Global Chat]: " .. formatName(globalName), PRIMARY_COLOR)
return false
end
local newbieName = text:match("%*%*%s.-%s([%w_]+%s?[%w_]*)%:%s")
if newbieName and nameInTable(config.newbie, newbieName) then
sampAddChatMessage(label .. "[Blocked Newbie Chat]: " .. formatName(newbieName), PRIMARY_COLOR)
return false
end
end
------------------------------------------------------------
-- MAIN LOOP / COMMANDS
------------------------------------------------------------
function main()
while not isSampAvailable() do wait(100) end
sampAddChatMessage(label .. "loaded. Type /shutup.help for commands.", PRIMARY_COLOR)
sampRegisterChatCommand("shutup.help", function()
sampAddChatMessage(LABEL_COLOR .. "====== Shut Up Commands ======", PRIMARY_COLOR)
sampAddChatMessage(ACCENT_COLOR .. "/shutup.g [Name]{FFFFFF} - Block player's global chat messages", PRIMARY_COLOR)
sampAddChatMessage(ACCENT_COLOR .. "/shutup.n [Name]{FFFFFF} - Block player's newbie messages", PRIMARY_COLOR)
sampAddChatMessage(ACCENT_COLOR .. "/shutthefuckup [Name]{FFFFFF} - Block player's chat anywhere", PRIMARY_COLOR)
sampAddChatMessage(ACCENT_COLOR .. "/noshutup.g [Name]{FFFFFF} - Unblock player's global chat messages", PRIMARY_COLOR)
sampAddChatMessage(ACCENT_COLOR .. "/noshutup.n [Name]{FFFFFF} - Unblock player's newbie", PRIMARY_COLOR)
sampAddChatMessage(ACCENT_COLOR .. "/noshutthefuckup [Name]{FFFFFF} - Unblock player's chat anywhere", PRIMARY_COLOR)
sampAddChatMessage(ACCENT_COLOR .. "/shutup.list{FFFFFF} - Show blocked list", PRIMARY_COLOR)
end)
sampRegisterChatCommand("shutup.g", function(param)
if not param or param == "" then
sampAddChatMessage(label .. "Usage: /shutup.g [Name]", PRIMARY_COLOR)
return
end
local cleaned = cleanName(param)
if not nameInTable(config.global, cleaned) then
table.insert(config.global, cleaned)
saveConfig()
sampAddChatMessage(label .. "Blocked " .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} in global.", PRIMARY_COLOR)
else
sampAddChatMessage(label .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} already blocked in global.", PRIMARY_COLOR)
end
end)
sampRegisterChatCommand("shutup.n", function(param)
if not param or param == "" then
sampAddChatMessage(label .. "Usage: /shutup.n [Name]", PRIMARY_COLOR)
return
end
local cleaned = cleanName(param)
if not nameInTable(config.newbie, cleaned) then
table.insert(config.newbie, cleaned)
saveConfig()
sampAddChatMessage(label .. "Blocked " .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} in newbie.", PRIMARY_COLOR)
else
sampAddChatMessage(label .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} already blocked in newbie.", PRIMARY_COLOR)
end
end)
sampRegisterChatCommand("shutthefuckup", function(param)
if not param or param == "" then
sampAddChatMessage(label .. "Usage: /shutup.a [Name]", PRIMARY_COLOR)
return
end
local cleaned = cleanName(param)
removeName(config.global, cleaned)
removeName(config.newbie, cleaned)
if not nameInTable(config.anywhere, cleaned) then
table.insert(config.anywhere, cleaned)
saveConfig()
sampAddChatMessage(label .. "Blocked " .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} everywhere.", PRIMARY_COLOR)
else
sampAddChatMessage(label .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} already blocked everywhere.", PRIMARY_COLOR)
end
end)
sampRegisterChatCommand("noshutup.g", function(param)
local cleaned = cleanName(param)
if removeName(config.global, cleaned) then
saveConfig()
sampAddChatMessage(label .. "Unblocked " .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} from global.", PRIMARY_COLOR)
else
sampAddChatMessage(label .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} not found in global.", PRIMARY_COLOR)
end
end)
sampRegisterChatCommand("noshutup.n", function(param)
local cleaned = cleanName(param)
if removeName(config.newbie, cleaned) then
saveConfig()
sampAddChatMessage(label .. "Unblocked " .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} from newbie.", PRIMARY_COLOR)
else
sampAddChatMessage(label .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} not found in newbie.", PRIMARY_COLOR)
end
end)
sampRegisterChatCommand("shutthefuckup", function(param)
local cleaned = cleanName(param)
if removeName(config.anywhere, cleaned) then
saveConfig()
sampAddChatMessage(label .. "Unblocked " .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} from anywhere.", PRIMARY_COLOR)
else
sampAddChatMessage(label .. ACCENT_COLOR .. formatName(cleaned) .. "{FFFFFF} not found in anywhere.", PRIMARY_COLOR)
end
end)
sampRegisterChatCommand("shutup.list", function()
local function formatList(tbl)
local arr = {}
for _, n in ipairs(tbl) do
table.insert(arr, formatName(n))
end
return table.concat(arr, ", ")
end
sampAddChatMessage(LABEL_COLOR .. "==== Blocked Names ====", PRIMARY_COLOR)
sampAddChatMessage("{FFFFFF}Global: " .. ACCENT_COLOR .. formatList(config.global), PRIMARY_COLOR)
sampAddChatMessage("{FFFFFF}Newbie: " .. ACCENT_COLOR .. formatList(config.newbie), PRIMARY_COLOR)
sampAddChatMessage("{FFFFFF}Anywhere: " .. ACCENT_COLOR .. formatList(config.anywhere), PRIMARY_COLOR)
end)
end