· 7 years ago · Dec 29, 2018, 08:16 PM
1local comments = {}
2local maxPost = 2
3local con = dbConnect("mysql", "dbname=;host=", "", "")
4--[[ local con = dbConnect("sqlite", "//feedback.db") ]]--
5dbExec(con, "CREATE TABLE IF NOT EXISTS feedback (updatesInfo TEXT, accname TEXT, message TEXT)")
6
7function onResourceStart()
8 dbQuery(calling, {}, con, "SELECT * FROM feedback")
9end
10addEventHandler("onResourceStart", resourceRoot, onResourceStart)
11
12function onResourceStop()
13 clndb()
14 local count = 0
15 for k, v in pairs(comments) do
16 count = count + 1
17 local accname, message = comments[k][count][1], comments[k][count][2]
18 dbExec(con, "INSERT INTO feedback VALUES (?, ?, ?)", k, accname, message)
19 end
20end
21addEventHandler("onResourceStop", resourceRoot, onResourceStop)
22
23function calling(markerQuery)
24 for k, v in ipairs(dbPoll(markerQuery, -1)) do
25 local update = v["updatesInfo"]
26 if (not comments[update]) then
27 comments[update] = {}
28 end
29 comments[update][#comments[update]+1] = {v["accname"], v["message"]}
30 end
31end
32
33function clndb()
34 dbExec(con, "DELETE FROM feedback")
35end
36
37function processUpdates(updates)
38 local cache = {}
39 for k, v in ipairs(split(updates, "\n")) do
40 if (string.sub(v, 1, 2) == "- ") then
41 table.insert(cache, (string.gsub(v, "- ", "")))
42 end
43 end
44 return cache
45end
46
47function getPlayerComments(player, update)
48 local accname = getAccountName(getPlayerAccount(player))
49 local count = 0
50 for k, v in ipairs(comments[update]) do
51 if (accname and v[1] == accname) then
52 count = count + 1
53 end
54 end
55 return count
56end
57
58function getUpdatesList(player)
59 if (isGuestAccount(getPlayerAccount(player))) then
60 return false
61 end
62 if (exports.CITchecking:getPlayerTimeSinceLastOccurence(player, "feedback") < 3000) then
63 return false
64 end
65 local conversion = processUpdates(exports.CITupdatesInfo:getUpdates()) or {}
66 exports.CITchecking:setPlayerOccurenceTime(player, "feedback")
67 if (#conversion == 0) then
68 outputChatBox("The feedback list is not loaded yet, retry later.", player, 255, 0, 0)
69 else
70 triggerClientEvent(player, "CITfeedback.sendFeedbackList", resourceRoot, conversion)
71 end
72end
73addCommandHandler("feedback", getUpdatesList)
74
75function sendFeedback(message, update)
76 if (isGuestAccount(getPlayerAccount(client))) then
77 return false
78 end
79 if (not comments[update]) then
80 comments[update] = {}
81 end
82 if (getPlayerComments(client, update) >= maxPost) then
83 exports.CIThelp:dm("You can only make "..maxPost.." comment per update.", client, 255, 0, 0)
84 return false
85 end
86 local name = getPlayerName(client)
87 local accname = getAccountName(getPlayerAccount(client))
88 comments[update][#comments[update]+1] = {accname, message}
89 exports.CIThelp:dm("Feedback sended", client, 0, 255, 0)
90end
91addEvent("CITfeedback.sendFeedback", true )
92addEventHandler("CITfeedback.sendFeedback", resourceRoot, sendFeedback)
93
94function getGridData(update)
95 local results = comments[update]
96 if (not results or #results == 0) then
97 triggerClientEvent(client, "CITfeedback.sendGridData", resourceRoot, "No comments yet.")
98 else
99 local texts = ""
100 for k, v in ipairs(results) do
101 local name = (exports.CITaccounts:invGet(getAccount(v[1]), "LastNick") or "Guest account")
102 texts = ""..texts.."- "..name.." ("..v[1]..")\n"..v[2].."\n"
103 end
104 triggerClientEvent(client, "CITfeedback.sendGridData", resourceRoot, texts)
105 end
106end
107addEvent("CITfeedback.getGridData", true )
108addEventHandler("CITfeedback.getGridData", resourceRoot, getGridData)
109
110function cleanDB(player)
111 if (exports.CITadmin:getPlayerAdminLevel(player) == 5) then
112 clndb()
113 comments = {}
114 exports.CIThelp:dm("Feedback cleaned", player, 255, 255, 0)
115 end
116end
117addCommandHandler("cleancomments", cleanDB)