View difference between Paste ID: SizQViXv and RXczRYe6
SHOW: | | - or go back to the newest paste.
1
--[[    $Id: management.lua 3447 2013-08-02 09:29:57Z [email protected] $       ]]
2
3
local _, caelCore = ...
4
5
------------------------------------------------------------------------
6
--	List of characters to run the addon for.
7
--	I cleaned up the table format, as I couldn't see any code that
8
--	depended on having so many extra table levels.
9
------------------------------------------------------------------------
10
11
local myToons = {
12
	["ServerName"] = {
13
		["CharacterA"]	= "DEATHKNIGHT",
14
		["CharacterB"] = "DRUID",
15
		["CharacterC"] = "HUNTER",
16
		["CharacterD"]	= "MAGE",
17
		["CharacterE"] = "MONK",
18
		["CharacterF"] = "WARLOCK",
19
		["CharacterG"]	= "WARRIOR",
20
	}
21
}
22
23
local herToons = {
24
	["ServerName"] = {
25
		["CharacterH"] = "DRUID",
26
		["CharacterI"] = "HUNTER",
27
		["CharacterJ"] = "MONK",
28
		["CharacterK"] = "PRIEST",
29
		["CharacterL"] = "ROGUE",
30
		["CharacterM"] = "SHAMAN",
31
		["CharacterN"] = "WARRIOR",
32
	}
33
}
34
35
local playerName = UnitName("player")
36
37
-- Don't make these global.
38
local myChars = myToons[caelLib.playerRealm] and myToons[caelLib.playerRealm][playerName]
39
local herChars = herToons[caelLib.playerRealm] and herToons[caelLib.playerRealm][playerName]
40
41
if not (myChars or herChars) then return end
42
43
------------------------------------------------------------------------
44
--	Basic initialization stuff.
45
------------------------------------------------------------------------
46
47
local Management = caelCore.createModule("Management")
48
caelCore.management = Management
49
50
-- Avoid giant if-else chains by passing off events to individual functions.
51
Management:SetScript("OnEvent", function(self, event, ...) return self[event](self, ...) end)
52
Management:RegisterEvent("PLAYER_LOGIN")
53
54
function Management:PLAYER_LOGIN()
55
	self:UnregisterEvent("PLAYER_LOGIN")
56
57
	-- If the GuildUI is already loaded, do it now, otherwise wait.
58
	if IsAddOnLoaded("Blizzard_GuildUI") then
59
		self:ADDON_LOADED("Blizzard_GuildUI")
60
	else
61
		self:RegisterEvent("ADDON_LOADED")
62
	end
63
64
	self:RegisterEvent("CALENDAR_UPDATE_EVENT_LIST")
65
66
	self:RegisterEvent("GUILD_ROSTER_UPDATE")
67
	GuildRoster() -- Forces a GUILD_ROSTER_UPDATE to fire soon.
68
end
69
70
------------------------------------------------------------------------
71
--	Let the GuildUI load normally.
72
------------------------------------------------------------------------
73
74
function Management:ADDON_LOADED(addon)
75
	if addon == "Blizzard_GuildUI" then
76
		GuildRosterShowOfflineButton:Disable()
77
78-
		local function GuildFrameHook(GuildFrame)
78+
		local function ChangeView()
79
			GuildFrameTab2:Click()
80
			GuildRoster_SetView("guildStatus")
81
			-- Currently not performed in _SetView
82
			UIDropDownMenu_SetSelectedValue(GuildRosterViewDropdown, "guildStatus")
83
		end
84-
		GuildFrame:HookScript("OnShow", GuildFrameHook)
84+
		GuildFrame:HookScript("OnShow", ChangeView)
85-
		GuildFrame:HookScript("OnHide", GuildFrameHook)
85+
		GuildFrame:HookScript("OnHide", function()
86
			ChangeView()
87
			Management:GUILD_ROSTER_UPDATE()
88
		end)
89
90
		self:UnregisterEvent("ADDON_LOADED")
91
	end
92
end
93
94
------------------------------------------------------------------------
95
--	List of calendar events changed.
96
------------------------------------------------------------------------
97
98
function Management:CALENDAR_UPDATE_EVENT_LIST()
99
	self:ManageCalendar()
100
end
101
102
------------------------------------------------------------------------
103
--	Guild roster changed.
104
------------------------------------------------------------------------
105
106
function Management:GUILD_ROSTER_UPDATE()
107
	if GuildFrame and GuildFrame:IsShown() then
108
		return
109
	end
110
	-- Are we in the right guild? Do we have any permissions?
111
	if GetGuildInfo("player") == "We Did It" and (CanGuildPromote() or CanGuildRemove()) then
112
		-- Should we defer to the other manager?
113
		if herChars then
114
			-- Is the other manager online?
115
			local chars = myToons[caelLib.playerRealm]
116
			for i = 1, GetNumGuildMembers() do
117
				local name = GetGuildRosterInfo(i)
118
				if chars[name] then
119
					-- Other manager is online. Let them handle it.
120
					return
121
				end
122
			end
123
		end
124
125
		-- Pass "true" to do it for real, eg. self:ManageGuild(true)
126
		self:ManageGuild()
127
	end
128
end
129
130
------------------------------------------------------------------------
131
--	Actual calendar management logic.
132
------------------------------------------------------------------------
133
134
function Management:ManageCalendar()
135
	for month = 0, 12 do
