]>
apps.delaporte.us Git - matrix-goal-bot.git/blob - matrix_goal_bot/bot.py
9 extra.help - show extended help
11 clear - clear completed tasks under current goal
12 task ID - add a task under the goal specified by ID
13 close ID - mark goal done by ID
14 done ID - mark task done by ID
15 list - list incomplete goals
16 print GOAL_ID - print a goal and all tasks
21 add.vision - add a new vision (collection of goals)
22 close.vision ID - mark vision as complete by ID
23 dump - dump the full data set - BEWARE - so many messages
24 later VISION_ID - put off all goals in VISION for 14 days
25 list.later - list all 'later' goals
26 print.vision ID - print a vision and all goals
27 set.vision GOAL_ID VISION_ID- associate GOAL_ID with VISION_ID
28 visions - list incomplete visions
29 list.done - list completed goals
30 remove ID - remove a task by ID
31 start GOAL_ID - un-put-off a goal (reverse of later)
32 visionless - list goals with no set vision
33 wins - list recently completed goals
37 from datetime
import datetime
as dt
41 import simplematrixbotlib
as botlib
43 from .db
import Data
, pretty_print
45 DATE_FORMAT
= '%Y-%m-%d'
48 return dt
.now().strftime(DATE_FORMAT
)
50 logger
= logging
.getLogger(__name__
)
53 'Ye cannot get ye flask.',
54 'Ye flask must be load bearing, or something...',
58 'How are you gentlemen?',
59 'All your base are belong to us.',
60 'You have been eaten by a groo.'
64 def __init__(self
, matrix_server
,
70 creds
= botlib
.Creds(matrix_server
, bot_name
, bot_pwd
)
71 self
.bot
= botlib
.Bot(creds
)
72 self
.prefix
= bot_prefix
73 self
.data
= Data(db_file
)
76 logger
.debug('Running goal bot...')
79 async def handle_message(self
, room
, message
):
80 match
= botlib
.MessageMatch(room
, message
, self
.bot
, self
.prefix
)
82 if not match
.is_not_from_this_bot():
83 # Let's not talk to our-self
86 logger
.debug(f
'Message: {message}')
87 if not match
.prefix():
88 logger
.debug(f
'{message} - did not match {self.prefix}')
92 result_lines
= await self
._handle
_match
(match
)
95 for line
in result_lines
:
96 message_lines
.append(str(line
))
98 message
= '\n'.join(message_lines
)
100 await self
.bot
.api
.send_text_message(
101 room
.room_id
, message
)
103 except Exception as ex
:
104 logger
.warn(f
'Caught exception: {str(ex)}')
105 dumb_msg_idx
= len(str(ex
)) % len(snark
)
106 dumb_msg
= snark
[dumb_msg_idx
]
107 await self
.bot
.api
.send_text_message(
108 room
.room_id
, dumb_msg
)
110 await self
.bot
.api
.send_text_message(
111 room
.room_id
, str(ex
))
114 async def _handle_match(self
, match
):
115 logger
.debug(f
'Try to match {str(match)}')
117 if match
.command('setup'):
118 result
= self
.data
.setup()
121 if match
.command('add'):
122 new
= ' '.join(match
.args()[1:])
123 goal_id
= self
.data
.add_goal(new
)
124 results
= [f
'Goal added with id {goal_id}']
126 goals
= self
.data
.get_all_goals()
127 results
.append('# Goals list...')
129 results
.append(str(goal
))
133 if match
.command('list'):
134 logger
.debug('Asked to list current goals...')
135 goals
= self
.data
.get_current_goals()
136 results
= ['# Goals list']
137 results
.append('------------']
139 results
.append(str(goal
))
143 if match
.command('list.done'):
144 goals
= self
.data
.get_done_goals()
145 results
= ['# Completed Goals...']
147 results
.append(str(goal
))
150 if match
.command('task'):
151 new
= ' '.join(match
.args()[1:])
152 goal_id
= self
.data
.quick_add_task(new
)
153 goal
,tasks
= self
.data
.get_goal(goal_id
)
154 results
= pretty_print(goal
, tasks
)
157 if match
.command('add.vision'):
158 new
= ' '.join(match
.args()[1:])
159 result
= self
.data
.add_vision(new
)
160 return [f
'Vision added with id {result}']
162 if match
.command('print'):
163 if len(match
.args()) > 1:
164 goal_id
= int(match
.args()[1])
166 goal_id
= self
.data
._get
_pref
_goal
_id
()
168 logger
.debug(f
'Searching for goal {goal_id}...')
169 goal
,tasks
= self
.data
.get_goal(goal_id
)
170 results
= pretty_print(goal
, tasks
)
175 if match
.command('print.vision'):
176 get_id
= int(match
.args()[1])
177 vision
,goals
= self
.data
.get_vision(get_id
)
178 results
= pretty_print(vision
, goals
)
181 if match
.command('close'):
182 goal_id
= int(match
.args()[1])
183 vision_id
= self
.data
.complete_goal(goal_id
)
184 vision
,goals
= self
.data
.get_vision(vision_id
)
185 results
= pretty_print(vision
, goals
)
189 if match
.command('clear'):
190 if len(match
.args()) > 1:
191 goal_id
= int(match
.args()[1])
193 goal_id
= self
.data
._get
_pref
_goal
_id
()
194 _
= self
.data
.clear(goal_id
)
196 goal
,tasks
= self
.data
.get_goal(goal_id
)
197 results
= pretty_print(goal
, tasks
)
201 if match
.command('start'):
202 goal_id
= int(match
.args()[1])
203 vision
,goals
= self
.data
.start_goal(goal_id
)
204 results
= pretty_print(vision
, goals
)
207 if match
.command('later'):
208 vision_id
= int(match
.args()[1])
209 self
.data
.put_off_vision(vision_id
)
210 # Want to see what we just cleaned up
211 goals
= self
.data
.get_current_goals()
212 results
= ['# Goals list...']
214 results
.append(str(goal
))
218 if match
.command('close.vision'):
219 vision_id
= int(match
.args()[1])
220 self
.data
.complete_vision(vision_id
)
221 vision
,goals
= self
.data
.get_vision(vision_id
)
222 results
= pretty_print(vision
, goals
)
225 if match
.command('done'):
226 ids
= match
.args()[1:]
228 goal_id
= self
.data
.complete_task(int(task_id
))
229 # Print the goal of the last closed task
230 goal
,tasks
= self
.data
.get_goal(goal_id
)
231 results
= pretty_print(goal
, tasks
)
234 if match
.command('dump'):
235 goals
= self
.data
.get_all_goals()
236 results
= ['# Everything ... ']
238 _
,tasks
= self
.data
.get_goal(goal
.id)
239 details
= pretty_print(goal
, tasks
)
244 if match
.command('list.later'):
245 goals
= self
.data
.get_all_goals()
246 results
= ['# All Goals ... ']
249 if match
.command('visions'):
250 items
= self
.data
.get_all_visions()
251 results
= ['# Visions']
253 results
.append('-- No current visions --')
259 if match
.command('visionless'):
260 items
= self
.data
.visionless()
261 results
= ['# Goals with no vision']
263 results
.append('-- No visionless goals --')
269 if match
.command('wins'):
270 items
= self
.data
.wins()
273 results
.append('-- No wins yet --')
281 if match
.command('set.vision'):
282 goal_id
= int(match
.args()[1])
283 vision_id
= int(match
.args()[2])
284 self
.data
.assign_vision(goal_id
=goal_id
, vision_id
=vision_id
)
285 vision
,goals
= self
.data
.get_vision(vision_id
)
286 results
= pretty_print(vision
, goals
)
290 if match
.command('rename'):
291 goal_id
= int(match
.args()[1])
292 name
= ' '.join(match
.args()[2:])
293 self
.data
.rename_goal(goal_id
=goal_id
, name
=name
)
294 goal
,tasks
= self
.data
.get_goal(goal_id
)
295 results
= pretty_print(goal
, tasks
)
298 if match
.command('remove'):
299 task_id
= int(match
.args()[1])
300 result
= self
.data
.remove_task(task_id
)
303 if match
.command('extra.help'):