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@0
|
5 Squawk = LibStub("AceAddon-3.0"):NewAddon("Squawk", "AceDB-3.0")
|
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@0
|
81 function Settings:IsPrivate()
|
wobin@0
|
82 return Settings.Private
|
wobin@0
|
83 end
|
wobin@0
|
84
|
wobin@0
|
85 function Settings:AddFollower(Name)
|
wobin@0
|
86 table.insert(Settings.Follower, Name)
|
wobin@0
|
87 end
|
wobin@0
|
88
|
wobin@0
|
89 function Settings:AddFollowing(Name)
|
wobin@0
|
90 table.insert(Settings.Following, Name)
|
wobin@0
|
91 end
|
wobin@0
|
92
|
wobin@0
|
93 function Settings:AddBlock(Name)
|
wobin@0
|
94 table.insert(Settings.Blocked, Name)
|
wobin@0
|
95 end
|
wobin@0
|
96
|
wobin@0
|
97 function Settings:RemoveFollower(Name)
|
wobin@0
|
98 for i,v in ipairs(Settings.Follower) do
|
wobin@0
|
99 if v == Name then
|
wobin@0
|
100 table.remove(Settings.Follower, i)
|
wobin@0
|
101 return
|
wobin@0
|
102 end
|
wobin@0
|
103 end
|
wobin@0
|
104 end
|
wobin@0
|
105
|
wobin@0
|
106 function Settings:RemoveFollowing(Name)
|
wobin@0
|
107 for i,v in ipairs(Settings.Following) do
|
wobin@0
|
108 if v == Name then
|
wobin@0
|
109 table.remove(Settings.Following, i)
|
wobin@0
|
110 return
|
wobin@0
|
111 end
|
wobin@0
|
112 end
|
wobin@0
|
113 end
|
wobin@0
|
114
|
wobin@0
|
115 function Settings:RemoveBlock(Name)
|
wobin@0
|
116 for i,v in ipairs(Settings.Blocked) do
|
wobin@0
|
117 if v == Name then
|
wobin@0
|
118 table.remove(Settings.Blocked, i)
|
wobin@0
|
119 return
|
wobin@0
|
120 end
|
wobin@0
|
121 end
|
wobin@0
|
122 end
|
wobin@0
|
123
|
wobin@0
|
124 --Controller--
|
wobin@0
|
125
|
wobin@0
|
126 function Controller:TheyWantToFollowMe(Name)
|
wobin@0
|
127 if Settings:IsPrivate() then
|
wobin@0
|
128 self:PutForwardFollowRequest(Name)
|
wobin@0
|
129 self:SendMessageToTarget(Name, "#Pending|"..UnitName("player"))
|
wobin@0
|
130 else
|
wobin@0
|
131 Settings:AddFollower(Name)
|
wobin@0
|
132 View:NotifyOfNewFollower(Name)
|
wobin@0
|
133 self:SendMessageToTarget(Name, "#Follow|"..UnitName("player"))
|
wobin@0
|
134 end
|
wobin@0
|
135 end
|
wobin@0
|
136
|
wobin@0
|
137 function Controller:IWantToFollowThem(Name)
|
wobin@0
|
138
|
wobin@0
|
139 end
|
wobin@0
|
140
|
wobin@0
|
141 function Controller:IAmNowFollowingThem(Name)
|
wobin@0
|
142 Settings:AddFollowing(Name)
|
wobin@0
|
143 View:NotifyOfNewFollowing(Name)
|
wobin@0
|
144 end
|
wobin@0
|
145
|
wobin@0
|
146 function Controller:AddANewSquawk(Name, Message)
|
wobin@0
|
147 table.insert(Model.db.Squawks, Squawk:new(Message, Name))
|
wobin@0
|
148 View:UpdateSquawkList()
|
wobin@0
|
149 end
|
wobin@0
|
150
|
wobin@0
|
151 function Controller:SendMessageToTarget(Name, Message)
|
wobin@0
|
152 self:SendCommMessage("Squawk", Message, "WHISPER", Name, "BULK")
|
wobin@0
|
153 end
|
wobin@0
|
154
|
wobin@0
|
155 function Controller:SendMessageToGuild(Message)
|
wobin@0
|
156 self:SendCommMessage("Squawk", Message, "GUILD")
|
wobin@0
|
157 end
|
wobin@0
|
158
|
wobin@0
|
159 local Parse = {
|
wobin@0
|
160 ["#Pending"] = View:NotifyOfPending,
|
wobin@0
|
161 ["#Follow"] = Controller:IAmNowFollowingThem,
|
wobin@0
|
162 ["#Squawk"] = Controller:AddANewSquawk
|
wobin@0
|
163 }
|
wobin@0
|
164
|
wobin@0
|
165 function Controller:ReceiveMessage(Prefix, Message, Distribution, Sender)
|
wobin@0
|
166 local command, name, info = strsplit("|",Message)
|
wobin@0
|
167 Parse[command](name, info)
|
wobin@0
|
168 end
|
wobin@0
|
169 -- View --
|
wobin@0
|
170
|
wobin@0
|
171 function View:UpdateSquawkList()
|
wobin@0
|
172 end
|
wobin@0
|
173
|
wobin@0
|
174 function View:NotifyOfPending()
|
wobin@0
|
175 end
|
wobin@0
|
176
|
wobin@0
|
177 function View:NotifyOfNewFollowing(Name)
|
wobin@0
|
178 end
|
wobin@0
|
179
|
wobin@0
|
180 function View:NotifyOfNewFollower(Name)
|
wobin@0
|
181 end
|