mckenziemc@0
|
1 -- Addon
|
mckenziemc@0
|
2 -- Represents individual addon modules
|
mckenziemc@0
|
3
|
mckenziemc@0
|
4
|
mckenziemc@0
|
5 local addonName, addonTable = ...
|
mckenziemc@0
|
6
|
mckenziemc@0
|
7 print("running Addon.lua")
|
mckenziemc@0
|
8
|
mckenziemc@0
|
9 -- NOTE: I assume that the API addon functions are
|
mckenziemc@0
|
10 -- slightly quicker with an index than with a number.
|
mckenziemc@0
|
11
|
mckenziemc@0
|
12 -- TODO: modify the dependency stuff to use the Errata module if available
|
mckenziemc@0
|
13
|
mckenziemc@0
|
14 local Addon, addon = addonTable:NewClass("Addon")
|
mckenziemc@0
|
15
|
mckenziemc@0
|
16 function Addon:New(id)
|
mckenziemc@0
|
17 assert(type(id) == "number" or type(id) == "string")
|
mckenziemc@0
|
18
|
mckenziemc@0
|
19 local instance = {}
|
mckenziemc@0
|
20
|
mckenziemc@0
|
21 setmetatable(instance, self.instanceMetatable)
|
mckenziemc@0
|
22
|
mckenziemc@0
|
23 if type(id) == "number" then
|
mckenziemc@0
|
24 -- TODO: make sure it's in range
|
mckenziemc@0
|
25 instance.index = id
|
mckenziemc@0
|
26 instance.name = GetAddOnInfo(id)
|
mckenziemc@0
|
27 else
|
mckenziemc@0
|
28 -- FIXME: allow blizzard addons?
|
mckenziemc@0
|
29 local index
|
mckenziemc@0
|
30
|
mckenziemc@0
|
31 for i=1,GetNumAddOns() do
|
mckenziemc@0
|
32 if GetAddOnInfo(i) == id then
|
mckenziemc@0
|
33 index = i
|
mckenziemc@0
|
34 break
|
mckenziemc@0
|
35 end
|
mckenziemc@0
|
36 end
|
mckenziemc@0
|
37
|
mckenziemc@0
|
38 if index then
|
mckenziemc@0
|
39 instance.name = GetAddOnInfo(id)
|
mckenziemc@0
|
40 instance.index = index
|
mckenziemc@0
|
41 else
|
mckenziemc@0
|
42 error("Addon not found")
|
mckenziemc@0
|
43 end
|
mckenziemc@0
|
44 end
|
mckenziemc@0
|
45
|
mckenziemc@0
|
46 return instance
|
mckenziemc@0
|
47 end
|
mckenziemc@0
|
48
|
mckenziemc@0
|
49
|
mckenziemc@0
|
50 -- Checks if an addon exists with the specified name.
|
mckenziemc@0
|
51 -- @param addon Name of the addon.
|
mckenziemc@0
|
52 -- @return True if the addon is present, false otherwise.
|
mckenziemc@0
|
53 function Addon:Exists(addon)
|
mckenziemc@0
|
54 if type(addon) == "number" then
|
mckenziemc@0
|
55 if addon >= 1 and addon <= GetNumAddOns() then
|
mckenziemc@0
|
56 return true
|
mckenziemc@0
|
57 else
|
mckenziemc@0
|
58 return false
|
mckenziemc@0
|
59 end
|
mckenziemc@0
|
60 elseif type(addon) == "string" then
|
mckenziemc@0
|
61 local status = select(6, GetAddOnInfo(addon))
|
mckenziemc@0
|
62
|
mckenziemc@0
|
63 if status == "MISSING" then
|
mckenziemc@0
|
64 return false
|
mckenziemc@0
|
65 else
|
mckenziemc@0
|
66 return true
|
mckenziemc@0
|
67 end
|
mckenziemc@0
|
68 else
|
mckenziemc@0
|
69 error()
|
mckenziemc@0
|
70 end
|
mckenziemc@0
|
71 end
|
mckenziemc@0
|
72
|
mckenziemc@0
|
73
|
mckenziemc@0
|
74 function addon:GetName()
|
mckenziemc@0
|
75 return self.name
|
mckenziemc@0
|
76 end
|
mckenziemc@0
|
77
|
mckenziemc@0
|
78
|
mckenziemc@0
|
79 function addon:GetIndex()
|
mckenziemc@0
|
80 return self.index
|
mckenziemc@0
|
81 end
|
mckenziemc@0
|
82
|
mckenziemc@0
|
83
|
mckenziemc@0
|
84 function addon:IsEnabled()
|
mckenziemc@0
|
85 -- FIXME: written while tired; review later
|
mckenziemc@0
|
86 local status = select(6, GetAddOnInfo(self.index))
|
mckenziemc@0
|
87
|
mckenziemc@0
|
88 if status == "DISABLED" then
|
mckenziemc@0
|
89 return false
|
mckenziemc@0
|
90 else
|
mckenziemc@0
|
91 return true
|
mckenziemc@0
|
92 end
|
mckenziemc@0
|
93 end
|
mckenziemc@0
|
94
|
mckenziemc@0
|
95 -- FIXME: an addon may be present but unloadable if loading out of date addons is disabled.
|
mckenziemc@0
|
96 -- NOTE: CanForceLoad and CanLoD don't check the status of dependencies
|
mckenziemc@0
|
97
|
mckenziemc@0
|
98 function addon:CanForceLoad()
|
mckenziemc@0
|
99 return true -- TODO: check if there's any reason addons can't be forceloaded
|
mckenziemc@0
|
100 end
|
mckenziemc@0
|
101
|
mckenziemc@0
|
102 function addon:CanLoD()
|
mckenziemc@0
|
103 -- FIXME: what will the client say about addons using LoadManagers if the LM was force-loaded?
|
mckenziemc@0
|
104 if IsAddOnLoadOnDemand(self.name) then
|
mckenziemc@0
|
105 return true
|
mckenziemc@0
|
106 else
|
mckenziemc@0
|
107 return false
|
mckenziemc@0
|
108 end
|
mckenziemc@0
|
109 end
|
mckenziemc@0
|
110
|
mckenziemc@0
|
111 -- NOTE: only call for LoD, not force-loading
|
mckenziemc@0
|
112 function addon:Load()
|
mckenziemc@0
|
113 assert(self:CanLoD())
|
mckenziemc@0
|
114
|
mckenziemc@0
|
115 EnableAddOn(self.name)
|
mckenziemc@0
|
116 LoadAddOn(self.name)
|
mckenziemc@0
|
117 end
|
mckenziemc@0
|
118
|
mckenziemc@0
|
119 function addon:ForceLoad()
|
mckenziemc@0
|
120 assert(self:CanForceLoad())
|
mckenziemc@0
|
121 -- TODO: make sure force-loading is available at this time
|
mckenziemc@0
|
122
|
mckenziemc@0
|
123 EnableAddOn(self.name) -- This should cause the game to also load this addon
|
mckenziemc@0
|
124 end
|
mckenziemc@0
|
125
|
mckenziemc@0
|
126
|
mckenziemc@0
|
127 function addon:GetDependencies()
|
mckenziemc@0
|
128 return GetAddOnDependencies(self.index)
|
mckenziemc@0
|
129 end
|
mckenziemc@0
|
130
|
mckenziemc@0
|
131
|
mckenziemc@0
|
132 function addon:GetEmbeds()
|
mckenziemc@0
|
133 local embeds = {}
|
mckenziemc@0
|
134
|
mckenziemc@0
|
135 local embedString = GetAddOnMetadata(self.name, "X-Embeds")
|
mckenziemc@0
|
136
|
mckenziemc@0
|
137 if embedString then
|
mckenziemc@0
|
138 for match in string.gmatch(embedString, "[^,%s]+") do
|
mckenziemc@0
|
139 table.insert(embeds, match)
|
mckenziemc@0
|
140 end
|
mckenziemc@0
|
141 end
|
mckenziemc@0
|
142
|
mckenziemc@0
|
143 return unpack(embeds)
|
mckenziemc@0
|
144 end
|
mckenziemc@0
|
145
|
mckenziemc@0
|
146 function addon:IsLoaded()
|
mckenziemc@0
|
147 if IsAddOnLoaded(self.index) then
|
mckenziemc@0
|
148 return true
|
mckenziemc@0
|
149 else
|
mckenziemc@0
|
150 return false
|
mckenziemc@0
|
151 end
|
mckenziemc@0
|
152 end
|