Lesh
Lesh

Reputation: 3

JSON.Lua json.encode return nil

I'm new to LUA and tried learning coding this language with Garrys Mod.

I want to get the messages from the Garrys Mod chat and send them into a Discord channel with a webhook.

It works, but I tried expanding this project with embeded messages. I need JSON for this and used json.lua as a library.

But as soon as I send a message I retrieve the following error message:

attempt to index global 'json' (a nil value)

The code that causes the error is the following:

json.encode({ { 
        ["embeds"] = { 
            ["description"] = text, 
            ["author"] = { 
                ["name"] = ply:Nick()
            }, 
        }, 
    } }),

The complete code:

AddCSLuaFile()
json = require("json")

webhookURL = "https://discordapp.com/api/webhooks/XXX"
local DiscordWebhook = DiscordWebhook or {}

hook.Add( "PlayerSay", "SendMsg", function( ply, text )
    t_post = {
        content = json.encode({ { 
            ["embeds"] = { 
                ["description"] = text, 
                ["author"] = { 
                    ["name"] = ply:Nick()
                }, 
            }, 
        } }),
        username = "Log",
    } 
    http.Post(webhookURL, t_post)
end )

I hope somebody can help me

Upvotes: 0

Views: 1212

Answers (1)

Mischa
Mischa

Reputation: 1333

Garry's Mod does provide two functions to work with json.

They are:

util.TableToJSON( table table, boolean prettyPrint=false )

and

util.JSONToTable( string json )

There is no need to import json and if I recall correctly it isn't even possible.

For what you want to do you need to build your arguments as a table like this:

local arguments = {
["key"] = "Some value",
["42"] = "Not always the answer",
["deeper"] = {
  ["my_age"] = 22,
  ["my_name"] = getMyName()
},
["even more"] = from_some_variable

and then call

local args_as_json = util.TableToJSON(arguments)

Now you can pass args_as_json to your

http.Post( string url, table parameters, function onSuccess=nil, function onFailure=nil, table headers={} )

Upvotes: 1

Related Questions