Mercurial > wow > squawk
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 |