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 |
