ESOUI SVN TaosGroupInvite

[/] [trunk/] [TaosGroupInvite/] [logic/] [InviteHandler.lua] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 Taonnor-14572
--[[
2 Taonnor-14572
        Addon: Taos Group Invite
3 Taonnor-14572
        Author: TProg Taonnor
4 Taonnor-14572
        Created by @Taonnor
5 Taonnor-14572
]]--
6 Taonnor-14572
 
7 Taonnor-14572
--[[
8 Taonnor-14572
        Local variables
9 Taonnor-14572
]]--
10 Taonnor-14572
local LOG_ACTIVE = true
11 Taonnor-14572
local _logger = nil
12 Taonnor-14572
 
13 Taonnor-14572
local REFRESHRATE = 1000 -- ms; RegisterForUpdate is in miliseconds
14 Taonnor-14572
 
15 Taonnor-14572
--[[
16 Taonnor-14572
        Table TGI_InviteHandler
17 Taonnor-14572
]]--
18 Taonnor-14572
TGI_InviteHandler = {}
19 Taonnor-14572
TGI_InviteHandler.__index = TGI_InviteHandler
20 Taonnor-14572
 
21 Taonnor-14572
--[[
22 Taonnor-14572
        Table Members
23 Taonnor-14572
]]--
24 Taonnor-14572
TGI_InviteHandler.Name = "TGI-InviteHandler"
25 Taonnor-14572
TGI_InviteHandler.IsRunning = false
26 Taonnor-14572
TGI_InviteHandler.CurrentInviteString = ""
27 Taonnor-14572
TGI_InviteHandler.AutoKickList = {}
28 4 Taonnor-14572
TGI_InviteHandler.RegroupList = {}
29 3 Taonnor-14572
 
30 Taonnor-14572
--[[
31 Taonnor-14572
        Sets invite string and start/stop automatic invite
32 Taonnor-14572
]]--
33 Taonnor-14572
function TGI_InviteHandler.SetInviteString(inviteString)
34 Taonnor-14572
    if (LOG_ACTIVE) then
35 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.SetInviteString")
36 Taonnor-14572
        _logger:logDebug("inviteString", inviteString)
37 Taonnor-14572
    end
38 Taonnor-14572
 
39 Taonnor-14572
    if (TGI_InviteHandler.IsRunning) then
40 Taonnor-14572
        if (inviteString == TGI_InviteHandler.CurrentInviteString) then
41 Taonnor-14572
            -- Stop
42 Taonnor-14572
            TGI_InviteHandler.StopInvite()
43 8 Taonnor-14572
        else
44 Taonnor-14572
            -- Change string
45 Taonnor-14572
            TGI_InviteHandler.CurrentInviteString = inviteString
46 Taonnor-14572
 
47 Taonnor-14572
            if (TGI_SettingsHandler.SavedVariables.AutoKick) then
48 Taonnor-14572
                d(zo_strformat("Automatisches Einladen mit <<1>> und Autokick aktiv.", TGI_InviteHandler.CurrentInviteString))
49 Taonnor-14572
            else
50 Taonnor-14572
                d(zo_strformat("Automatisches Einladen mit <<1>> aktiv.", TGI_InviteHandler.CurrentInviteString))
51 Taonnor-14572
            end
52 3 Taonnor-14572
        end
53 Taonnor-14572
    else
54 8 Taonnor-14572
        -- Change string
55 Taonnor-14572
        TGI_InviteHandler.CurrentInviteString = inviteString
56 Taonnor-14572
 
57 3 Taonnor-14572
        -- Start
58 Taonnor-14572
        TGI_InviteHandler.StartInvite()
59 Taonnor-14572
    end
60 Taonnor-14572
end
61 Taonnor-14572
 
62 Taonnor-14572
--[[
63 Taonnor-14572
        Starts inviting of players in base of CurrentInviteString
64 Taonnor-14572
]]--
65 Taonnor-14572
function TGI_InviteHandler.StartInvite()
66 Taonnor-14572
    if (LOG_ACTIVE) then
67 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.StartInvite")
68 Taonnor-14572
    end
69 8 Taonnor-14572
 
70 Taonnor-14572
    -- Set IsRunning
71 Taonnor-14572
    TGI_InviteHandler.IsRunning = true
72 3 Taonnor-14572
 
73 Taonnor-14572
    -- Register listening on chat
