Compare with Previous | Blame | View Log
--[[
Addon: Taos Group Tools
Author: TProg Taonnor
Created by @Taonnor
]]--
--[[
Global callbacks
]]--
-- Group Ultimate Callbacks
TGT_GROUP_INVITE_RUNNING_CHANGED = "TGT-GroupInviteRunningChanged"
--[[
Local variables
]]--
local REFRESHRATE = 1000 -- ms; RegisterForUpdate is in miliseconds
local _logger = nil
local _name = "TGT-InviteHandler"
local _isRunning = false
local _currentInviteString = ""
local _autoKickList = {}
local _regroupList = {}
--[[
Table TGT_InviteHandler
]]--
TGT_InviteHandler = {}
TGT_InviteHandler.__index = TGT_InviteHandler
--[[
===============
PRIVATE METHODS
===============
]]--
--[[
Callback of EVENT_CHAT_MESSAGE_CHANNEL, handles text from chat against InviteString
]]--
local function OnNewChatMessage(eventCode, channelType, fromName, text, isCustomerService, fromDisplayName)
-- Ignore text in group chat
if (channelType ~= CHAT_CHANNEL_PARTY) then
-- Only if text is CurrentInviteString
if (text == _currentInviteString) then
-- Ignore messages from yourself
if (GetDisplayName() ~= fromDisplayName) then
-- Only if you are leader
if (IsUnitSoloOrGroupLeader("player")) then
local currentGroupSize = GetGroupSize()
local maxGroupSize = TGT_SettingsHandler.SavedVariables.MaxGroupSize
-- Check against configurated maxGroupSize
if (currentGroupSize < maxGroupSize) then
-- Invite player
d(zo_strformat(GetString(TGT_UI_AUTOINVITE_SEND_INVITE), fromDisplayName))
GroupInviteByName(fromDisplayName)
end
end
end
end
end
end
--[[
Starts inviting of players in base of CurrentInviteString
]]--
local function StartInvite()
-- Set IsRunning
_isRunning = true
FireCallbacksAsync(TGT_GROUP_INVITE_RUNNING_CHANGED, _isRunning)
-- Register listening on chat
EVENT_MANAGER:RegisterForEvent(_name, EVENT_CHAT_MESSAGE_CHANNEL, OnNewChatMessage)
-- Start auto kick if activated
if (TGT_SettingsHandler.SavedVariables.AutoKick) then
TGT_InviteHandler.StartAutoKick()
d(zo_strformat(GetString(TGT_UI_AUTOINVITE_START_KICK_INFO), _currentInviteString))
else
d(zo_strformat(GetString(TGT_UI_AUTOINVITE_START_INFO), _currentInviteString))
end
end
--[[
Called on refresh of timer
]]--
local function OnTimedUpdate(eventCode)
-- Only if you are grouped and leader
if (GetIsUnitGrouped() and IsUnitGroupLeader("player")) then
-- Check all offline players and kick if > timeout
local timeout = TGT_SettingsHandler.SavedVariables.AutoKickTimeout
for i = #_autoKickList, 1, -1 do
local unitTimestamp = _autoKickList[i].unitTimeStamp
local currentTimestamp = GetTimeStamp()
local difference = currentTimestamp - unitTimestamp
if (difference > timeout) then
local unitName = GetUnitDisplayName(_autoKickList[i].unitTag)
-- Still offline?
if (IsUnitOnline(_autoKickList[i].unitTag) == false) then
-- Kick
d(zo_strformat(GetString(TGT_UI_AUTOINVITE_AUTOKICK_INFO), unitName))
GroupKick(_autoKickList[i].unitTag)
end
-- Remove
table.remove(_autoKickList, i)
end
end
end
end
--[[
Called on EVENT_GROUP_MEMBER_CONNECTED_STATUS
]]--
local function OnGroupMemberConnected(eventCode, unitTag, isOnline)
local found = false
for i = #_autoKickList, 1, -1 do
if (_autoKickList[i].unitTag == unitTag) then
-- If online, remove; otherwise update
if (isOnline) then
table.remove(_autoKickList, i)
else
_autoKickList[i].unitTimeStamp = GetTimeStamp()
end
found = true
break -- found
end
end
-- If not found, add
if (found == false) then
-- Do not add if isOnline
if (isOnline == false) then
local newElementId = #_autoKickList + 1
local unitTimeStamp = GetTimeStamp()
_autoKickList[newElementId] = {}
_autoKickList[newElementId].unitTag = unitTag
_autoKickList[newElementId].unitTimeStamp = unitTimeStamp
end
end
end
--[[
Performs regroup process
]]--
local function PerformRegroup()
-- Perform invite and clear
for i = #_regroupList, 1, -1 do
-- Invite player
d(zo_strformat(GetString(TGT_UI_AUTOINVITE_SEND_INVITE), _regroupList[i]))
GroupInviteByName(_regroupList[i])
-- Clear entry
table.remove(_regroupList, i)
end
-- Start auto kick if activated
if (TGT_SettingsHandler.SavedVariables.AutoKick) then
TGT_InviteHandler.StartAutoKick()
end
end
--[[
==============
PUBLIC METHODS
==============
]]--
--[[
Sets invite string and start/stop automatic invite
]]--
function TGT_InviteHandler.SetInviteString(inviteString)
if (_isRunning) then
if (inviteString == _currentInviteString) then
-- Stop
TGT_InviteHandler.StopInvite()
else
-- Change string
_currentInviteString = inviteString
if (TGT_SettingsHandler.SavedVariables.AutoKick) then
d(zo_strformat(GetString(TGT_UI_AUTOINVITE_START_KICK_INFO), _currentInviteString))
else
d(zo_strformat(GetString(TGT_UI_AUTOINVITE_START_INFO), _currentInviteString))
end
end
else
-- Change string
_currentInviteString = inviteString
-- Start
StartInvite()
end
end
--[[
Stops inviting of players and resets CurrentInviteString
]]--
function TGT_InviteHandler.StopInvite()
-- Unregister listening on chat
EVENT_MANAGER:UnregisterForEvent(_name, EVENT_CHAT_MESSAGE_CHANNEL)
-- Resets invite string
_currentInviteString = ""
-- Stop auto kick
TGT_InviteHandler.StopAutoKick()
-- Set IsRunning
_isRunning = false
FireCallbacksAsync(TGT_GROUP_INVITE_RUNNING_CHANGED, _isRunning)
d(GetString(TGT_UI_AUTOINVITE_STOP_INFO))
end
--[[
Starts auto kicking members in group
]]--
function TGT_InviteHandler.StartAutoKick()
-- Register listening offline/online status
EVENT_MANAGER:RegisterForEvent(_name, EVENT_GROUP_MEMBER_CONNECTED_STATUS, OnGroupMemberConnected)
-- Start timer
EVENT_MANAGER:RegisterForUpdate(_name, REFRESHRATE, OnTimedUpdate)
-- Check group for offline members and add them to list
for i = 1, GetGroupSize() do
local unitTag = GetGroupUnitTagByIndex(i)
if (IsUnitOnline(unitTag) == false) then
local newElementId = #_autoKickList + 1
local unitTimeStamp = GetTimeStamp()
_autoKickList[newElementId] = {}
_autoKickList[newElementId].unitTag = unitTag
_autoKickList[newElementId].unitTimeStamp = unitTimeStamp
end
end
end
--[[
Stops auto kicking members in group
]]--
function TGT_InviteHandler.StopAutoKick()
-- Stop timer
EVENT_MANAGER:UnregisterForUpdate(_name)
-- Unregister listening offline/online status
EVENT_MANAGER:UnregisterForEvent(_name, EVENT_GROUP_MEMBER_CONNECTED_STATUS)
-- Clear auto kick list
for i = #_autoKickList, 1, -1 do
table.remove(_autoKickList, i)
end
end
--[[
Starts regroup process
]]--
function TGT_InviteHandler.Regroup()
-- Only if you are grouped and leader
if (GetIsUnitGrouped() and IsUnitGroupLeader("player")) then
-- Get group display names
for i = 1, GetGroupSize() do
local unitTag = GetGroupUnitTagByIndex(i)
local unitDisplayName = GetUnitDisplayName(unitTag)
-- Ignore yourself
if (GetDisplayName() ~= unitDisplayName) then
local newElementId = #_regroupList + 1
_regroupList[newElementId] = unitDisplayName
end
end
-- Stop AutoKick, because group will reinvited
TGT_InviteHandler.StopAutoKick()
-- Disband group
GroupDisband()
-- Start regroup process
zo_callLater(TGT_InviteHandler.PerformRegroup(), REFRESHRATE)
end
end
--[[
Initialize initializes TGT_InviteHandler
]]--
function TGT_InviteHandler.Initialize()
_logger = TGT_LOGGER
_logger:logTrace("TGT_InviteHandler -> Initialized")
end