wobin@0
|
1 -- A Twitter client of sorts for World of Warcraft
|
wobin@0
|
2 -- Author: Wobin
|
wobin@0
|
3 -- Email: wobster@gmail.com
|
wobin@0
|
4 --
|
wobin@1
|
5 Squawk = LibStub("AceAddon-3.0"):NewAddon("Squawk")
|
wobin@0
|
6
|
wobin@0
|
7 Squawk.Model = {}
|
wobin@0
|
8 Squawk.View = {}
|
wobin@0
|
9 Squawk.Controller = {}
|
wobin@0
|
10
|
wobin@0
|
11 local Model = Squawk.Model
|
wobin@0
|
12 local View = Squawk.View
|
wobin@0
|
13 local Controller = Squawk.Controller
|
wobin@0
|
14
|
wobin@0
|
15 Model.UserSettings = {}
|
wobin@0
|
16 local Settings = Model.UserSettings
|
wobin@0
|
17
|
wobin@0
|
18 local defaults = {
|
wobin@0
|
19 profile = {
|
wobin@0
|
20 Squawks = {},
|
wobin@0
|
21 Follower = {},
|
wobin@0
|
22 Following = {},
|
wobin@0
|
23 Blocked = {},
|
wobin@0
|
24 }
|
wobin@0
|
25 }
|
wobin@0
|
26
|
wobin@0
|
27 function Squawk:OnInitialize()
|
wobin@0
|
28 Model.db = LibStub("AceDB-3.0"):New("SquawkDB", defaults)
|
wobin@4
|
29 Model.Squawks = Model.db.profile.Squawks
|
wobin@0
|
30 Settings.Follower = Model.db.profile.Follower
|
wobin@0
|
31 Settings.Following = Model.db.profile.Following
|
wobin@0
|
32 Settings.Blocked = Model.db.profile.Blocked
|
wobin@0
|
33 Settings.Private = Model.db.profile.Private
|
wobin@0
|
34
|
wobin@0
|
35 LibStub("AceComm-3.0"):Embed(Controller)
|
wobin@3
|
36 Controller:RegisterComm("Squawk", Controller.ReceiveMessage)
|
wobin@3
|
37
|
wobin@3
|
38 LibStub("AceConsole-3.0"):Embed(View)
|
wobin@0
|
39 end
|
wobin@0
|
40
|
wobin@0
|
41 -- Model --
|
wobin@0
|
42 --[[
|
wobin@0
|
43 --Each Squawk will have the following information:
|
wobin@0
|
44 -- * Owner (Name)
|
wobin@0
|
45 -- * Time (Epoch)
|
wobin@0
|
46 -- * Message (140 characters)
|
wobin@0
|
47 -- * ReplyTo (Name)
|
wobin@0
|
48 -- * Related (Names)
|
wobin@0
|
49 --
|
wobin@0
|
50 -- Each User will have the following lists:
|
wobin@0
|
51 -- * Follower
|
wobin@0
|
52 -- * Following
|
wobin@0
|
53 -- * Blocked
|
wobin@0
|
54 -- * Privacy State
|
wobin@0
|
55 --]]
|
wobin@0
|
56 Model.Squawk = {}
|
wobin@0
|
57 local Squawk = Model.Squawk
|
wobin@0
|
58
|
wobin@0
|
59 function Squawk:new(Message, Owner)
|
wobin@0
|
60 local o = {}
|
wobin@0
|
61 o.Owner = Owner or UnitName("player")
|
wobin@0
|
62 o.Message = Message
|
wobin@0
|
63 o.Time = os.time()
|
wobin@0
|
64 local reply, to = strsplit("@", ((strsplit(" ", Message))))
|
wobin@0
|
65 if reply == "" then
|
wobin@0
|
66 o.ReplyTo = to
|
wobin@0
|
67 end
|
wobin@0
|
68
|
wobin@0
|
69 o.Related = {}
|
wobin@0
|
70
|
wobin@0
|
71 for word in string.gmatch(Message, "@(%a+)") do
|
wobin@0
|
72 if word ~= o.ReplyTo or "" then
|
wobin@0
|
73 table.insert(o.Related, word)
|
wobin@0
|
74 end
|
wobin@0
|
75 end
|
wobin@0
|
76
|
wobin@0
|
77 return o
|
wobin@0
|
78 end
|
wobin@0
|
79
|
wobin@0
|
80 function Squawk:Sort(Squawks)
|
wobin@0
|
81 return table.sort(Squawks, function(a,b) return a.Time < b.Time end)
|
wobin@0
|
82 end
|
wobin@0
|
83
|
wobin@2
|
84 function Squawk:GetOwn(Squawks)
|
wobin@2
|
85 local mine = {}
|
wobin@2
|
86 for _, squawk in ipairs(Squawks) do
|
wobin@2
|
87 if squawk.Owner == UnitName("player") then
|
wobin@2
|
88 table.insert(mine, squawk)
|
wobin@2
|
89 end
|
wobin@2
|
90 end
|
wobin@2
|
91 return self:Sort(mine)
|
wobin@2
|
92 end
|
wobin@2
|
93
|
wobin@0
|
94 function Settings:IsPrivate()
|
wobin@0
|
95 return Settings.Private
|
wobin@0
|
96 end
|
wobin@0
|
97
|
wobin@0
|
98 function Settings:AddFollower(Name)
|
wobin@2
|
99 Settings.Follower[Name] = 1
|
wobin@0
|
100 end
|
wobin@0
|
101
|
wobin@0
|
102 function Settings:AddFollowing(Name)
|
wobin@2
|
103 Settings.Following[Name] = 1
|
wobin@0
|
104 end
|
wobin@0
|
105
|
wobin@0
|
106 function Settings:AddBlock(Name)
|
wobin@2
|
107 Settings.Blocked[Name] = 1
|
wobin@0
|
108 end
|
wobin@0
|
109
|
wobin@0
|
110 function Settings:RemoveFollower(Name)
|
wobin@2
|
111 if Settings.Follower[Name] then
|
wobin@2
|
112 Settings.Follower[Name] = nil
|
wobin@0
|
113 end
|
wobin@0
|
114 end
|
wobin@0
|
115
|
wobin@0
|
116 function Settings:RemoveFollowing(Name)
|
wobin@2
|
117 if Settings.Following[Name] then
|
wobin@2
|
118 Settings.Following[Name] = nil
|
wobin@0
|
119 end
|
wobin@0
|
120 end
|
wobin@0
|
121
|
wobin@0
|
122 function Settings:RemoveBlock(Name)
|
wobin@2
|
123 if Settings.Blocked[Name] then
|
wobin@2
|
124 Settings.Blocked[Name] = nil
|
wobin@0
|
125 end
|
wobin@0
|
126 end
|
wobin@0
|
127
|
wobin@0
|
128 --Controller--
|
wobin@0
|
129
|
wobin@0
|
130 function Controller:TheyWantToFollowMe(Name)
|
wobin@0
|
131 if Settings:IsPrivate() then
|
wobin@0
|
132 self:PutForwardFollowRequest(Name)
|
wobin@0
|
133 self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
|
wobin@0
|
134 else
|
wobin@0
|
135 Settings:AddFollower(Name)
|
wobin@0
|
136 View:NotifyOfNewFollower(Name)
|
wobin@0
|
137 self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
|
wobin@0
|
138 end
|
wobin@0
|
139 end
|
wobin@0
|
140
|
wobin@0
|
141 function Controller:IWantToFollowThem(Name)
|
wobin@2
|
142 self:SendMessageToTarget(Name, "#Request|"..UnitName("player"))
|
wobin@0
|
143 end
|
wobin@0
|
144
|
wobin@0
|
145 function Controller:IAmNowFollowingThem(Name)
|
wobin@0
|
146 Settings:AddFollowing(Name)
|
wobin@0
|
147 View:NotifyOfNewFollowing(Name)
|
wobin@0
|
148 end
|
wobin@0
|
149
|
wobin@0
|
150 function Controller:AddANewSquawk(Name, Message)
|
wobin@4
|
151 table.insert(Model.Squawks, Squawk:new(Message, Name))
|
wobin@0
|
152 View:UpdateSquawkList()
|
wobin@0
|
153 end
|
wobin@0
|
154
|
wobin@2
|
155 function Controller:SendNewSquawk(Message)
|
wobin@2
|
156 if not Model:IsPrivate() then
|
wobin@2
|
157 self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message)
|
wobin@2
|
158 end
|
wobin@2
|
159
|
wobin@2
|
160 self:AddANewSquawk(UnitName("player"), Message)
|
wobin@2
|
161
|
wobin@2
|
162 for name, _ in pairs(Model.Following) do
|
wobin@2
|
163 self:SendMessageToTarget(name, "#Squawk|"..UnitName("player").."|"..Message)
|
wobin@2
|
164 end
|
wobin@2
|
165 end
|
wobin@2
|
166
|
wobin@1
|
167 function Controller:ImPending(Name)
|
wobin@1
|
168 View:NotifyOfPending(Name)
|
wobin@1
|
169 end
|
wobin@1
|
170
|
wobin@0
|
171 function Controller:SendMessageToTarget(Name, Message)
|
wobin@0
|
172 self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK")
|
wobin@0
|
173 end
|
wobin@0
|
174
|
wobin@0
|
175 function Controller:SendMessageToGuild(Message)
|
wobin@0
|
176 self:SendCommMessage("Squawk", Message, "GUILD")
|
wobin@0
|
177 end
|
wobin@0
|
178
|
wobin@0
|
179 local Parse = {
|
wobin@1
|
180 ["#Pending"] = Controller.ImPending,
|
wobin@1
|
181 ["#Follow"] = Controller.IAmNowFollowingThem,
|
wobin@2
|
182 ["#Squawk"] = Controller.AddANewSquawk,
|
wobin@2
|
183 ["#Request"] = Controller.TheyWantToFollowMe,
|
wobin@0
|
184 }
|
wobin@0
|
185
|
wobin@0
|
186 function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender)
|
wobin@0
|
187 local command, name, info = strsplit("|",Message)
|
wobin@1
|
188 Parse[command](self, name, info)
|
wobin@0
|
189 end
|
wobin@0
|
190 -- View --
|
wobin@0
|
191
|
wobin@0
|
192 function View:UpdateSquawkList()
|
wobin@3
|
193 self:Print("Updated Squawk List")
|
wobin@4
|
194 self:ShowMeMySquawks()
|
wobin@0
|
195 end
|
wobin@0
|
196
|
wobin@3
|
197 function View:NotifyOfPending(Name)
|
wobin@3
|
198 self:Print(Name.." will have to approve your request")
|
wobin@0
|
199 end
|
wobin@0
|
200
|
wobin@0
|
201 function View:NotifyOfNewFollowing(Name)
|
wobin@3
|
202 self:Print("You are now following "..Name)
|
wobin@0
|
203 end
|
wobin@0
|
204
|
wobin@0
|
205 function View:NotifyOfNewFollower(Name)
|
wobin@3
|
206 self:Print(Name.." is now following you")
|
wobin@0
|
207 end
|
wobin@4
|
208
|
wobin@4
|
209 function View:ShowMeMySquawks()
|
wobin@5
|
210 for _,squawk in ipairs(Model.Squawks) do
|
wobin@4
|
211 self:Print(squawk.Message)
|
wobin@4
|
212 end
|
wobin@4
|
213 end
|
wobin@4
|
214
|
wobin@4
|
215 function View:ShowMeMyFollowers()
|
wobin@4
|
216 self:Print("My followers are:")
|
wobin@4
|
217 for name,_ in pairs(Settings.Follower) do
|
wobin@4
|
218 self:Print(name)
|
wobin@4
|
219 end
|
wobin@4
|
220 end
|
wobin@4
|
221
|
wobin@4
|
222 function View:ShowMeWhoImFollowing()
|
wobin@4
|
223 self:Print("I am following:")
|
wobin@4
|
224 for name,_ in pairs(Settings.Following) do
|
wobin@4
|
225 self:Print(name)
|
wobin@4
|
226 end
|
wobin@4
|
227 end
|
wobin@4
|
228
|
wobin@4
|
229 function View:ShowMeWhoIveBlocked()
|
wobin@4
|
230 self:Print("I've blocked:")
|
wobin@4
|
231 for name, in pairs(Settings.Blocked) do
|
wobin@4
|
232 self:Print(name)
|
wobin@4
|
233 end
|
wobin@4
|
234 end
|