74 Taonnor-14572
    EVENT_MANAGER:RegisterForEvent(TGI_InviteHandler.Name, EVENT_CHAT_MESSAGE_CHANNEL, TGI_InviteHandler.OnNewChatMessage)
75 Taonnor-14572
 
76 Taonnor-14572
    -- Start auto kick if activated
77 Taonnor-14572
    if (TGI_SettingsHandler.SavedVariables.AutoKick) then
78 Taonnor-14572
        TGI_InviteHandler.StartAutoKick()
79 8 Taonnor-14572
        d(zo_strformat("Automatisches Einladen mit <<1>> und Autokick aktiv.", TGI_InviteHandler.CurrentInviteString))
80 Taonnor-14572
    else
81 Taonnor-14572
        d(zo_strformat("Automatisches Einladen mit <<1>> aktiv.", TGI_InviteHandler.CurrentInviteString))
82 3 Taonnor-14572
    end
83 Taonnor-14572
end
84 Taonnor-14572
 
85 Taonnor-14572
--[[
86 Taonnor-14572
        Stops inviting of players and resets CurrentInviteString
87 Taonnor-14572
]]--
88 Taonnor-14572
function TGI_InviteHandler.StopInvite()
89 Taonnor-14572
    if (LOG_ACTIVE) then
90 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.StopInvite")
91 Taonnor-14572
    end
92 Taonnor-14572
 
93 Taonnor-14572
    -- Unregister listening on chat
94 Taonnor-14572
    EVENT_MANAGER:UnregisterForEvent(TGI_InviteHandler.Name, EVENT_CHAT_MESSAGE_CHANNEL)
95 Taonnor-14572
 
96 Taonnor-14572
    -- Resets invite string
97 Taonnor-14572
    TGI_InviteHandler.CurrentInviteString = ""
98 Taonnor-14572
 
99 Taonnor-14572
    -- Stop auto kick
100 Taonnor-14572
    TGI_InviteHandler.StopAutoKick()
101 Taonnor-14572
 
102 Taonnor-14572
    -- Set IsRunning
103 Taonnor-14572
    TGI_InviteHandler.IsRunning = false
104 8 Taonnor-14572
 
105 Taonnor-14572
    d("Automatisches Einladen deaktiviert.")
106 3 Taonnor-14572
end
107 Taonnor-14572
 
108 Taonnor-14572
--[[
109 Taonnor-14572
        Callback of EVENT_CHAT_MESSAGE_CHANNEL, handles text from chat against InviteString
110 Taonnor-14572
]]--
111 Taonnor-14572
function TGI_InviteHandler.OnNewChatMessage(eventCode, channelType, fromName, text, isCustomerService, fromDisplayName)
112 Taonnor-14572
    if (LOG_ACTIVE) then
113 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.OnNewChatMessage")
114 4 Taonnor-14572
        --_logger:logDebug("channelType;text;fromDisplayName", channelType, text, fromDisplayName)
115 3 Taonnor-14572
    end
116 Taonnor-14572
 
117 Taonnor-14572
    -- Ignore text in group chat
118 Taonnor-14572
    if (channelType ~= CHAT_CHANNEL_PARTY) then
119 Taonnor-14572
        -- Only if text is CurrentInviteString
120 Taonnor-14572
        if (text == TGI_InviteHandler.CurrentInviteString) then
121 Taonnor-14572
            -- Ignore messages from yourself
122 Taonnor-14572
            if (GetDisplayName() ~= fromDisplayName) then
123 Taonnor-14572
                -- Only if you are leader
124 Taonnor-14572
                if (IsUnitSoloOrGroupLeader("player")) then
125 Taonnor-14572
                    local currentGroupSize = GetGroupSize()
126 Taonnor-14572
                    local maxGroupSize = TGI_SettingsHandler.SavedVariables.MaxGroupSize
127 Taonnor-14572
 
128 Taonnor-14572
                    -- Check against configurated maxGroupSize
129 Taonnor-14572
                    if (currentGroupSize < maxGroupSize) then
130 Taonnor-14572
                        -- Invite player
131 Taonnor-14572
                        d(zo_strformat("Schicke Einladung zu <<1>>.", fromDisplayName))
132 Taonnor-14572
                        GroupInviteByName(fromDisplayName)
133 Taonnor-14572
                    else
134 Taonnor-14572
                        if (LOG_ACTIVE) then _logger:logDebug("Ignore invite. " .. tostring(currentGroupSize) .. " >= " .. tostring(maxGroupSize)) end
135 Taonnor-14572
                    end
136 Taonnor-14572
                else
