mirror of
https://github.com/Mestima/GM-Discord.git
synced 2025-05-03 12:50:15 +00:00
Main files upload
Core files uploaded
This commit is contained in:
parent
7799c14659
commit
5d03d97b72
189
lua/autorun/client/discord.lua
Normal file
189
lua/autorun/client/discord.lua
Normal file
@ -0,0 +1,189 @@
|
||||
--[[
|
||||
COPYRIGHT:
|
||||
Made by Mestima © 2019
|
||||
|
||||
if (this addon using api.nilored server) then
|
||||
I don't allow you to modify this addon.
|
||||
I don't allow you to share this addon.
|
||||
This addon using MY API server. I don't want billions of people to use my api server.
|
||||
If you want to modify this addon, please contact me before or get the source code from my GitHub.
|
||||
else
|
||||
If you're reading this at the GitHub, you need to know
|
||||
that this script is licensed under the GPLv3 License (https://www.gnu.org/licenses/gpl-3.0.html)
|
||||
Copyright removing is NOT allowed!
|
||||
|
||||
If you're using this type of GM-Discord addon that licensed under GPLv3 license,
|
||||
you are NOT allowed to use api.nilored server.
|
||||
end
|
||||
|
||||
http://steamcommunity.com/id/mestima
|
||||
http://github.com/Mestima
|
||||
]]
|
||||
|
||||
net.Receive("DiscordToGmod", function()
|
||||
local username = net.ReadString()
|
||||
local message = net.ReadString()
|
||||
chat.AddText(Color(66, 140, 244, 255), "[Discord] ", Color(145, 191, 255, 255), username, Color(255, 255, 255, 255), ": ", Color(255, 255, 255, 255), message)
|
||||
end)
|
||||
|
||||
local function OpenDiscordSettings(ply)
|
||||
if !ply:IsSuperAdmin() then return end
|
||||
|
||||
local frame = vgui.Create("DFrame")
|
||||
frame:SetSize(700, 390)
|
||||
frame:SetPos(ScrW()/2-350, ScrH()/2-250)
|
||||
frame:SetTitle("Discord Settings")
|
||||
frame:MakePopup()
|
||||
frame.Paint = function(s,w,h) draw.RoundedBox(0,0,0,w,h,Color(0,0,0,200)) end
|
||||
|
||||
local mode = vgui.Create("DComboBox", frame)
|
||||
mode:SetSize(335, 25)
|
||||
mode:SetPos(10, 25)
|
||||
mode:SetValue("Select Mode")
|
||||
mode:AddChoice("Sandbox")
|
||||
mode:AddChoice("DarkRP")
|
||||
|
||||
local type = vgui.Create("DComboBox", frame)
|
||||
type:SetSize(335, 25)
|
||||
type:SetPos(355, 25)
|
||||
type:SetValue("Select Type")
|
||||
type:AddChoice("Embed")
|
||||
type:AddChoice("Simple")
|
||||
|
||||
local whook = vgui.Create("DTextEntry", frame)
|
||||
whook:SetSize(680, 25)
|
||||
whook:SetPos(10, 55)
|
||||
whook:SetText("Webhook Link")
|
||||
|
||||
local col = vgui.Create("DTextEntry", frame)
|
||||
col:SetSize(680, 25)
|
||||
col:SetPos(10, 85)
|
||||
col:SetText("HTML Color")
|
||||
|
||||
local tok = vgui.Create("DTextEntry", frame)
|
||||
tok:SetSize(680, 25)
|
||||
tok:SetPos(10, 115)
|
||||
tok:SetText("Discord App token")
|
||||
|
||||
local chan = vgui.Create("DTextEntry", frame)
|
||||
chan:SetSize(680, 25)
|
||||
chan:SetPos(10, 145)
|
||||
chan:SetText("Discord Channel")
|
||||
|
||||
local butts = {
|
||||
{
|
||||
name = "Set Mode",
|
||||
f = function()
|
||||
val = mode:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("mode")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
chat.AddText("Discord mode has been set to " .. val)
|
||||
end
|
||||
},
|
||||
{
|
||||
name = "Set Type",
|
||||
f = function()
|
||||
local val = type:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("type")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
chat.AddText("Discord type has been set to " .. val)
|
||||
end
|
||||
},
|
||||
{
|
||||
name = "Set Webhook",
|
||||
f = function()
|
||||
local val = whook:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("webhook")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
chat.AddText("Discord webhook has been set to " .. val)
|
||||
end
|
||||
},
|
||||
{
|
||||
name = "Set Color",
|
||||
f = function()
|
||||
local val = col:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("color")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
chat.AddText("Discord embed color has been set to " .. val)
|
||||
end
|
||||
},
|
||||
{
|
||||
name = "Set Discord App token",
|
||||
f = function()
|
||||
local val = tok:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("token")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
chat.AddText("Discord App token has been set to " .. val)
|
||||
end
|
||||
},
|
||||
{
|
||||
name = "Set Discord Channel",
|
||||
f = function()
|
||||
local val = chan:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("channel")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
chat.AddText("Discord Channel has been set to " .. val)
|
||||
end
|
||||
},
|
||||
{
|
||||
name = "Set All",
|
||||
f = function()
|
||||
local val = col:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("color")
|
||||
net.WriteString(col:GetValue())
|
||||
net.SendToServer()
|
||||
local val = whook:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("webhook")
|
||||
net.WriteString(whook:GetValue())
|
||||
net.SendToServer()
|
||||
local val = type:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("type")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
val = mode:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("mode")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
local val = chan:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("channel")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
local val = tok:GetValue()
|
||||
net.Start("DiscordUpdate")
|
||||
net.WriteString("token")
|
||||
net.WriteString(val)
|
||||
net.SendToServer()
|
||||
chat.AddText("All Discord settings was updated!")
|
||||
end
|
||||
}
|
||||
}
|
||||
local panel = vgui.Create("DScrollPanel", frame)
|
||||
panel:SetPos(10, 175)
|
||||
panel:SetSize(680, 210)
|
||||
for k,v in pairs(butts) do
|
||||
local butt = panel:Add("DButton")
|
||||
butt:SetText(v.name)
|
||||
butt:SetSize(680, 25)
|
||||
butt:Dock(TOP)
|
||||
butt:DockMargin(0, 0, 0, 5)
|
||||
butt.DoClick = v.f
|
||||
end
|
||||
end
|
||||
concommand.Add("Discord", OpenDiscordSettings)
|
217
lua/autorun/server/discord.lua
Normal file
217
lua/autorun/server/discord.lua
Normal file
@ -0,0 +1,217 @@
|
||||
--[[
|
||||
COPYRIGHT:
|
||||
Made by Mestima © 2019
|
||||
|
||||
if (this addon using api.nilored server) then
|
||||
I don't allow you to modify this addon.
|
||||
I don't allow you to share this addon.
|
||||
This addon using MY API server. I don't want billions of people to use my api server.
|
||||
If you want to modify this addon, please contact me before or get the source code from my GitHub.
|
||||
else
|
||||
If you're reading this at the GitHub, you need to know
|
||||
that this script is licensed under the GPLv3 License (https://www.gnu.org/licenses/gpl-3.0.html)
|
||||
Copyright removing is NOT allowed!
|
||||
|
||||
If you're using this type of GM-Discord addon that licensed under GPLv3 license,
|
||||
you are NOT allowed to use api.nilored server.
|
||||
end
|
||||
|
||||
http://steamcommunity.com/id/mestima
|
||||
http://github.com/Mestima
|
||||
]]
|
||||
|
||||
DiscordSettings = {
|
||||
settings = {
|
||||
mode = "Sandbox", -- Sandbox/DarkRP
|
||||
type = "Simple", -- Embed or Simple
|
||||
webhook = "https://discordapp.com/api/webhooks/GuildID/TOKEN",
|
||||
color = 15258703, -- Decimal color (https://convertingcolors.com/decimal-color-15258703.html)
|
||||
token = "TOKEN",
|
||||
channel = "channel_id",
|
||||
admins = {} -- Supports ULX admin mode! (ULX only!)
|
||||
}
|
||||
}
|
||||
|
||||
function DiscordSettings:Save()
|
||||
file.Write("discord.txt", util.TableToJSON(self.settings))
|
||||
end
|
||||
function DiscordSettings:Load()
|
||||
if !file.Exists("discord.txt", "DATA") then self:Save() end
|
||||
self.settings = util.JSONToTable(file.Read("discord.txt", "DATA"))
|
||||
end
|
||||
|
||||
local function SaveDiscordStorage(tbl)
|
||||
file.Write("discord_storage.txt", util.TableToJSON(tbl))
|
||||
end
|
||||
if !file.Exists("discord_storage.txt", "DATA") then
|
||||
local init = {
|
||||
last = 1,
|
||||
msg = {}
|
||||
}
|
||||
SaveDiscordStorage(init)
|
||||
end
|
||||
|
||||
--[[ Network ]]
|
||||
util.AddNetworkString("DiscordToGmod")
|
||||
util.AddNetworkString("DiscordUpdate")
|
||||
net.Receive("DiscordUpdate", function(len,ply)
|
||||
if !ply:IsSuperAdmin() then return end
|
||||
local type = net.ReadString()
|
||||
local var = net.ReadString()
|
||||
DiscordSettings.settings[type] = var
|
||||
DiscordSettings:Save()
|
||||
end)
|
||||
|
||||
--[[ Load Data ]]
|
||||
DiscordSettings:Load()
|
||||
DiscordStorage = util.JSONToTable(file.Read("discord_storage.txt", "DATA"))
|
||||
|
||||
--[[ Discord Messages ]]
|
||||
local function GetFromDiscord(body, len, headers, code) -- yeah, I know, so shitty function
|
||||
local content = util.JSONToTable(body)
|
||||
for i = DiscordStorage.last, #content do
|
||||
if content[i].author.bot == true then goto skip end
|
||||
for k,v in pairs(DiscordStorage.msg) do if v == content[i].id then goto skip end end
|
||||
|
||||
table.insert(DiscordStorage.msg, content[i].id)
|
||||
local tbl = {
|
||||
last = i, -- Don't forget to make small oprimization :)
|
||||
msg = DiscordStorage.msg
|
||||
}
|
||||
SaveDiscordStorage(tbl)
|
||||
local username = content[i].author.username
|
||||
local msg = content[i].content
|
||||
local uid = tostring(content[i].author.id)
|
||||
|
||||
local len = string.len(msg)
|
||||
if len > 4 then
|
||||
if string.sub(msg,1,1) == "!" then
|
||||
if DiscordSettings.settings.admins[uid] then
|
||||
local command = string.sub(msg, 2, len)
|
||||
game.ConsoleCommand("ulx "..command.."\n")
|
||||
goto skip
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
net.Start("DiscordToGmod")
|
||||
net.WriteString(username)
|
||||
net.WriteString(msg)
|
||||
net.Broadcast()
|
||||
::skip:: -- why don't I use 'continue' operator?
|
||||
end
|
||||
end
|
||||
timer.Create("DiscordMessageGetter", 3, 0, function()
|
||||
if not DiscordSettings then return end
|
||||
if not DiscordSettings.settings then return end
|
||||
if DiscordSettings.settings.token == "TOKEN" or DiscordSettings.settings.channel == "channel_id" then return end
|
||||
http.Fetch("http://yourwebserver.com/request.php?channel="..DiscordSettings.settings.channel.."&token="..DiscordSettings.settings.token, GetFromDiscord) -- CHANGE URL HERE
|
||||
end)
|
||||
|
||||
--[[ Avatar Loading ]]
|
||||
DiscordAvatar = {}
|
||||
local function GetSteamAvatar(ply)
|
||||
http.Fetch("https://steamcommunity.com/profiles/".. ply:SteamID64() .."?xml=1", function(body)
|
||||
local p1,p2 = string.find(body, "<avatarFull><!%[CDATA%[.-%]%]></avatarFull>")
|
||||
if (p1 && p2) then
|
||||
p1 = p1+21
|
||||
p2 = p2-16
|
||||
local id = ply:SteamID()
|
||||
if !DiscordAvatar[id] then
|
||||
DiscordAvatar[id] = string.sub(body, p1, p2)
|
||||
end
|
||||
end
|
||||
end,
|
||||
function()
|
||||
error("Error. Steam api is down.")
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
--[[ Message Filtering Functions ]]
|
||||
local SendFunctions = {
|
||||
DarkRP = function(p,m,t)
|
||||
local msg = m
|
||||
if string.len(msg) < 4 then return false end
|
||||
if string.sub(msg,1,3) == "///" then return false end
|
||||
if string.sub(msg,1,3) == "/ad" then return false end
|
||||
if string.sub(msg,1,2) ~= "//" && string.sub(msg,1,2) ~= "/a" && string.sub(msg,1,4) ~= "/ooc" then return false end
|
||||
|
||||
msg = string.gsub(msg,"// ","")
|
||||
msg = string.gsub(msg,"/a ","")
|
||||
msg = string.gsub(msg,"/ooc ","")
|
||||
local name = ""
|
||||
|
||||
if t == true then name = name .. "(TEAM) " end
|
||||
if p:Alive() == false then name = name .. "*DEAD* " end
|
||||
name = name .. p:Nick()
|
||||
return true, msg, name
|
||||
end,
|
||||
Sandbox = function(p,m,t)
|
||||
local msg = m
|
||||
local name = ""
|
||||
|
||||
if t == true then name = name .. "(TEAM) " end
|
||||
if p:Alive() == false then name = name .. "*DEAD* " end
|
||||
name = name .. p:Nick()
|
||||
return true, msg, name
|
||||
end
|
||||
}
|
||||
|
||||
--[[ Transfer Function ]]
|
||||
local function DiscordRelay(ply, text, team)
|
||||
if !IsValid(ply) || !ply:IsPlayer() then return end
|
||||
if !DiscordSettings || !DiscordSettings.settings then return end
|
||||
|
||||
local flag, msg, uname = SendFunctions[DiscordSettings.settings.mode](ply, text, team)
|
||||
if !flag then return end
|
||||
|
||||
local data = {
|
||||
username = uname,
|
||||
avatar_url = DiscordAvatar[ply:SteamID()],
|
||||
content = msg
|
||||
}
|
||||
|
||||
if DiscordSettings.settings.type == "Embed" then -- Embed settings
|
||||
data = {
|
||||
username = uname,
|
||||
avatar_url = DiscordAvatar[ply:SteamID()],
|
||||
embeds = {
|
||||
{
|
||||
author = {
|
||||
name = msg
|
||||
},
|
||||
color = DiscordSettings.settings.color
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
http.Post("http://yourwebserver.com/send.php", { -- CHANGE URL HERE
|
||||
webhook = DiscordSettings.settings.webhook,
|
||||
content = util.TableToJSON(data),
|
||||
})
|
||||
end
|
||||
|
||||
--[[ Garbage Collector ]]
|
||||
local function ClearCache(ply)
|
||||
local id = ply:SteamID()
|
||||
if !DiscordAvatar[id] then return end
|
||||
DiscordAvatar[id] = nil
|
||||
end
|
||||
hook.Add("PlayerSay", "DiscordRelay", DiscordRelay)
|
||||
hook.Add("PlayerDisconnected", "DiscordClearCache", ClearCache)
|
||||
hook.Add("PlayerInitialSpawn", "DiscordAvatarInit", GetSteamAvatar)
|
||||
|
||||
concommand.Add("Discord_AddAdmin", function(ply, cmd, args)
|
||||
if IsValid(ply) and !ply:IsSuperAdmin() then return end
|
||||
if !args[1] then return end
|
||||
DiscordSettings.settings.admins[tostring(args[1])] = true
|
||||
DiscordSettings:Save()
|
||||
end)
|
||||
concommand.Add("Discord_RemoveAdmin", function(ply, cmd, args)
|
||||
if IsValid(ply) and !ply:IsSuperAdmin() then return end
|
||||
if !args[1] then return end
|
||||
DiscordSettings.settings.admins[tostring(args[1])] = nil
|
||||
DiscordSettings:Save()
|
||||
end)
|
Loading…
x
Reference in New Issue
Block a user