· 7 years ago · Jan 20, 2019, 02:42 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 comments[update] = nil
107 exports.CIThelp:dm("Message deleted!", client, 0, 255, 0)
108 break
109 end
110 end
111 end
112 end
113end
114addEvent("CITfeedback.removePostSelected", true)
115addEventHandler("CITfeedback.removePostSelected", resourceRoot, removePostSelected)
116
117function getGridData(update)
118 local results = comments[update]
119 if (not results or #results == 0) then
120 triggerClientEvent(client, "CITfeedback.sendGridData", resourceRoot, "No comments yet.", {})
121 return true
122 end
123 local texts = ""
124 for k, v in ipairs(results) do
125 local acc = getAccount(v[1])
126 local lastName = exports.CITaccounts:getLastUsedName(v[1])
127 local playerName = ((lastName and lastName[1]) or "Guest account")
128 if (acc and getAccountPlayer(acc)) then
129 playerName = getPlayerName(getAccountPlayer(acc))
130 end
131 texts = ""..texts.."- "..playerName.." ("..v[1]..")\n"..v[2].."\n"
132 end
133 triggerClientEvent(client, "CITfeedback.sendGridData", resourceRoot, texts, results)
134end
135addEvent("CITfeedback.getGridData", true )
136addEventHandler("CITfeedback.getGridData", resourceRoot, getGridData)
137
138function cleanDB(player)
139 if (exports.CITadmin:getPlayerAdminLevel(player) < 5) then
140 return false
141 end
142 dbExec(con, "DELETE FROM `feedback`")
143 comments = {}
144 exports.CIThelp:dm("Feedbacks cleaned successfully.", player, 0, 255, 0)
145end
146addCommandHandler("cleancomments", cleanDB)