137 Taonnor-14572
                    if (LOG_ACTIVE) then _logger:logDebug("Ignore invite. You are not leader") end
138 Taonnor-14572
                end
139 Taonnor-14572
            else
140 Taonnor-14572
                if (LOG_ACTIVE) then _logger:logDebug("Ignore invite. GetDisplayName() == fromDisplayName") end
141 Taonnor-14572
            end
142 Taonnor-14572
        else
143 Taonnor-14572
            if (LOG_ACTIVE) then _logger:logDebug("Ignore invite. text ~= CurrentInviteString") end
144 Taonnor-14572
        end
145 Taonnor-14572
    else
146 Taonnor-14572
        if (LOG_ACTIVE) then _logger:logDebug("Ignore invite. Group chat.") end
147 Taonnor-14572
    end
148 Taonnor-14572
end
149 Taonnor-14572
 
150 Taonnor-14572
--[[
151 Taonnor-14572
        Starts auto kicking members in group
152 Taonnor-14572
]]--
153 Taonnor-14572
function TGI_InviteHandler.StartAutoKick()
154 Taonnor-14572
    if (LOG_ACTIVE) then
155 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.StartAutoKick")
156 Taonnor-14572
    end
157 Taonnor-14572
 
158 Taonnor-14572
    -- Register listening offline/online status
159 Taonnor-14572
    EVENT_MANAGER:RegisterForEvent(TGI_InviteHandler.Name, EVENT_GROUP_MEMBER_CONNECTED_STATUS, TGI_InviteHandler.OnGroupMemberConnected)
160 Taonnor-14572
 
161 Taonnor-14572
    -- Start timer
162 Taonnor-14572
        EVENT_MANAGER:RegisterForUpdate(TGI_InviteHandler.Name, REFRESHRATE, TGI_InviteHandler.OnTimedUpdate)
163 Taonnor-14572
 
164 Taonnor-14572
    -- Check group for offline members and add them to list
165 4 Taonnor-14572
    for i = 1, GetGroupSize() do
166 Taonnor-14572
        local unitTag = GetGroupUnitTagByIndex(i)
167 Taonnor-14572
        if (IsUnitOnline(unitTag) == false) then
168 3 Taonnor-14572
            local newElementId = #TGI_InviteHandler.AutoKickList + 1
169 Taonnor-14572
            local unitTimeStamp = GetTimeStamp()
170 Taonnor-14572
 
171 5 Taonnor-14572
            TGI_InviteHandler.AutoKickList[newElementId] = {}
172 Taonnor-14572
            TGI_InviteHandler.AutoKickList[newElementId].unitTag = unitTag
173 Taonnor-14572
            TGI_InviteHandler.AutoKickList[newElementId].unitTimeStamp = unitTimeStamp
174 4 Taonnor-14572
        end
175 3 Taonnor-14572
    end
176 Taonnor-14572
end
177 Taonnor-14572
 
178 Taonnor-14572
--[[
179 Taonnor-14572
        Stops auto kicking members in group
180 Taonnor-14572
]]--
181 Taonnor-14572
function TGI_InviteHandler.StopAutoKick()
182 Taonnor-14572
    if (LOG_ACTIVE) then
183 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.StopAutoKick")
184 Taonnor-14572
    end
185 Taonnor-14572
 
186 Taonnor-14572
    -- Stop timer
187 8 Taonnor-14572
        EVENT_MANAGER:UnregisterForUpdate(TGI_InviteHandler.Name)
188 3 Taonnor-14572
 
189 Taonnor-14572
    -- Unregister listening offline/online status
190 Taonnor-14572
    EVENT_MANAGER:UnregisterForEvent(TGI_InviteHandler.Name, EVENT_GROUP_MEMBER_CONNECTED_STATUS)
191 Taonnor-14572
 
192 Taonnor-14572
    -- Clear auto kick list
193 5 Taonnor-14572
    for i = #TGI_InviteHandler.AutoKickList, 1, -1 do
194 Taonnor-14572
        table.remove(TGI_InviteHandler.AutoKickList, i)
195 Taonnor-14572
    end
196 3 Taonnor-14572
end
197 Taonnor-14572
 
198 Taonnor-14572
--[[
199 Taonnor-14572
        Called on refresh of timer
200 Taonnor-14572
]]--
201 Taonnor-14572
function TGI_InviteHandler.OnTimedUpdate(eventCode)
202 Taonnor-14572
    if (LOG_ACTIVE) then
