annotate Squawk.lua @ 3:1cc6e4710e2e

adding tests
author wobin
date Fri, 17 Apr 2009 15:59:51 +1000
parents 75a76882c343
children d1383f2d9b43
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@3 35 Controller:RegisterComm("Squawk", Controller.ReceiveMessage)
wobin@3 36
wobin@3 37 LibStub("AceConsole-3.0"):Embed(View)
wobin@0 38 end
wobin@0 39
wobin@0 40 -- Model --
wobin@0 41 --[[
wobin@0 42 --Each Squawk will have the following information:
wobin@0 43 -- * Owner (Name)
wobin@0 44 -- * Time (Epoch)
wobin@0 45 -- * Message (140 characters)
wobin@0 46 -- * ReplyTo (Name)
wobin@0 47 -- * Related (Names)
wobin@0 48 --
wobin@0 49 -- Each User will have the following lists:
wobin@0 50 -- * Follower
wobin@0 51 -- * Following
wobin@0 52 -- * Blocked
wobin@0 53 -- * Privacy State
wobin@0 54 --]]
wobin@0 55 Model.Squawk = {}
wobin@0 56 local Squawk = Model.Squawk
wobin@0 57
wobin@0 58 function Squawk:new(Message, Owner)
wobin@0 59 local o = {}
wobin@0 60 o.Owner = Owner or UnitName("player")
wobin@0 61 o.Message = Message
wobin@0 62 o.Time = os.time()
wobin@0 63 local reply, to = strsplit("@", ((strsplit(" ", Message))))
wobin@0 64 if reply == "" then
wobin@0 65 o.ReplyTo = to
wobin@0 66 end
wobin@0 67
wobin@0 68 o.Related = {}
wobin@0 69
wobin@0 70 for word in string.gmatch(Message, "@(%a+)") do
wobin@0 71 if word ~= o.ReplyTo or "" then
wobin@0 72 table.insert(o.Related, word)
wobin@0 73 end
wobin@0 74 end
wobin@0 75
wobin@0 76 return o
wobin@0 77 end
wobin@0 78
wobin@0 79 function Squawk:Sort(Squawks)
wobin@0 80 return table.sort(Squawks, function(a,b) return a.Time < b.Time end)
wobin@0 81 end
wobin@0 82
wobin@2 83 function Squawk:GetOwn(Squawks)
wobin@2 84 local mine = {}
wobin@2 85 for _, squawk in ipairs(Squawks) do
wobin@2 86 if squawk.Owner == UnitName("player") then
wobin@2 87 table.insert(mine, squawk)
wobin@2 88 end
wobin@2 89 end
wobin@2 90 return self:Sort(mine)
wobin@2 91 end
wobin@2 92
wobin@0 93 function Settings:IsPrivate()
wobin@0 94 return Settings.Private
wobin@0 95 end
wobin@0 96
wobin@0 97 function Settings:AddFollower(Name)
wobin@2 98 Settings.Follower[Name] = 1
wobin@0 99 end
wobin@0 100
wobin@0 101 function Settings:AddFollowing(Name)
wobin@2 102 Settings.Following[Name] = 1
wobin@0 103 end
wobin@0 104
wobin@0 105 function Settings:AddBlock(Name)
wobin@2 106 Settings.Blocked[Name] = 1
wobin@0 107 end
wobin@0 108
wobin@0 109 function Settings:RemoveFollower(Name)
wobin@2 110 if Settings.Follower[Name] then
wobin@2 111 Settings.Follower[Name] = nil
wobin@0 112 end
wobin@0 113 end
wobin@0 114
wobin@0 115 function Settings:RemoveFollowing(Name)
wobin@2 116 if Settings.Following[Name] then
wobin@2 117 Settings.Following[Name] = nil
wobin@0 118 end
wobin@0 119 end
wobin@0 120
wobin@0 121 function Settings:RemoveBlock(Name)
wobin@2 122 if Settings.Blocked[Name] then
wobin@2 123 Settings.Blocked[Name] = nil
wobin@0 124 end
wobin@0 125 end
wobin@0 126
wobin@0 127 --Controller--
wobin@0 128
wobin@0 129 function Controller:TheyWantToFollowMe(Name)
wobin@0 130 if Settings:IsPrivate() then
wobin@0 131 self:PutForwardFollowRequest(Name)
wobin@0 132 self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
wobin@0 133 else
wobin@0 134 Settings:AddFollower(Name)
wobin@0 135 View:NotifyOfNewFollower(Name)
wobin@0 136 self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
wobin@0 137 end
wobin@0 138 end
wobin@0 139
wobin@0 140 function Controller:IWantToFollowThem(Name)
wobin@2 141 self:SendMessageToTarget(Name, "#Request|"..UnitName("player"))
wobin@0 142 end
wobin@0 143
wobin@0 144 function Controller:IAmNowFollowingThem(Name)
wobin@0 145 Settings:AddFollowing(Name)
wobin@0 146 View:NotifyOfNewFollowing(Name)
wobin@0 147 end
wobin@0 148
wobin@0 149 function Controller:AddANewSquawk(Name, Message)
wobin@0 150 table.insert(Model.db.Squawks, Squawk:new(Message, Name))
wobin@0 151 View:UpdateSquawkList()
wobin@0 152 end
wobin@0 153
wobin@2 154 function Controller:SendNewSquawk(Message)
wobin@2 155 if not Model:IsPrivate() then
wobin@2 156 self:SendMessageToGuild("#Squawk|"..UnitName("player").."|"..Message)
wobin@2 157 end
wobin@2 158
wobin@2 159 self:AddANewSquawk(UnitName("player"), Message)
wobin@2 160
wobin@2 161 for name, _ in pairs(Model.Following) do
wobin@2 162 self:SendMessageToTarget(name, "#Squawk|"..UnitName("player").."|"..Message)
wobin@2 163 end
wobin@2 164 end
wobin@2 165
wobin@1 166 function Controller:ImPending(Name)
wobin@1 167 View:NotifyOfPending(Name)
wobin@1 168 end
wobin@1 169
wobin@0 170 function Controller:SendMessageToTarget(Name, Message)
wobin@0 171 self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK")
wobin@0 172 end
wobin@0 173
wobin@0 174 function Controller:SendMessageToGuild(Message)
wobin@0 175 self:SendCommMessage("Squawk", Message, "GUILD")
wobin@0 176 end
wobin@0 177
wobin@0 178 local Parse = {
wobin@1 179 ["#Pending"] = Controller.ImPending,
wobin@1 180 ["#Follow"] = Controller.IAmNowFollowingThem,
wobin@2 181 ["#Squawk"] = Controller.AddANewSquawk,
wobin@2 182 ["#Request"] = Controller.TheyWantToFollowMe,
wobin@0 183 }
wobin@0 184
wobin@0 185 function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender)
wobin@0 186 local command, name, info = strsplit("|",Message)
wobin@1 187 Parse[command](self, name, info)
wobin@0 188 end
wobin@0 189 -- View --
wobin@0 190
wobin@0 191 function View:UpdateSquawkList()
wobin@3 192 self:Print("Updated Squawk List")
wobin@0 193 end
wobin@0 194
wobin@3 195 function View:NotifyOfPending(Name)
wobin@3 196 self:Print(Name.." will have to approve your request")
wobin@0 197 end
wobin@0 198
wobin@0 199 function View:NotifyOfNewFollowing(Name)
wobin@3 200 self:Print("You are now following "..Name)
wobin@0 201 end
wobin@0 202
wobin@0 203 function View:NotifyOfNewFollower(Name)
wobin@3 204 self:Print(Name.." is now following you")
wobin@0 205 end