Skip to content

Commit 32debfa

Browse files
authored
Merge pull request #2 from Numynum/LazyCurveBeta
2 parents be01000 + 2d264a1 commit 32debfa

17 files changed

+875
-1049
lines changed

.pkgmeta

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package-as: LazyCurve
22

3+
move-folders:
4+
LazyCurve/modules/PvP: LazyCurve_PvP
5+
LazyCurve/modules/MPlus: LazyCurve_MPlus
6+
LazyCurve/modules/Legion: LazyCurve_Legion
7+
LazyCurve/modules/BFA: LazyCurve_BFA
8+
LazyCurve/modules/Shadowlands: LazyCurve_Shadowlands
9+
310
externals:
411
libs/LibStub:
512
url: https://repos.wowace.com/wow/ace3/trunk/LibStub

Config.lua

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
-- upvalue the globals
2+
local _G = getfenv(0)
3+
local LibStub = _G.LibStub
4+
local GetAddOnMetadata = _G.GetAddOnMetadata
5+
local InterfaceOptionsFrame_OpenToCategory = _G.InterfaceOptionsFrame_OpenToCategory
6+
7+
local name = ...
8+
local LazyCurve = LibStub("AceAddon-3.0"):GetAddon(name);
9+
if not LazyCurve then return end
10+
11+
LazyCurve.Config = LazyCurve.Config or {}
12+
local Config = LazyCurve.Config
13+
14+
Config.version = GetAddOnMetadata(name, "Version") or ""
15+
16+
function Config:GetOptions()
17+
return {
18+
type = 'group',
19+
get = function(info) return Config:GetConfig(info[#info]); end,
20+
set = function(info, value) return Config:SetConfig(info[#info], value); end,
21+
args = {
22+
version = {
23+
order = 0,
24+
type = "description",
25+
name = "Version: " .. self.version
26+
},
27+
advertise = {
28+
name = "Selfpromotion",
29+
desc = "Adds <LazyCurve> before each 'LazyCurve' whisper",
30+
descStyle = 'inline',
31+
width = "full",
32+
order = 1,
33+
type = "toggle",
34+
},
35+
whisperOnApply = {
36+
name = "Enable auto-linking on LFG application",
37+
desc = "Automatically whispers your best achievement(s) when applying to a raid.",
38+
descStyle = 'inline',
39+
width = "full",
40+
order = 2,
41+
type = "toggle",
42+
},
43+
disableAutolinkReminder = {
44+
name = "Disable the reminder when automatically whispering",
45+
width = "full",
46+
order = 3,
47+
type = "toggle",
48+
},
49+
mythicThreshold = {
50+
name = "Which mythic boss is the first relevant boss to link together with curve.",
51+
width = 3,
52+
order = 4,
53+
type = "range",
54+
min = 0,
55+
softMax = 10,
56+
step = 1,
57+
bigStep = 1,
58+
},
59+
mythicThresholdDesc = {
60+
type = "description",
61+
order = 5,
62+
name = "Set to 0 to disable linking mythic achievements on LFG applying (except for edge/last boss kill). Set to 1 or higher to start linking achievements from that boss.",
63+
},
64+
},
65+
}
66+
end
67+
68+
function Config:Initialize()
69+
self:RegisterOptions()
70+
LibStub("AceConfigDialog-3.0"):AddToBlizOptions("LazyCurve", "LazyCurve")
71+
end
72+
73+
function Config:RegisterOptions()
74+
LibStub("AceConfig-3.0"):RegisterOptionsTable("LazyCurve", self:GetOptions())
75+
end
76+
77+
function Config:OpenConfig()
78+
-- after a reload, you need to open to category twice to actually open the correct page
79+
InterfaceOptionsFrame_OpenToCategory('LazyCurve')
80+
InterfaceOptionsFrame_OpenToCategory('LazyCurve')
81+
end
82+
83+
function Config:GetConfig(property)
84+
return LazyCurve.DB[property];
85+
end
86+
87+
function Config:SetConfig(property, value)
88+
LazyCurve.DB[property] = value;
89+
end

LazyCurve.lua

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
-- upvalue the globals
2+
local _G = getfenv(0)
3+
local LibStub = _G.LibStub
4+
local C_LFGList = _G.C_LFGList
5+
local ipairs = _G.ipairs
6+
local pairs = _G.pairs
7+
local GetTime = _G.GetTime
8+
local GetAchievementLink = _G.GetAchievementLink
9+
local LFGListApplicationDialog = _G.LFGListApplicationDialog
10+
local LE_EXPANSION_LEVEL_CURRENT = _G.LE_EXPANSION_LEVEL_CURRENT
11+
12+
local name = ...
13+
local LazyCurve = LibStub('AceAddon-3.0'):NewAddon(name, 'AceConsole-3.0', 'AceHook-3.0', 'AceEvent-3.0');
14+
if not LazyCurve then return end
15+
16+
LazyCurve.PREFIX = '<LazyCurve>'
17+
LazyCurve.ACTIVITY_CATEGORY_RAID = 3
18+
LazyCurve.CURRENT_EXPANSION = LE_EXPANSION_LEVEL_CURRENT
19+
20+
LazyCurve.utils = {}
21+
LazyCurve.lastMsgTime = 0
22+
23+
function LazyCurve:IsActivityActive(activityTable)
24+
local searchGroupId = activityTable.groupId
25+
for _, groupId in ipairs(C_LFGList.GetAvailableActivityGroups(self.ACTIVITY_CATEGORY_RAID)) do
26+
if groupId == searchGroupId then
27+
return true
28+
end
29+
end
30+
31+
return false
32+
end
33+
34+
function LazyCurve:OnSignUp(SignUpButton)
35+
if(self.DB.whisperOnApply ~= true) then
36+
return
37+
end
38+
local dialog = SignUpButton:GetParent()
39+
local resultID = dialog.resultID
40+
local resultInfo = C_LFGList.GetSearchResultInfo(resultID)
41+
42+
43+
if(resultInfo) then
44+
local leaderName = resultInfo.leaderName
45+
local _, _, _, groupId, _ = C_LFGList.GetActivityInfo(resultInfo.activityID)
46+
local infoTable = LazyCurve.utils.searchEntryMenu:GetInfoTableByActivityGroup(groupId, true)
47+
48+
if(infoTable) then
49+
local achievementList = {}
50+
51+
for _, activityTable in ipairs(infoTable) do
52+
local earnedAchievements = LazyCurve.utils.achievement:GetHighestEarnedAchievement(activityTable)
53+
if #earnedAchievements > 0 then
54+
for _, achievementId in ipairs(earnedAchievements) do
55+
achievementList[achievementId] = achievementId
56+
end
57+
end
58+
end
59+
60+
local msg = '';
61+
if(self.DB.advertise) then
62+
msg = self.PREFIX .. msg;
63+
end
64+
for _, achievementId in pairs(achievementList) do
65+
msg = msg .. ' ' .. GetAchievementLink(achievementId)
66+
end
67+
self.hooks.SendChatMessage(msg, 'WHISPER', nil, leaderName)
68+
69+
if (GetTime() - LazyCurve.lastMsgTime) > 30000 and not self.DB.disableAutolinkReminder then -- 30 secs
70+
LazyCurve.lastMsgTime = GetTime()
71+
self:Print('To disable automatically whispering achievements, type \'/lazycurve\' and toggle off auto-linking on LFG application')
72+
end
73+
end
74+
end
75+
end
76+
77+
function LazyCurve:LFGListUtil_GetSearchEntryMenu(resultID)
78+
return self.utils.searchEntryMenu:GetSearchEntryMenu(resultID)
79+
end
80+
81+
function LazyCurve:processMsg(message)
82+
local original = message
83+
84+
for keyword, achievementId in pairs(self.utils.achievement:GetAchievementKeywordMap()) do
85+
message = self.utils.achievement.ReplaceKeywordWithAchievementLink(self, message, keyword, achievementId)
86+
end
87+
88+
if(original ~= message and self.DB.advertise) then
89+
message = self.PREFIX .. message
90+
end
91+
return message
92+
end
93+
94+
function LazyCurve:BNSendWhisper(id, msg)
95+
self.hooks.BNSendWhisper(id, self:processMsg(msg))
96+
end
97+
98+
function LazyCurve:SendChatMessage(msg, chatType, language, channel)
99+
self.hooks.SendChatMessage(self:processMsg(msg), chatType, language, channel);
100+
end
101+
102+
function LazyCurve:SendAchievement(leaderName, achievementId)
103+
local message = GetAchievementLink(achievementId)
104+
if(self.DB.advertise) then
105+
message = self.PREFIX .. message
106+
end
107+
self.hooks.SendChatMessage(message, 'WHISPER', nil, leaderName)
108+
end
109+
110+
function LazyCurve:ACHIEVEMENT_EARNED()
111+
self.utils.achievement:BuildAchievementKeywordMap()
112+
end
113+
114+
function LazyCurve:OnInitialize()
115+
self.DB = LazyCurveDB
116+
self:InitDefaults()
117+
118+
self.Config:Initialize()
119+
120+
self:RawHook('SendChatMessage', true)
121+
self:RawHook('BNSendWhisper', true)
122+
self:RawHook('LFGListUtil_GetSearchEntryMenu', true)
123+
LFGListApplicationDialog.SignUpButton:HookScript('OnClick', function(button) self:OnSignUp(button) end)
124+
125+
self:RegisterChatCommand('lc', self.Config.OpenConfig)
126+
self:RegisterChatCommand('lazycurve', self.Config.OpenConfig)
127+
128+
self:RegisterEvent('ACHIEVEMENT_EARNED');
129+
130+
C_Timer.After(15, function()
131+
--for some reason, some achievements don't properly load the first time you log in; so maybe delaying it helps
132+
self.utils.achievement:BuildAchievementKeywordMap()
133+
end)
134+
end
135+
136+
function LazyCurve:InitDefaults()
137+
local defaults = {
138+
advertise = true,
139+
140+
whisperOnApply = true,
141+
disableAutolinkReminder = false,
142+
mythicThreshold = 2,
143+
}
144+
local configChanged = false
145+
146+
for property, value in pairs(defaults) do
147+
if self.DB[property] == nil then
148+
self.DB[property] = value
149+
configChanged = true
150+
end
151+
end
152+
153+
if configChanged then
154+
C_Timer.After(4, function() self.Config:OpenConfig() end)
155+
end
156+
self:Print('loaded version', self.Config.version)
157+
158+
end

LazyCurve.toc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,9 @@
1010
## X-LoadOn-Always: true
1111

1212
libs\embeds.xml
13-
data.lua
14-
core.lua
13+
LazyCurve.lua
14+
Config.lua
15+
16+
Utils_Achievement.lua
17+
Utils_Module.lua
18+
Utils_SearchEntryMenu.lua

Utils_Achievement.lua

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
-- upvalue the globals
2+
local _G = getfenv(0)
3+
local LibStub = _G.LibStub
4+
local table = _G.table
5+
local GetAchievementInfo = _G.GetAchievementInfo
6+
local GetAchievementLink = _G.GetAchievementLink
7+
local ipairs = _G.ipairs
8+
local strfind = _G.strfind
9+
local strupper = _G.strupper
10+
local gsub = _G.gsub
11+
12+
local name = ...
13+
local LazyCurve = LibStub('AceAddon-3.0'):GetAddon(name)
14+
if not LazyCurve then return end
15+
16+
LazyCurve.utils = LazyCurve.utils or {}
17+
LazyCurve.utils.achievement = LazyCurve.utils.achievement or {}
18+
LazyCurve.utils.achievement.achievementKeywordMap = {}
19+
20+
function LazyCurve.utils.achievement:IsAchievementEarned(achievementId)
21+
_, _, _, completed, _ = GetAchievementInfo(achievementId);
22+
return completed or false
23+
end
24+
25+
function LazyCurve.utils.achievement:GetHighestEarnedAchievement(activityTable)
26+
local ret = {}
27+
28+
if self:IsAchievementEarned(activityTable.achievements.edge) then
29+
return {activityTable.achievements.edge}
30+
end
31+
32+
if self:IsAchievementEarned(activityTable.achievements.curve) then
33+
table.insert(ret, activityTable.achievements.curve)
34+
end
35+
36+
local earnedMythic = self:GetHighestEarnedMythicAchievement(activityTable)
37+
if earnedMythic then
38+
table.insert(ret, earnedMythic)
39+
end
40+
41+
if #ret == 0 then
42+
if self:IsAchievementEarned(activityTable.achievements.normal) then
43+
ret = {activityTable.achievements.normal}
44+
end
45+
end
46+
47+
return ret
48+
end
49+
50+
function LazyCurve.utils.achievement:GetHighestEarnedMythicAchievement(activityTable)
51+
local earnedMythic
52+
for _, achievementId in ipairs(activityTable.achievements.mythic) do
53+
if self:IsAchievementEarned(achievementId) then
54+
earnedMythic = achievementId
55+
end
56+
end
57+
return earnedMythic
58+
end
59+
60+
function LazyCurve.utils.achievement:BuildAchievementKeywordMap()
61+
local map = {}
62+
for _, module in LazyCurve:IterateModules() do
63+
for _, activityTable in ipairs(LazyCurve.utils.module:GetModuleInfoTable(module)) do
64+
if activityTable.isLatest then
65+
map.curve = activityTable.achievements.curve
66+
map.edge = activityTable.achievements.edge
67+
end
68+
69+
local names = {
70+
activityTable.shortName,
71+
activityTable.alternativeKeyword,
72+
}
73+
74+
for _, name in ipairs(names) do
75+
map[name .. 'normal'] = activityTable.achievements.normal
76+
map[name .. 'curve'] = activityTable.achievements.curve
77+
map[name .. 'edge'] = activityTable.achievements.edge
78+
map[name .. 'mythic'] = self:GetHighestEarnedMythicAchievement(activityTable) or activityTable.achievements.edge
79+
end
80+
end
81+
end
82+
self.achievementKeywordMap = map
83+
end
84+
85+
function LazyCurve.utils.achievement:GetAchievementKeywordMap()
86+
if not self.achievementKeywordMap then
87+
self:BuildAchievementKeywordMap()
88+
end
89+
90+
return self.achievementKeywordMap
91+
end
92+
93+
function LazyCurve.utils.achievement:ReplaceKeywordWithAchievementLink(message, keyword, achievementId)
94+
keyword = strupper(keyword)
95+
if strfind(message, keyword) then
96+
local found, _ = strfind(message, keyword)
97+
while(found ~= nil) do
98+
message, _ = gsub(message, keyword, GetAchievementLink(achievementId))
99+
found, _ = strfind(message, keyword)
100+
end
101+
end
102+
return message
103+
end

0 commit comments

Comments
 (0)