203 5 Taonnor-14572
        --_logger:logTrace("TGI_InviteHandler.OnTimedUpdate")
204 3 Taonnor-14572
    end
205 Taonnor-14572
 
206 Taonnor-14572
    -- Only if you are grouped and leader
207 Taonnor-14572
    if (IsUnitGrouped("player") and IsUnitGroupLeader("player")) then
208 Taonnor-14572
        -- Check all offline players and kick if > timeout
209 Taonnor-14572
        local timeout = TGI_SettingsHandler.SavedVariables.AutoKickTimeout
210 Taonnor-14572
 
211 5 Taonnor-14572
        for i = #TGI_InviteHandler.AutoKickList, 1, -1 do
212 7 Taonnor-14572
            local unitTimestamp = TGI_InviteHandler.AutoKickList[i].unitTimeStamp
213 Taonnor-14572
            local currentTimestamp = GetTimeStamp()
214 Taonnor-14572
            local difference = currentTimestamp - unitTimestamp
215 Taonnor-14572
 
216 Taonnor-14572
            if (difference > timeout) then
217 8 Taonnor-14572
                local unitName = GetUnitDisplayName(TGI_InviteHandler.AutoKickList[i].unitTag)
218 Taonnor-14572
                if (LOG_ACTIVE) then _logger:logDebug(zo_strformat("Remove player from list <<1>>", unitName)) end
219 Taonnor-14572
 
220 Taonnor-14572
                -- Still offline?
221 Taonnor-14572
                if (IsUnitOnline(TGI_InviteHandler.AutoKickList[i].unitTag) == false) then
222 Taonnor-14572
                    -- Kick
223 Taonnor-14572
                    d(zo_strformat("Spieler <<1>> wurde automatisch gekickt.", unitName))
224 Taonnor-14572
                    GroupKick(TGI_InviteHandler.AutoKickList[i].unitTag)
225 Taonnor-14572
                end
226 Taonnor-14572
 
227 3 Taonnor-14572
                -- Remove
228 5 Taonnor-14572
                table.remove(TGI_InviteHandler.AutoKickList, i)
229 3 Taonnor-14572
            end
230 Taonnor-14572
        end
231 Taonnor-14572
    end
232 Taonnor-14572
end
233 Taonnor-14572
 
234 Taonnor-14572
--[[
235 Taonnor-14572
        Called on EVENT_GROUP_MEMBER_CONNECTED_STATUS
236 Taonnor-14572
]]--
237 Taonnor-14572
function TGI_InviteHandler.OnGroupMemberConnected(eventCode, unitTag, isOnline)
238 Taonnor-14572
    if (LOG_ACTIVE) then
239 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.OnGroupMemberConnected")
240 Taonnor-14572
        _logger:logDebug("unitTag;isOnline", unitTag, isOnline)
241 Taonnor-14572
    end
242 Taonnor-14572
 
243 Taonnor-14572
    local found = false
244 Taonnor-14572
 
245 5 Taonnor-14572
    for i = #TGI_InviteHandler.AutoKickList, 1, -1 do
246 3 Taonnor-14572
        if (TGI_InviteHandler.AutoKickList[i].unitTag == unitTag) then
247 Taonnor-14572
            -- If online, remove; otherwise update
248 Taonnor-14572
            if (isOnline) then
249 5 Taonnor-14572
                table.remove(TGI_InviteHandler.AutoKickList, i)
250 3 Taonnor-14572
            else
251 Taonnor-14572
                TGI_InviteHandler.AutoKickList[i].unitTimeStamp = GetTimeStamp()
252 Taonnor-14572
            end
253 Taonnor-14572
 
254 Taonnor-14572
            found = true
255 Taonnor-14572
            break -- found
256 Taonnor-14572
        end
257 Taonnor-14572
    end
258 Taonnor-14572
 
259 Taonnor-14572
    -- If not found, add
260 Taonnor-14572
    if (found == false) then
261 8 Taonnor-14572
        -- Do not add if isOnline
262 Taonnor-14572
        if (isOnline == false) then
263 Taonnor-14572
            local newElementId = #TGI_InviteHandler.AutoKickList + 1
264 Taonnor-14572
            local unitTimeStamp = GetTimeStamp()
265 3 Taonnor-14572
 
266 8 Taonnor-14572
            TGI_InviteHandler.AutoKickList[newElementId] = {}
267 Taonnor-14572
            TGI_InviteHandler.AutoKickList[newElementId].unitTag = unitTag
