view Squawk.lua @ 3:1cc6e4710e2e

adding tests
author wobin
date Fri, 17 Apr 2009 15:59:51 +1000
parents 75a76882c343
children d1383f2d9b43
line wrap: on
line source
-- A Twitter client of sorts for World of Warcraft
-- Author: Wobin
-- Email: wobster@gmail.com
--
Squawk = LibStub("AceAddon-3.0"):NewAddon("Squawk")

Squawk.Model = {}
Squawk.View = {}
Squawk.Controller = {}

local Model = Squawk.Model
local View = Squawk.View
local Controller = Squawk.Controller

Model.UserSettings = {}
local Settings = Model.UserSettings

local defaults = {
	profile = {
		Squawks = {},
		Follower = {},
		Following = {},
		Blocked = {},
	}
}

function Squawk:OnInitialize()
	Model.db = LibStub("AceDB-3.0"):New("SquawkDB", defaults)
	Settings.Follower = Model.db.profile.Follower
	Settings.Following = Model.db.profile.Following
	Settings.Blocked = Model.db.profile.Blocked
	Settings.Private = Model.db.profile.Private
	
	LibStub("AceComm-3.0"):Embed(Controller)
	Controller:RegisterComm("Squawk", Controller.ReceiveMessage)

	LibStub("AceConsole-3.0"):Embed(View)
end

-- Model --
--[[
--Each Squawk will have the following information:
-- * Owner (Name)
-- * Time (Epoch)
-- * Message (140 characters)
-- * ReplyTo (Name)
-- * Related (Names)
--
-- Each User will have the following lists:
-- * Follower
-- * Following
-- * Blocked
-- * Privacy State
--]]
Model.Squawk = {}
local Squawk = Model.Squawk

function Squawk:new(Message, Owner)
	local o = {}
	o.Owner = Owner or UnitName("player")
	o.Message = Message
	o.Time = os.time()
	local reply, to = strsplit("@", ((strsplit(" ", Message))))
	if reply == "" then
		o.ReplyTo = to
	end

	o.Related = {}

	for word in string.gmatch(Message, "@(%a+)") do
		if word ~= o.ReplyTo or "" then
			table.insert(o.Related, word)
		end
	end

	return o
end

function Squawk:Sort(Squawks)
	return table.sort(Squawks, function(a,b) return a.Time < b.Time end)
end

function Squawk:GetOwn(Squawks)
	local mine = {}
	for _, squawk in ipairs(Squawks) do
		if squawk.Owner == UnitName("player") then
			table.insert(mine, squawk)
		end
	end
	return self:Sort(mine)
end

function Settings:IsPrivate()
	return Settings.Private
end

function Settings:AddFollower(Name)
	Settings.Follower[Name] = 1
end

function Settings:AddFollowing(Name)
	Settings.Following[Name] = 1
end

function Settings:AddBlock(Name)
	Settings.Blocked[Name] = 1
end

function Settings:RemoveFollower(Name)
	if Settings.Follower[Name] then
		Settings.Follower[Name] = nil
	end
end

function Settings:RemoveFollowing(Name)
	if Settings.Following[Name] then
		Settings.Following[Name] = nil
	end
end

function Settings:RemoveBlock(Name)
	if Settings.Blocked[Name] then
		Settings.Blocked[Name] = nil
	end
end

--Controller--

function Controller:TheyWantToFollowMe(Name)
	if Settings:IsPrivate() then
		self:PutForwardFollowRequest(Name)
		self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
	else
		Settings:AddFollower(Name)
		View:NotifyOfNewFollower(Name)
		self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
	end
end

function Controller:IWantToFollowThem(Name)
	self:SendMessageToTarget(Name, "#Request|"..UnitName("player"))
end

function Controller:IAmNowFollowingThem(Name)
	Settings:AddFollowing(Name)
	View:NotifyOfNewFollowing(Name)
end

function Controller:AddANewSquawk(Name, Message)
	table.insert(Model.db.Squawks, Squawk:new(Message, Name))
	View:UpdateSquawkList()
end

function Controller:SendNewSquawk(Message)
	if not Model:IsPrivate() then
		self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message)
	end

	self:AddANewSquawk(UnitName("player"), Message)
	
	for name, _ in pairs(Model.Following) do
		self:SendMessageToTarget(name, "#Squawk|"..UnitName("player").."|"..Message)
	end
end

function Controller:ImPending(Name)
	View:NotifyOfPending(Name)
end

function Controller:SendMessageToTarget(Name, Message)
	self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK")
end

function Controller:SendMessageToGuild(Message)
	self:SendCommMessage("Squawk", Message, "GUILD")
end

local Parse = { 
		["#Pending"] = Controller.ImPending,
		["#Follow"] = Controller.IAmNowFollowingThem,
		["#Squawk"] = Controller.AddANewSquawk,
		["#Request"] = Controller.TheyWantToFollowMe,
	}

function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender)
	local command, name, info = strsplit("|",Message)
	Parse[command](self, name, info)
end
-- View --

function View:UpdateSquawkList()
	self:Print("Updated Squawk List")
end

function View:NotifyOfPending(Name)
	self:Print(Name.." will have to approve your request")
end

function View:NotifyOfNewFollowing(Name)
	self:Print("You are now following "..Name)
end

function View:NotifyOfNewFollower(Name)
	self:Print(Name.." is now following you")
end