This repository has been archived by the owner on Dec 17, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstartup.lua
156 lines (135 loc) · 4.04 KB
/
startup.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
local DISCORD_URL = settings.get("faq.discord_webhook")
if not DISCORD_URL then error("Missing Discord webhook!") end
local FAQ = require("faq")
local faq = {}
local utils = require("utils")
local function preprocessFAQ()
for _, entry in pairs(FAQ) do
-- first, generate the markdown if needed
if not entry.markdownResponse then
entry.markdownResponse = utils.toMarkdown(entry.response)
end
-- then index the names
for _, name in pairs(entry.names) do
faq[name] = entry
end
end
end
preprocessFAQ()
-- write FAQ to file for the website
local f = fs.open(".faq.json", "w")
f.write(json.encode(FAQ))
f.close()
local function sendDiscordMessage(player, entry, text)
http.request(DISCORD_URL, json.encode({
["content"] = string.format(
"%s**FAQ**/%s:\n%s",
player and string.format("%s: ", player) or "",
entry,
text
),
["username"] = "SwitchCraft FAQ"
}), {
["Content-Type"] = "application/json"
})
end
local function sendIngameMessage(player, entry, message)
local hover = utils.hoverText({
utils.text("View this FAQ with: "),
utils.text("!faq " .. entry, "aqua")
})
local messageData = {
"",
player and utils.playerHead(player) or "",
utils.text("FAQ", "dark_green", true),
utils.text("/", "gray"),
utils.text(entry, entry == "error" and "dark_red" or "green"),
utils.text(": ")
}
-- add the hover event to the message prefix
for i, obj in pairs(messageData) do
if type(obj) == "table" and not obj.hoverEvent then -- skip the blank text object and head
obj.hoverEvent = hover
end
end
-- concat the message to our object
for _, obj in pairs(message) do
table.insert(messageData, obj)
end
local tellraw = json.encode(messageData)
local ok, error = commands.tellraw("@a", tellraw)
if not ok then
printError(textutils.serialise(error))
end
end
local function list(player)
sendIngameMessage(player, "faq:list", {
utils.text("View the FAQ online: ", "yellow"),
utils.formatURL("https://faq.switchcraft.pw")
})
sendDiscordMessage(player, "faq:list", "View the FAQ online: https://faq.switchcraft.pw")
end
local function displayEntry(player, entry, names)
local name = (entry.names or names)[1]:lower()
sendIngameMessage(player, name, entry.response)
sendDiscordMessage(player, name, entry.markdownResponse)
end
local function entryNotFound(player, entryName)
sendIngameMessage(player, "error", {
utils.text("Entry `", "red"),
utils.text(entryName, "dark_red"),
utils.text("` not found.", "red")
})
sendDiscordMessage(player, "error", string.format("Entry `%s` not found.", entryName))
end
local function usage(player)
sendIngameMessage(player, "faq:usage", {
utils.text("Usage: ", "yellow"),
utils.formatCommand("!faq [entry]", true)
})
sendDiscordMessage(player, "faq:usage", "**Usage**: `!faq [entry]`")
end
local function handleMessage(user, message)
if message == "!faq" or message == "!faq list" or message == "!faq faq:list" then
return list(user)
else
local parts = {}
for part in message:gmatch("%S+") do
table.insert(parts, part)
end
local original = faq[parts[2]]
-- If this entry supplies a function, use that instead.
local entry = original
if #parts ~= 2 then
if entry and entry.handler then
entry = entry.handler(table.unpack(parts, 3))
else
return usage(user)
end
end
if entry then
displayEntry(user, entry, original.names)
else
entryNotFound(user, table.concat(parts, " ", 2))
end
end
end
local function main()
print("Ready")
while true do
local event, user, message = os.pullEvent()
if message and type(message) == "string" then
message = message:lower()
end
if (event == "chat" or event == "chat_discord") and message:find("^!faq") then
handleMessage(user, message)
end
end
end
print("Starting bot")
while true do
local ok, err = pcall(main)
if err == "Terminated" then error(err, 0) end
if not ok then printError(err) end
sleep(5)
end