annotate Squawk.lua @ 2:75a76882c343

more work on the controller
author wobin
date Thu, 16 Apr 2009 22:05:24 +1000
parents 188273d0efad
children 1cc6e4710e2e
rev   line source
wobin@0 1 -- A Twitter client of sorts for World of Warcraft
wobin@0 2 -- Author: Wobin
wobin@0 3 -- Email: wobster@gmail.com
wobin@0 4 --
wobin@1 5 Squawk = LibStub("AceAddon-3.0"):NewAddon("Squawk")
wobin@0 6
wobin@0 7 Squawk.Model = {}
wobin@0 8 Squawk.View = {}
wobin@0 9 Squawk.Controller = {}
wobin@0 10
wobin@0 11 local Model = Squawk.Model
wobin@0 12 local View = Squawk.View
wobin@0 13 local Controller = Squawk.Controller
wobin@0 14
wobin@0 15 Model.UserSettings = {}
wobin@0 16 local Settings = Model.UserSettings
wobin@0 17
wobin@0 18 local defaults = {
wobin@0 19 profile = {
wobin@0 20 Squawks = {},
wobin@0 21 Follower = {},
wobin@0 22 Following = {},
wobin@0 23 Blocked = {},
wobin@0 24 }
wobin@0 25 }
wobin@0 26
wobin@0 27 function Squawk:OnInitialize()
wobin@0 28 Model.db = LibStub("AceDB-3.0"):New("SquawkDB", defaults)
wobin@0 29 Settings.Follower = Model.db.profile.Follower
wobin@0 30 Settings.Following = Model.db.profile.Following
wobin@0 31 Settings.Blocked = Model.db.profile.Blocked
wobin@0 32 Settings.Private = Model.db.profile.Private
wobin@0 33
wobin@0 34 LibStub("AceComm-3.0"):Embed(Controller)
wobin@0 35 Controller:RegisterComm("Squawk", ReceiveMessage)
wobin@0 36 end
wobin@0 37
wobin@0 38 -- Model --
wobin@0 39 --[[
wobin@0 40 --Each Squawk will have the following information:
wobin@0 41 -- * Owner (Name)
wobin@0 42 -- * Time (Epoch)
wobin@0 43 -- * Message (140 characters)
wobin@0 44 -- * ReplyTo (Name)
wobin@0 45 -- * Related (Names)
wobin@0 46 --
wobin@0 47 -- Each User will have the following lists:
wobin@0 48 -- * Follower
wobin@0 49 -- * Following
wobin@0 50 -- * Blocked
wobin@0 51 -- * Privacy State
wobin@0 52 --]]
wobin@0 53 Model.Squawk = {}
wobin@0 54 local Squawk = Model.Squawk
wobin@0 55
wobin@0 56 function Squawk:new(Message, Owner)
wobin@0 57 local o = {}
wobin@0 58 o.Owner = Owner or UnitName("player")
wobin@0 59 o.Message = Message
wobin@0 60 o.Time = os.time()
wobin@0 61 local reply, to = strsplit("@", ((strsplit(" ", Message))))
wobin@0 62 if reply == "" then
wobin@0 63 o.ReplyTo = to
wobin@0 64 end
wobin@0 65
wobin@0 66 o.Related = {}
wobin@0 67
wobin@0 68 for word in string.gmatch(Message, "@(%a+)") do
wobin@0 69 if word ~= o.ReplyTo or "" then
wobin@0 70 table.insert(o.Related, word)
wobin@0 71 end
wobin@0 72 end
wobin@0 73
wobin@0 74 return o
wobin@0 75 end
wobin@0 76
wobin@0 77 function Squawk:Sort(Squawks)
wobin@0 78 return table.sort(Squawks, function(a,b) return a.Time < b.Time end)
wobin@0 79 end
wobin@0 80
wobin@2 81 function Squawk:GetOwn(Squawks)
wobin@2 82 local mine = {}
wobin@2 83 for _, squawk in ipairs(Squawks) do
wobin@2 84 if squawk.Owner == UnitName("player") then
wobin@2 85 table.insert(mine, squawk)
wobin@2 86 end
wobin@2 87 end
wobin@2 88 return self:Sort(mine)
wobin@2 89 end
wobin@2 90
wobin@0 91 function Settings:IsPrivate()
wobin@0 92 return Settings.Private
wobin@0 93 end
wobin@0 94
wobin@0 95 function Settings:AddFollower(Name)
wobin@2 96 Settings.Follower[Name] = 1
wobin@0 97 end
wobin@0 98
wobin@0 99 function Settings:AddFollowing(Name)
wobin@2 100 Settings.Following[Name] = 1
wobin@0 101 end
wobin@0 102
wobin@0 103 function Settings:AddBlock(Name)
wobin@2 104 Settings.Blocked[Name] = 1
wobin@0 105 end
wobin@0 106
wobin@0 107 function Settings:RemoveFollower(Name)
wobin@2 108 if Settings.Follower[Name] then
wobin@2 109 Settings.Follower[Name] = nil
wobin@0 110 end
wobin@0 111 end
wobin@0 112
wobin@0 113 function Settings:RemoveFollowing(Name)
wobin@2 114 if Settings.Following[Name] then
wobin@2 115 Settings.Following[Name] = nil
wobin@0 116 end
wobin@0 117 end
wobin@0 118
wobin@0 119 function Settings:RemoveBlock(Name)
wobin@2 120 if Settings.Blocked[Name] then
wobin@2 121 Settings.Blocked[Name] = nil
wobin@0 122 end
wobin@0 123 end
wobin@0 124
wobin@0 125 --Controller--
wobin@0 126
wobin@0 127 function Controller:TheyWantToFollowMe(Name)
wobin@0 128 if Settings:IsPrivate() then
wobin@0 129 self:PutForwardFollowRequest(Name)
wobin@0 130 self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
wobin@0 131 else
wobin@0 132 Settings:AddFollower(Name)
wobin@0 133 View:NotifyOfNewFollower(Name)
wobin@0 134 self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
wobin@0 135 end
wobin@0 136 end
wobin@0 137
wobin@0 138 function Controller:IWantToFollowThem(Name)
wobin@2 139 self:SendMessageToTarget(Name, "#Request|"..UnitName("player"))
wobin@0 140 end
wobin@0 141
wobin@0 142 function Controller:IAmNowFollowingThem(Name)
wobin@0 143 Settings:AddFollowing(Name)
wobin@0 144 View:NotifyOfNewFollowing(Name)
wobin@0 145 end
wobin@0 146
wobin@0 147 function Controller:AddANewSquawk(Name, Message)
wobin@0 148 table.insert(Model.db.Squawks, Squawk:new(Message, Name))
wobin@0 149 View:UpdateSquawkList()
wobin@0 150 end
wobin@0 151
wobin@2 152 function Controller:SendNewSquawk(Message)
wobin@2 153 if not Model:IsPrivate() then
wobin@2 154 self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message)
wobin@2 155 end
wobin@2 156
wobin@2 157 self:AddANewSquawk(UnitName("player"), Message)
wobin@2 158
wobin@2 159 for name, _ in pairs(Model.Following) do
wobin@2 160 self:SendMessageToTarget(name, "#Squawk|"..UnitName("player").."|"..Message)
wobin@2 161 end
wobin@2 162 end
wobin@2 163
wobin@1 164 function Controller:ImPending(Name)
wobin@1 165 View:NotifyOfPending(Name)
wobin@1 166 end
wobin@1 167
wobin@0 168 function Controller:SendMessageToTarget(Name, Message)
wobin@0 169 self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK")
wobin@0 170 end
wobin@0 171
wobin@0 172 function Controller:SendMessageToGuild(Message)
wobin@0 173 self:SendCommMessage("Squawk", Message, "GUILD")
wobin@0 174 end
wobin@0 175
wobin@0 176 local Parse = {
wobin@1 177 ["#Pending"] = Controller.ImPending,
wobin@1 178 ["#Follow"] = Controller.IAmNowFollowingThem,
wobin@2 179 ["#Squawk"] = Controller.AddANewSquawk,
wobin@2 180 ["#Request"] = Controller.TheyWantToFollowMe,
wobin@0 181 }
wobin@0 182
wobin@0 183 function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender)
wobin@0 184 local command, name, info = strsplit("|",Message)
wobin@1 185 Parse[command](self, name, info)
wobin@0 186 end
wobin@0 187 -- View --
wobin@0 188
wobin@0 189 function View:UpdateSquawkList()
wobin@0 190 end
wobin@0 191
wobin@0 192 function View:NotifyOfPending()
wobin@0 193 end
wobin@0 194
wobin@0 195 function View:NotifyOfNewFollowing(Name)
wobin@0 196 end
wobin@0 197
wobin@0 198 function View:NotifyOfNewFollower(Name)
wobin@0 199 end