· 7 years ago · Jan 08, 2019, 10:16 PM
1local comments = {}
2local maxPost = 1
3-- local con = dbConnect("sqlite", "//feedback.db")
4
5function onResourceStart()
6 dbExec(con, "CREATE TABLE IF NOT EXISTS feedback (updatesInfo TEXT, accName TEXT, message TEXT)")
7 dbQuery(calling, {}, con, "SELECT * FROM feedback")
8end
9addEventHandler("onResourceStart", resourceRoot, onResourceStart)
10
11function onResourceStop()
12 dbExec(con, "DELETE FROM `feedback`")
13 local stable = {}
14 for update, v in pairs(comments) do
15 stable[update] = (stable[update] or 0) + 1
16 local accName, message = comments[update][stable[update]][1], comments[update][stable[update]][2]
17 dbExec(con, "INSERT INTO `feedback` VALUES (?, ?, ?)", update, accName, message)
18 end
19end
20addEventHandler("onResourceStop", resourceRoot, onResourceStop)
21
22function calling(argument)
23 for k, v in ipairs(dbPoll(argument, -1)) do
24 local update = v["updatesInfo"]
25 if (not comments[update]) then
26 comments[update] = {}
27 end
28 comments[update][#comments[update]+1] = {v["accName"], v["message"]}
29 end
30end
31
32function processUpdates(updates)
33 local updatesList = {}
34 for k, v in ipairs(split(updates, "\n")) do
35 if (string.sub(v, 1, 2) == "- ") then
36 table.insert(updatesList, (string.gsub(v, "- ", "")))
37 end
38 end
39 return updatesList
40end
41
42function getPlayerComments(player, update)
43 local accName = getAccountName(getPlayerAccount(player))
44 local count = 0
45 for k, v in ipairs(comments[update]) do
46 if (accName and v[1] == accName) then
47 count = count + 1
48 end
49 end
50 return count
51end
52
53function getPlayerFeedbacks(plr)
54 local feedbacks = {}
55 local accName = getAccountName(getPlayerAccount(plr))
56 for update, k in pairs(comments) do
57 for i, v in ipairs(k) do
58 if (accName and v[1] == accName) then
59 feedbacks[update] = true
60 end
61 end
62 end
63 return feedbacks
64end
65
66function getUpdatesList(player)
67 if (isGuestAccount(getPlayerAccount(player)) or exports.CITchecking:getPlayerTimeSinceLastOccurence(player, "feedback") < 3000) then
68 return false
69 end
70 local conversion = processUpdates(exports.CITupdatesInfo:getUpdates()) or {}
71 exports.CITchecking:setPlayerOccurenceTime(player, "feedback")
72 local admin = (exports.CITadmin:getPlayerAdminLevel(player) >= 1)
73 if (#conversion == 0) then
74 exports.CIThelp:dm("The feedback list is not loaded yet, retry later.", player, 255, 255, 0)
75 return false
76 end
77 triggerClientEvent(player, "CITfeedback.sendFeedbackList", resourceRoot, conversion, getPlayerFeedbacks(player), admin)
78end
79addCommandHandler("feedback", getUpdatesList)
80
81function sendFeedback(message, update)
82 if (isGuestAccount(getPlayerAccount(client))) then
83 return false
84 end
85 if (not comments[update]) then
86 comments[update] = {}
87 end
88 if (getPlayerComments(client, update) >= maxPost) then
89 exports.CIThelp:dm("You can only make %s comment(s) per update.", client, 255, 0, 0, true, maxPost)
90 return false
91 end
92 local name = getPlayerName(client)
93 local accName = getAccountName(getPlayerAccount(client))
94 comments[update][#comments[update]+1] = {accName, message}
95 exports.CIThelp:dm("Feedback sent successfully.", client, 0, 255, 0, true)
96end
97addEvent("CITfeedback.sendFeedback", true )
98addEventHandler("CITfeedback.sendFeedback", resourceRoot, sendFeedback)
99
100function removePostSelected(delMessage)
101 if (exports.CITadmin:getPlayerAdminLevel(client) >= 1) then
102 for update, k in pairs(comments) do
103 for i, v in ipairs(k) do
104 if (v[2] == delMessage) then
105 table.remove(comments[update], i)
106 exports.CIThelp:dm("Message deleted!", client, 0, 255, 0)
107 break
108 end
109 end
110 end
111 end
112end
113addEvent("CITfeedback.removePostSelected", true)
114addEventHandler("CITfeedback.removePostSelected", resourceRoot, removePostSelected)
115
116function getGridData(update)
117 local results = comments[update]
118 if (not results or #results == 0) then
119 triggerClientEvent(client, "CITfeedback.sendGridData", resourceRoot, "No comments yet.", {})
120 return true
121 end
122 local texts = ""
123 for k, v in ipairs(results) do
124 local acc = getAccount(v[1])
125 local lastName = exports.CITaccounts:getLastUsedName(v[1])
126 local playerName = ((lastName and lastName[1]) or "Guest account")
127 if (acc and getAccountPlayer(acc)) then
128 playerName = getPlayerName(getAccountPlayer(acc))
129 end
130 texts = ""..texts.."- "..playerName.." ("..v[1]..")\n"..v[2].."\n"
131 end
132 triggerClientEvent(client, "CITfeedback.sendGridData", resourceRoot, texts, results)
133end
134addEvent("CITfeedback.getGridData", true )
135addEventHandler("CITfeedback.getGridData", resourceRoot, getGridData)
136
137function cleanDB(player)
138 if (exports.CITadmin:getPlayerAdminLevel(player) < 5) then
139 return false
140 end
141 dbExec(con, "DELETE FROM `feedback`")
142 comments = {}
143 exports.CIThelp:dm("Feedbacks cleaned successfully.", player, 0, 255, 0)
144end
145addCommandHandler("cleancomments", cleanDB)