wobin@0: -- A Twitter client of sorts for World of Warcraft wobin@0: -- Author: Wobin wobin@0: -- Email: wobster@gmail.com wobin@0: -- wobin@1: Squawk = LibStub("AceAddon-3.0"):NewAddon("Squawk") wobin@0: wobin@0: Squawk.Model = {} wobin@0: Squawk.View = {} wobin@0: Squawk.Controller = {} wobin@0: wobin@0: local Model = Squawk.Model wobin@0: local View = Squawk.View wobin@0: local Controller = Squawk.Controller wobin@0: wobin@0: Model.UserSettings = {} wobin@0: local Settings = Model.UserSettings wobin@0: wobin@0: local defaults = { wobin@0: profile = { wobin@0: Squawks = {}, wobin@0: Follower = {}, wobin@0: Following = {}, wobin@0: Blocked = {}, wobin@0: } wobin@0: } wobin@0: wobin@0: function Squawk:OnInitialize() wobin@0: Model.db = LibStub("AceDB-3.0"):New("SquawkDB", defaults) wobin@0: Settings.Follower = Model.db.profile.Follower wobin@0: Settings.Following = Model.db.profile.Following wobin@0: Settings.Blocked = Model.db.profile.Blocked wobin@0: Settings.Private = Model.db.profile.Private wobin@0: wobin@0: LibStub("AceComm-3.0"):Embed(Controller) wobin@0: Controller:RegisterComm("Squawk", ReceiveMessage) wobin@0: end wobin@0: wobin@0: -- Model -- wobin@0: --[[ wobin@0: --Each Squawk will have the following information: wobin@0: -- * Owner (Name) wobin@0: -- * Time (Epoch) wobin@0: -- * Message (140 characters) wobin@0: -- * ReplyTo (Name) wobin@0: -- * Related (Names) wobin@0: -- wobin@0: -- Each User will have the following lists: wobin@0: -- * Follower wobin@0: -- * Following wobin@0: -- * Blocked wobin@0: -- * Privacy State wobin@0: --]] wobin@0: Model.Squawk = {} wobin@0: local Squawk = Model.Squawk wobin@0: wobin@0: function Squawk:new(Message, Owner) wobin@0: local o = {} wobin@0: o.Owner = Owner or UnitName("player") wobin@0: o.Message = Message wobin@0: o.Time = os.time() wobin@0: local reply, to = strsplit("@", ((strsplit(" ", Message)))) wobin@0: if reply == "" then wobin@0: o.ReplyTo = to wobin@0: end wobin@0: wobin@0: o.Related = {} wobin@0: wobin@0: for word in string.gmatch(Message, "@(%a+)") do wobin@0: if word ~= o.ReplyTo or "" then wobin@0: table.insert(o.Related, word) wobin@0: end wobin@0: end wobin@0: wobin@0: return o wobin@0: end wobin@0: wobin@0: function Squawk:Sort(Squawks) wobin@0: return table.sort(Squawks, function(a,b) return a.Time < b.Time end) wobin@0: end wobin@0: wobin@0: function Settings:IsPrivate() wobin@0: return Settings.Private wobin@0: end wobin@0: wobin@0: function Settings:AddFollower(Name) wobin@0: table.insert(Settings.Follower, Name) wobin@0: end wobin@0: wobin@0: function Settings:AddFollowing(Name) wobin@0: table.insert(Settings.Following, Name) wobin@0: end wobin@0: wobin@0: function Settings:AddBlock(Name) wobin@0: table.insert(Settings.Blocked, Name) wobin@0: end wobin@0: wobin@0: function Settings:RemoveFollower(Name) wobin@0: for i,v in ipairs(Settings.Follower) do wobin@0: if v == Name then wobin@0: table.remove(Settings.Follower, i) wobin@0: return wobin@0: end wobin@0: end wobin@0: end wobin@0: wobin@0: function Settings:RemoveFollowing(Name) wobin@0: for i,v in ipairs(Settings.Following) do wobin@0: if v == Name then wobin@0: table.remove(Settings.Following, i) wobin@0: return wobin@0: end wobin@0: end wobin@0: end wobin@0: wobin@0: function Settings:RemoveBlock(Name) wobin@0: for i,v in ipairs(Settings.Blocked) do wobin@0: if v == Name then wobin@0: table.remove(Settings.Blocked, i) wobin@0: return wobin@0: end wobin@0: end wobin@0: end wobin@0: wobin@0: --Controller-- wobin@0: wobin@0: function Controller:TheyWantToFollowMe(Name) wobin@0: if Settings:IsPrivate() then wobin@0: self:PutForwardFollowRequest(Name) wobin@0: self:SendMessageToTarget(Name, "#Pending|"..UnitName("player")) wobin@0: else wobin@0: Settings:AddFollower(Name) wobin@0: View:NotifyOfNewFollower(Name) wobin@0: self:SendMessageToTarget(Name, "#Follow|"..UnitName("player")) wobin@0: end wobin@0: end wobin@0: wobin@0: function Controller:IWantToFollowThem(Name) wobin@0: wobin@0: end wobin@0: wobin@0: function Controller:IAmNowFollowingThem(Name) wobin@0: Settings:AddFollowing(Name) wobin@0: View:NotifyOfNewFollowing(Name) wobin@0: end wobin@0: wobin@0: function Controller:AddANewSquawk(Name, Message) wobin@0: table.insert(Model.db.Squawks, Squawk:new(Message, Name)) wobin@0: View:UpdateSquawkList() wobin@0: end wobin@0: wobin@1: function Controller:ImPending(Name) wobin@1: View:NotifyOfPending(Name) wobin@1: end wobin@1: wobin@0: function Controller:SendMessageToTarget(Name, Message) wobin@0: self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK") wobin@0: end wobin@0: wobin@0: function Controller:SendMessageToGuild(Message) wobin@0: self:SendCommMessage("Squawk", Message, "GUILD") wobin@0: end wobin@0: wobin@0: local Parse = { wobin@1: ["#Pending"] = Controller.ImPending, wobin@1: ["#Follow"] = Controller.IAmNowFollowingThem, wobin@1: ["#Squawk"] = Controller.AddANewSquawk wobin@0: } wobin@0: wobin@0: function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender) wobin@0: local command, name, info = strsplit("|",Message) wobin@1: Parse[command](self, name, info) wobin@0: end wobin@0: -- View -- wobin@0: wobin@0: function View:UpdateSquawkList() wobin@0: end wobin@0: wobin@0: function View:NotifyOfPending() wobin@0: end wobin@0: wobin@0: function View:NotifyOfNewFollowing(Name) wobin@0: end wobin@0: wobin@0: function View:NotifyOfNewFollower(Name) wobin@0: end