comparison Squawk.lua @ 7:d19385c4a282

More follow/unfollow logic with pending offline approval updated tests
author wobin
date Sun, 19 Apr 2009 02:45:38 +1000
parents b108025d5deb
children 34078dfcc67c
comparison
equal deleted inserted replaced
6:b108025d5deb 7:d19385c4a282
18 local defaults = { 18 local defaults = {
19 profile = { 19 profile = {
20 Squawks = {}, 20 Squawks = {},
21 Follower = {}, 21 Follower = {},
22 Following = {}, 22 Following = {},
23 Pending = {},
24 Requested = {},
23 Blocked = {}, 25 Blocked = {},
24 } 26 }
25 } 27 }
26 28
27 function Squawk:OnInitialize() 29 function Squawk:OnInitialize()
28 Model.db = LibStub("AceDB-3.0"):New("SquawkDB", defaults) 30 Model.db = LibStub("AceDB-3.0"):New("SquawkDB", defaults)
29 Model.Squawks = Model.db.profile.Squawks 31 Model.Squawks = Model.db.profile.Squawks
30 Settings.Follower = Model.db.profile.Follower 32 Settings.Follower = Model.db.profile.Follower
31 Settings.Following = Model.db.profile.Following 33 Settings.Following = Model.db.profile.Following
34 Settings.Pending = Model.db.profile.Pending
35 Settings.Requested = Model.db.profile.Requested
32 Settings.Blocked = Model.db.profile.Blocked 36 Settings.Blocked = Model.db.profile.Blocked
33 Settings.Private = Model.db.profile.Private 37 Settings.Private = Model.db.profile.Private
34 38
35 LibStub("AceComm-3.0"):Embed(Controller) 39 LibStub("AceComm-3.0"):Embed(Controller)
36 Controller:RegisterComm("Squawk", Controller.ReceiveMessage) 40 Controller:RegisterComm("Squawk", Controller.ReceiveMessage)
49 -- 53 --
50 -- Each User will have the following lists: 54 -- Each User will have the following lists:
51 -- * Follower 55 -- * Follower
52 -- * Following 56 -- * Following
53 -- * Blocked 57 -- * Blocked
58 -- * Pending (Requests to follow that you haven't acted on)
59 -- * Requested (Requests to follow that you have made)
54 -- * Privacy State 60 -- * Privacy State
61 --
62 -- A user can only request to follow an online person. Requests can be approved
63 -- on or offline, but the initial request must be made online.
64 --
65 -- When a user makes a request to follow a private user, the subsequent paths occur:
66 -- - Followee is added to Settings.Requested
67 -- - Followee receives 'follow request' -> (their) Settings.Pending
68 -- - Followee acts on request -> (their) Settings.Pending cleared
69 -- 1) Follwer is online
70 -- - Follower receives 'request accepted' -> Added to Settings.Following and
71 -- cleared from Settings.Requested
72 -- 2) Follower is offline
73 -- - The next time Follower is online and recieves a Squawk we check if there
74 -- is a Settings.Requested for that name, and if so assume they have approved
75 -- and clear/add records appropriately.
55 --]] 76 --]]
56 Model.Squawk = {} 77 Model.Squawk = {}
57 local Squawk = Model.Squawk 78 local Squawk = Model.Squawk
58 79
59 function Squawk:new(Message, Owner) 80 function Squawk:new(Message, Owner)
95 return Settings.Private 116 return Settings.Private
96 end 117 end
97 118
98 function Settings:AddFollower(Name) 119 function Settings:AddFollower(Name)
99 Settings.Follower[Name] = 1 120 Settings.Follower[Name] = 1
121 self:RemovePending(Name)
100 end 122 end
101 123
102 function Settings:AddFollowing(Name) 124 function Settings:AddFollowing(Name)
103 Settings.Following[Name] = 1 125 Settings.Following[Name] = 1
126 self:RemoveRequested(Name)
104 end 127 end
105 128
106 function Settings:AddBlock(Name) 129 function Settings:AddBlock(Name)
107 Settings.Blocked[Name] = 1 130 Settings.Blocked[Name] = 1
131 self:RemoveFollower(Name)
132 self:RemoveFollowing(Name)
133 end
134
135 function Settings:AddPending(Name)
136 Settings.Pending[Name] = 1
137 end
138
139 function Settings:AddRequested(Name)
140 Settings.Requested[Name] = 1
108 end 141 end
109 142
110 function Settings:RemoveFollower(Name) 143 function Settings:RemoveFollower(Name)
111 if Settings.Follower[Name] then 144 if Settings.Follower[Name] then
112 Settings.Follower[Name] = nil 145 Settings.Follower[Name] = nil
123 if Settings.Blocked[Name] then 156 if Settings.Blocked[Name] then
124 Settings.Blocked[Name] = nil 157 Settings.Blocked[Name] = nil
125 end 158 end
126 end 159 end
127 160
161 function Settings:RemovePending(Name)
162 if Settings.Pending[Name] then
163 Settings.Pending[Name] = nil
164 end
165 end
166
167 function Settings:RemoveRequested(Name)
168 if Settings.Requested[Name] then
169 Settings.Requested[Name] = nil
170 end
171 end
172
128 --Controller-- 173 --Controller--
129 174
130 function Controller:TheyWantToFollowMe(Name) 175 function Controller:TheyWantToFollowMe(Name)
131 if Settings:IsPrivate() then 176 if Settings:IsPrivate() then
177 Settings:AddPending(Name)
132 self:PutForwardFollowRequest(Name) 178 self:PutForwardFollowRequest(Name)
133 self:SendMessageToTarget(Name, "#Pending|"..UnitName("player")) 179 self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
134 else 180 else
135 Settings:AddFollower(Name) 181 Settings:AddFollower(Name)
136 View:NotifyOfNewFollower(Name) 182 View:NotifyOfNewFollower(Name)
137 self:SendMessageToTarget(Name, "#Follow|"..UnitName("player")) 183 self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
138 end 184 end
139 end 185 end
140 186
187 function Controller:TheyWantToUnfollowMe(Name)
188 Settings:RemoveFollower(Name)
189 end
190
141 function Controller:IWantToFollowThem(Name) 191 function Controller:IWantToFollowThem(Name)
142 self:SendMessageToTarget(Name, "#Request|"..UnitName("player")) 192 self:SendMessageToTarget(Name, "#Request|"..UnitName("player"))
193 Settings:AddRequested(Name)
194 end
195
196 function Controller:IWantToUnfollowThem(Name)
197 Settings:RemoveFollowing(Name)
198 self:SendMessageToTarget(Name, "#Unfollow|"..UnitName("player"))
199 View:NotifyOfUnfollowing(Name)
143 end 200 end
144 201
145 function Controller:IAmNowFollowingThem(Name) 202 function Controller:IAmNowFollowingThem(Name)
146 Settings:AddFollowing(Name) 203 Settings:AddFollowing(Name)
147 View:NotifyOfNewFollowing(Name) 204 View:NotifyOfNewFollowing(Name)
148 end 205 end
149 206
150 function Controller:AddANewSquawk(Name, Message) 207 function Controller:AddANewSquawk(Name, Message, Source)
151 table.insert(Model.Squawks, Squawk:new(Message, Name)) 208 if not Model.Blocked[Name] then
152 View:UpdateSquawkList() 209
210 if Source == "WHISPER" then
211 if Model.Requested[Name] then -- We've been approved offline!
212 Model:AddFollowing(Name)
213 end
214
215 if not Model.Following[Name] then -- If we're no longer following this person
216 self:SendMessageToTarget(Name, "#Unfollow|"..UnitName("player"))
217 return
218 end
219
220 table.insert(Model.Squawks, Squawk:new(Message, Name))
221 View:UpdateSquawkList()
222 end
153 end 223 end
154 224
155 function Controller:SendNewSquawk(Message) 225 function Controller:SendNewSquawk(Message)
156 if not Model:IsPrivate() then 226 if not Model:IsPrivate() then
157 self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message) 227 self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message)
166 236
167 function Controller:ImPending(Name) 237 function Controller:ImPending(Name)
168 View:NotifyOfPending(Name) 238 View:NotifyOfPending(Name)
169 end 239 end
170 240
241 function Controller:PutForwardFollowRequest(Name)
242 View:NotifyOfPendingRequest(Name)
243 end
244
171 function Controller:SendMessageToTarget(Name, Message) 245 function Controller:SendMessageToTarget(Name, Message)
172 self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK") 246 self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK")
173 end 247 end
174 248
175 function Controller:SendMessageToGuild(Message) 249 function Controller:SendMessageToGuild(Message)
177 end 251 end
178 252
179 local Parse = { 253 local Parse = {
180 ["#Pending"] = Controller.ImPending, 254 ["#Pending"] = Controller.ImPending,
181 ["#Follow"] = Controller.IAmNowFollowingThem, 255 ["#Follow"] = Controller.IAmNowFollowingThem,
256 ["#Unfollow"] = Controller.TheyWantToUnfollowMe,
182 ["#Squawk"] = Controller.AddANewSquawk, 257 ["#Squawk"] = Controller.AddANewSquawk,
183 ["#Request"] = Controller.TheyWantToFollowMe, 258 ["#Request"] = Controller.TheyWantToFollowMe,
184 } 259 }
185 260
186 function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender) 261 function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender)
187 local command, name, info = strsplit("|",Message) 262 local command, name, info = strsplit("|",Message)
188 Parse[command](self, name, info) 263 Parse[command](self, name, info, Distribution)
189 end 264 end
190 -- View -- 265 -- View --
191 266
192 function View:UpdateSquawkList() 267 function View:UpdateSquawkList()
193 self:Print("Updated Squawk List") 268 self:Print("Updated Squawk List")
196 271
197 function View:NotifyOfPending(Name) 272 function View:NotifyOfPending(Name)
198 self:Print(Name.." will have to approve your request") 273 self:Print(Name.." will have to approve your request")
199 end 274 end
200 275
276 function View:NotifyOfPendingRequest(Name)
277 self:Print(Name.." wants to follow you.")
278 end
279
201 function View:NotifyOfNewFollowing(Name) 280 function View:NotifyOfNewFollowing(Name)
202 self:Print("You are now following "..Name) 281 self:Print("You are now following "..Name)
203 end 282 end
204 283
284 function View:NotifyOfUnfollowing(Name)
285 self:Print("You are no longer following "..Name)
286 end
287
205 function View:NotifyOfNewFollower(Name) 288 function View:NotifyOfNewFollower(Name)
206 self:Print(Name.." is now following you") 289 self:Print(Name.." is now following you")
207 end 290 end
291
292 function View:NotifyOfNewFollower
208 293
209 function View:ShowMeMySquawks() 294 function View:ShowMeMySquawks()
210 for _,squawk in ipairs(Model.Squawks) do 295 for _,squawk in ipairs(Model.Squawks) do
211 self:Print(squawk.Message) 296 self:Print(squawk.Message)
212 end 297 end