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)