268 Taonnor-14572
            TGI_InviteHandler.AutoKickList[newElementId].unitTimeStamp = unitTimeStamp
269 Taonnor-14572
        end
270 3 Taonnor-14572
    end
271 Taonnor-14572
end
272 Taonnor-14572
 
273 Taonnor-14572
--[[
274 Taonnor-14572
        Starts regroup process
275 Taonnor-14572
]]--
276 Taonnor-14572
function TGI_InviteHandler.Regroup()
277 Taonnor-14572
    if (LOG_ACTIVE) then
278 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.Regroup")
279 Taonnor-14572
    end
280 Taonnor-14572
 
281 6 Taonnor-14572
    -- Only if you are grouped and leader
282 Taonnor-14572
    if (IsUnitGrouped("player") and IsUnitGroupLeader("player")) then
283 Taonnor-14572
        -- Get group display names
284 Taonnor-14572
        for i = 1, GetGroupSize() do
285 Taonnor-14572
            local unitTag = GetGroupUnitTagByIndex(i)
286 Taonnor-14572
            local unitDisplayName = GetUnitDisplayName(unitTag)
287 4 Taonnor-14572
 
288 6 Taonnor-14572
            -- Ignore yourself
289 Taonnor-14572
            if (GetDisplayName() ~= unitDisplayName) then
290 Taonnor-14572
                local newElementId = #TGI_InviteHandler.RegroupList + 1
291 Taonnor-14572
                TGI_InviteHandler.RegroupList[newElementId] = unitDisplayName
292 Taonnor-14572
            end
293 Taonnor-14572
        end
294 4 Taonnor-14572
 
295 7 Taonnor-14572
        -- Stop AutoKick, because group will reinvited
296 Taonnor-14572
        TGI_InviteHandler.StopAutoKick()
297 4 Taonnor-14572
 
298 6 Taonnor-14572
        -- Disband group
299 Taonnor-14572
        GroupDisband()
300 4 Taonnor-14572
 
301 6 Taonnor-14572
        -- Start regroup process
302 Taonnor-14572
        zo_callLater(TGI_InviteHandler.PerformRegroup(), REFRESHRATE)
303 Taonnor-14572
    else
304 Taonnor-14572
        if (LOG_ACTIVE) then _logger:logDebug("Ignore invite. You are not leader or grouped.") end
305 Taonnor-14572
    end
306 3 Taonnor-14572
end
307 Taonnor-14572
 
308 Taonnor-14572
--[[
309 4 Taonnor-14572
        Performs regroup process
310 Taonnor-14572
]]--
311 Taonnor-14572
function TGI_InviteHandler.PerformRegroup()
312 Taonnor-14572
    if (LOG_ACTIVE) then
313 Taonnor-14572
        _logger:logTrace("TGI_InviteHandler.PerformRegroup")
314 Taonnor-14572
    end
315 Taonnor-14572
 
316 5 Taonnor-14572
    -- Perform invite and clear
317 Taonnor-14572
    for i = #TGI_InviteHandler.RegroupList, 1, -1 do
318 4 Taonnor-14572
        -- Invite player
319 6 Taonnor-14572
        d(zo_strformat("Schicke Einladung zu <<1>>.", TGI_InviteHandler.RegroupList[i]))
320 4 Taonnor-14572
        GroupInviteByName(TGI_InviteHandler.RegroupList[i])
321 5 Taonnor-14572
 
322 Taonnor-14572
        -- Clear entry
323 Taonnor-14572
        table.remove(TGI_InviteHandler.RegroupList, i)
324 4 Taonnor-14572
    end
325 7 Taonnor-14572
 
326 Taonnor-14572
    -- Start auto kick if activated
327 Taonnor-14572
    if (TGI_SettingsHandler.SavedVariables.AutoKick) then
328 Taonnor-14572
        TGI_InviteHandler.StartAutoKick()
329 Taonnor-14572
    end
330 4 Taonnor-14572
end
331 Taonnor-14572
 
332 Taonnor-14572
--[[
333 3 Taonnor-14572
        Initialize initializes TGI_InviteHandler
334 Taonnor-14572
]]--
335 Taonnor-14572
function TGI_InviteHandler.Initialize(logger)
336 Taonnor-14572
    if (LOG_ACTIVE) then logger:logTrace("TGI_InviteHandler.Initialize") end
337 Taonnor-14572
 
338 Taonnor-14572
    _logger = logger
339 Taonnor-14572
end