136
		for day = 1, 31 do
137
			for eventIndex = 1, CalendarGetNumDayEvents(month, day) do
138
				local _, _, _, calendarType, _, _, _, _, _, invitedBy = CalendarGetDayEvent(month, day, eventIndex)
139
				if calendarType == "PLAYER" and CalendarContextInviteIsPending(month, day, eventIndex)
140
					if caelLib.isGuild(invitedBy) then -- Check this first so you don't have to check it twice.
141
						CalendarContextInviteAvailable(month, day, eventIndex)
142
					elseif invitedBy == "" then -- or (invitedBy ~= caelLib.playerName and not caelLib.isFriend(invitedBy) and not not caelLib.isInGroup(invitedBy)) then
143
						CalendarContextInviteRemove(month, day, eventIndex)
144
					end
145
				end
146
			end
147
		end
148
	end
149
end
150
151
------------------------------------------------------------------------
152
--	Actual guild management logic, all wrapped up in a do-end block to
153
--	limit scoping.
154
------------------------------------------------------------------------
155
156
do
157
	local ignoreList = {
158
		-- Use a hash table here so ignoreList[name] actually works.
159
		["Byleths"] = true,
160
		["Prøsper"] = true,
161
		["Trickaz"] = true,
162
		["Trøyà"] = true,
163
		["Winnø"] = true,
164
	}
165
166
	local testMode, lastAction, lastName = true
167
168
	local group = Management:CreateAnimationGroup()
169-
		if forced then
169+
170
	group.anim:SetDuration(1)
171
	group.anim:SetOrder(1)
172
	group.parent = Management
173
174
	group:SetScript("OnFinished", function(self, forced)
175
		if forced or (GuildFrame and GuildFrame:IsShown()) then
176
			return
177
		end
178
179
		local didAction
180
		for playerIndex = 1, GetNumGuildMembers() do
181
			local name, _, rankIndex, level, _, _, _, _, _, _, classFileName = GetGuildRosterInfo(playerIndex)
182
			-- Make it consistent with values for SetGuildMemberRank() for sanity's sake.
183
			rankIndex = rankIndex + 1
184
185
			if rankIndex > 3 then
186
				if CanGuildPromote() then
187
					local targetRank
188
					if level >= 1 and level <= 79 and rankIndex ~= 7 then
189
						targetRank = 7
190
					elseif level >= 80 and level <= 84 and rankIndex ~= 6 then
191
						targetRank = 6
192
					elseif level >= 85 and level <= 89 and rankIndex ~= 5 then
193
						targetRank = 5
194
					elseif level == 90 and rankIndex ~= 4 then
195
						targetRank = 4
196
					end
197
					if targetRank then
198
						if testMode then
199
							print("PROMOTE", name, targetRank)
200
						else
201
							if lastAction == "PROMOTE" and lastName == name then
202
								return print("Action failed:", lastAction, lastName, targetRank)
203
							end
204
							didAction, lastAction, lastName = true, "PROMOTE", name
205
							SetGuildMemberRank(playerIndex, targetRank)
206
						end
207
						break
208
					end
209
				end
210
211
				if not ignoreList[name] and CanGuildRemove() then
212
					local year, month, day = GetGuildRosterLastOnline(playerIndex)
213
					if year and (
214
						(rankIndex == 7
215
						-- level 1 for more than 1 day.
216
							and (day >= 1 and level == 1)
217
						-- level 55 DK for more than 2 days.
218
							or (day >= 2 and level == 55 and classFileName == "DEATHKNIGHT")
219
						-- level 2-5 and DK level 56-58 for more than 3 days.
220
							or (day >= 3 and ((level > 1 and level <= 5) or (level > 55 and level <= 58 and classFileName == "DEATHKNIGHT")))
221
						-- level 6-79 for more than 14 days.
222
							or (day >= 14 and level > 5 and level <= 79)
223
						)
224
						-- level 80-84 for more than 21 days.
225
						or (rankIndex == 6 and day >= 21)
226
						-- level 85-90 for more than 28 days.
227
						or ((rankIndex == 4 or rankIndex == 5) and day >= 28)
228
					) then
229
						if testMode then
230
							print("REMOVE", name)
231
						else
232
							if lastAction == "REMOVE" and lastName == name then
233
								-- Avoid infinite loops if the action is failing.
234
								return print("Action failed:", lastAction, lastName)
235
							end
236
							didAction, lastAction, lastName = true, "REMOVE", name
237
							GuildUninvite(name)
238
						end
239
						break
240
					end
241
				end
242
			end
243
		end
244
245
		if didAction then
246
			-- Did something, queue the next action.
247
			self:Play()
248
		else
249
			-- Did nothing, we're done.
250
			Management:RegisterEvent("GUILD_ROSTER_UPDATE")
251
		end
252
	end)
253
254
	function Management:ManageGuild(doItForReal)
255
		self:UnregisterEvent("GUILD_ROSTER_UPDATE")
256
257
		SortGuildRoster("online")
258
		SetGuildRosterShowOffline(true)
259
260
		if group:IsPlaying() then
261
			group:Finish()
262
		end
263
264
		testMode = not doItForReal
265
		group:Play()
266
	end
267
end