Mercurial > wow > squawk
changeset 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 |
files | Squawk.lua Tests.lua |
diffstat | 2 files changed, 109 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/Squawk.lua Fri Apr 17 20:47:06 2009 +1000 +++ b/Squawk.lua Sun Apr 19 02:45:38 2009 +1000 @@ -20,6 +20,8 @@ Squawks = {}, Follower = {}, Following = {}, + Pending = {}, + Requested = {}, Blocked = {}, } } @@ -29,6 +31,8 @@ Model.Squawks = Model.db.profile.Squawks Settings.Follower = Model.db.profile.Follower Settings.Following = Model.db.profile.Following + Settings.Pending = Model.db.profile.Pending + Settings.Requested = Model.db.profile.Requested Settings.Blocked = Model.db.profile.Blocked Settings.Private = Model.db.profile.Private @@ -51,7 +55,24 @@ -- * Follower -- * Following -- * Blocked +-- * Pending (Requests to follow that you haven't acted on) +-- * Requested (Requests to follow that you have made) -- * Privacy State +-- +-- A user can only request to follow an online person. Requests can be approved +-- on or offline, but the initial request must be made online. +-- +-- When a user makes a request to follow a private user, the subsequent paths occur: +-- - Followee is added to Settings.Requested +-- - Followee receives 'follow request' -> (their) Settings.Pending +-- - Followee acts on request -> (their) Settings.Pending cleared +-- 1) Follwer is online +-- - Follower receives 'request accepted' -> Added to Settings.Following and +-- cleared from Settings.Requested +-- 2) Follower is offline +-- - The next time Follower is online and recieves a Squawk we check if there +-- is a Settings.Requested for that name, and if so assume they have approved +-- and clear/add records appropriately. --]] Model.Squawk = {} local Squawk = Model.Squawk @@ -97,14 +118,26 @@ function Settings:AddFollower(Name) Settings.Follower[Name] = 1 + self:RemovePending(Name) end function Settings:AddFollowing(Name) Settings.Following[Name] = 1 + self:RemoveRequested(Name) end function Settings:AddBlock(Name) Settings.Blocked[Name] = 1 + self:RemoveFollower(Name) + self:RemoveFollowing(Name) +end + +function Settings:AddPending(Name) + Settings.Pending[Name] = 1 +end + +function Settings:AddRequested(Name) + Settings.Requested[Name] = 1 end function Settings:RemoveFollower(Name) @@ -125,10 +158,23 @@ end end +function Settings:RemovePending(Name) + if Settings.Pending[Name] then + Settings.Pending[Name] = nil + end +end + +function Settings:RemoveRequested(Name) + if Settings.Requested[Name] then + Settings.Requested[Name] = nil + end +end + --Controller-- function Controller:TheyWantToFollowMe(Name) if Settings:IsPrivate() then + Settings:AddPending(Name) self:PutForwardFollowRequest(Name) self:SendMessageToTarget(Name, "#Pending|"..UnitName("player")) else @@ -138,8 +184,19 @@ end end +function Controller:TheyWantToUnfollowMe(Name) + Settings:RemoveFollower(Name) +end + function Controller:IWantToFollowThem(Name) self:SendMessageToTarget(Name, "#Request|"..UnitName("player")) + Settings:AddRequested(Name) +end + +function Controller:IWantToUnfollowThem(Name) + Settings:RemoveFollowing(Name) + self:SendMessageToTarget(Name, "#Unfollow|"..UnitName("player")) + View:NotifyOfUnfollowing(Name) end function Controller:IAmNowFollowingThem(Name) @@ -147,9 +204,22 @@ View:NotifyOfNewFollowing(Name) end -function Controller:AddANewSquawk(Name, Message) - table.insert(Model.Squawks, Squawk:new(Message, Name)) - View:UpdateSquawkList() +function Controller:AddANewSquawk(Name, Message, Source) + if not Model.Blocked[Name] then + + if Source == "WHISPER" then + if Model.Requested[Name] then -- We've been approved offline! + Model:AddFollowing(Name) + end + + if not Model.Following[Name] then -- If we're no longer following this person + self:SendMessageToTarget(Name, "#Unfollow|"..UnitName("player")) + return + end + + table.insert(Model.Squawks, Squawk:new(Message, Name)) + View:UpdateSquawkList() + end end function Controller:SendNewSquawk(Message) @@ -168,6 +238,10 @@ View:NotifyOfPending(Name) end +function Controller:PutForwardFollowRequest(Name) + View:NotifyOfPendingRequest(Name) +end + function Controller:SendMessageToTarget(Name, Message) self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK") end @@ -179,13 +253,14 @@ local Parse = { ["#Pending"] = Controller.ImPending, ["#Follow"] = Controller.IAmNowFollowingThem, + ["#Unfollow"] = Controller.TheyWantToUnfollowMe, ["#Squawk"] = Controller.AddANewSquawk, ["#Request"] = Controller.TheyWantToFollowMe, } function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender) local command, name, info = strsplit("|",Message) - Parse[command](self, name, info) + Parse[command](self, name, info, Distribution) end -- View -- @@ -198,14 +273,24 @@ self:Print(Name.." will have to approve your request") end +function View:NotifyOfPendingRequest(Name) + self:Print(Name.." wants to follow you.") +end + function View:NotifyOfNewFollowing(Name) self:Print("You are now following "..Name) end +function View:NotifyOfUnfollowing(Name) + self:Print("You are no longer following "..Name) +end + function View:NotifyOfNewFollower(Name) self:Print(Name.." is now following you") end +function View:NotifyOfNewFollower + function View:ShowMeMySquawks() for _,squawk in ipairs(Model.Squawks) do self:Print(squawk.Message)
--- a/Tests.lua Fri Apr 17 20:47:06 2009 +1000 +++ b/Tests.lua Sun Apr 19 02:45:38 2009 +1000 @@ -26,11 +26,28 @@ end function Test:RunTests() - + AddPublicFollower() + RemovePublicFollower() + AddPrivateFollower() + ApprovePendingRequest() end -function Test:AddFollower() - +function Test:AddPublicFollower() + Squawk.Settings.Private = false + Squawk.Controller:IWantToFollowThem(UnitName("player")) +end + +function Test:RemovePublicFollower() + Squawk.Controller:IWantToUnfollowThem(UnitName("player")) +end + +function Test:AddPrivateFollower() + Squawk.Settings.Private = true + Squawk.Controller:IWantToFollowThem(UnitName("player")) +end + +function Test:ApprovePendingRequest() + Squawk.Controller:ApprovePendingRequest(Name) end function Test:ReceiveMessage(Prefix, Message, Distribution, Sender)