Added teamup module
This commit is contained in:
parent
680af79fd8
commit
83d3c1f2f2
2
Pipfile
2
Pipfile
|
@ -4,6 +4,8 @@ verify_ssl = true
|
||||||
name = "pypi"
|
name = "pypi"
|
||||||
|
|
||||||
[packages]
|
[packages]
|
||||||
|
pyTeamUp = "*"
|
||||||
|
pandas = "*"
|
||||||
matrix-nio = "*"
|
matrix-nio = "*"
|
||||||
geopy = "*"
|
geopy = "*"
|
||||||
google-api-python-client = "*"
|
google-api-python-client = "*"
|
||||||
|
|
20
README.md
20
README.md
|
@ -27,6 +27,26 @@ Aviation weather TAF service access.
|
||||||
|
|
||||||
Prints bot uptime.
|
Prints bot uptime.
|
||||||
|
|
||||||
|
### Teamup
|
||||||
|
|
||||||
|
Can access Teamup ( https://teamup.com/ ) calendar. Teamup has nice API and is easier to set up than Google so
|
||||||
|
prefer it if possible. This bot polls the calendar every 5 minutes and notifies the room of any changes.
|
||||||
|
|
||||||
|
Howto:
|
||||||
|
|
||||||
|
* Create a calendar in Teamup https://teamup.com/
|
||||||
|
* Get api key at https://teamup.com/api-keys/request
|
||||||
|
* !teamup apikey [your api key]
|
||||||
|
* !teamup add [calendar id]
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
|
||||||
|
* !teamup apikey [apikey] - set api key
|
||||||
|
* !teamup add [calendar id] - add calendar to this room
|
||||||
|
* !teamup del [calendar id] - delete calendar from this room
|
||||||
|
* !teamup list - list calendars in this room
|
||||||
|
* !teamup poll - poll now for changes
|
||||||
|
|
||||||
### Google Calendar
|
### Google Calendar
|
||||||
|
|
||||||
Can access a google calendar in a room. This is a bit pain to set up, sorry.
|
Can access a google calendar in a room. This is a bit pain to set up, sorry.
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
from pyteamup import Calendar, Event
|
||||||
|
from datetime import datetime
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
|
||||||
|
#
|
||||||
|
# TeamUp calendar notifications
|
||||||
|
#
|
||||||
|
class MatrixModule:
|
||||||
|
api_key = None
|
||||||
|
calendar_rooms = dict() # Roomid -> [calid, calid..]
|
||||||
|
calendars = dict() # calid -> Calendar
|
||||||
|
|
||||||
|
async def matrix_poll(self, bot, pollcount):
|
||||||
|
if self.api_key:
|
||||||
|
if pollcount % (6 * 5) == 0: # Poll every 5 min
|
||||||
|
await self.poll_all_calendars(bot)
|
||||||
|
|
||||||
|
async def matrix_message(self, bot, room, event):
|
||||||
|
args = event.body.split()
|
||||||
|
if len(args) == 2:
|
||||||
|
if args[1] == 'list':
|
||||||
|
await bot.send_text(room, f'Calendars in this room: {self.calendar_rooms.get(room.room_id) or []}')
|
||||||
|
elif args[1] == 'poll':
|
||||||
|
await self.poll_all_calendars(bot)
|
||||||
|
elif len(args) == 3:
|
||||||
|
if args[1] == 'add':
|
||||||
|
calid = args[2]
|
||||||
|
print(f'Adding calendar {calid} to room id {room.room_id}')
|
||||||
|
|
||||||
|
if self.calendar_rooms.get(room.room_id):
|
||||||
|
if calid not in self.calendar_rooms[room.room_id]:
|
||||||
|
self.calendar_rooms[room.room_id].append(calid)
|
||||||
|
else:
|
||||||
|
await bot.send_text(room, 'This teamup calendar already added in this room!')
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
self.calendar_rooms[room.room_id] = [calid]
|
||||||
|
|
||||||
|
print(f'Calendars now for this room {self.calendar_rooms.get(room.room_id)}')
|
||||||
|
|
||||||
|
bot.save_settings()
|
||||||
|
self.setup_calendars()
|
||||||
|
await bot.send_text(room, 'Added new teamup calendar to this room')
|
||||||
|
if args[1] == 'del':
|
||||||
|
calid = args[2]
|
||||||
|
print(f'Removing calendar {calid} from room id {room.room_id}')
|
||||||
|
|
||||||
|
if self.calendar_rooms.get(room.room_id):
|
||||||
|
self.calendar_rooms[room.room_id].remove(calid)
|
||||||
|
|
||||||
|
print(f'Calendars now for this room {self.calendar_rooms.get(room.room_id)}')
|
||||||
|
|
||||||
|
bot.save_settings()
|
||||||
|
self.setup_calendars()
|
||||||
|
await bot.send_text(room, 'Removed teamup calendar from this room')
|
||||||
|
if args[1] == 'apikey':
|
||||||
|
self.api_key = args[2]
|
||||||
|
bot.save_settings()
|
||||||
|
self.setup_calendars()
|
||||||
|
await bot.send_text(room, 'Api key set')
|
||||||
|
|
||||||
|
def help(self):
|
||||||
|
return('Polls teamup calendar.')
|
||||||
|
|
||||||
|
async def poll_all_calendars(self, bot):
|
||||||
|
for roomid in self.calendar_rooms:
|
||||||
|
calendars = self.calendar_rooms[roomid]
|
||||||
|
for calendarid in calendars:
|
||||||
|
events, timestamp = self.poll_server(self.calendars[calendarid])
|
||||||
|
self.calendars[calendarid].timestamp = timestamp
|
||||||
|
for event in events:
|
||||||
|
await bot.send_text(bot.get_room_by_id(roomid), 'Calendar: ' + self.eventToString(event))
|
||||||
|
|
||||||
|
def poll_server(self, calendar):
|
||||||
|
events, timestamp = calendar.get_changed_events(calendar.timestamp)
|
||||||
|
return events, timestamp
|
||||||
|
|
||||||
|
def to_datetime(self, dts):
|
||||||
|
try:
|
||||||
|
return datetime.strptime(dts, '%Y-%m-%dT%H:%M:%S')
|
||||||
|
except ValueError:
|
||||||
|
pos = len(dts) - 3
|
||||||
|
dts = dts[:pos] + dts[pos+1:]
|
||||||
|
return datetime.strptime(dts, '%Y-%m-%dT%H:%M:%S%z')
|
||||||
|
|
||||||
|
def eventToString(self, event):
|
||||||
|
startdt = self.to_datetime(event['start_dt'])
|
||||||
|
if len(event['title']) == 0:
|
||||||
|
event['title'] = '(empty name)'
|
||||||
|
|
||||||
|
if(event['delete_dt']):
|
||||||
|
s = event['title'] + ' deleted.'
|
||||||
|
else:
|
||||||
|
s = event['title'] + " " + (event['notes'] or '') + ' ' + str(startdt.day) + '.' + str(startdt.month)
|
||||||
|
if not event['all_day']:
|
||||||
|
s = s + ' ' + startdt.strftime("%H:%M") + ' (' + str(event['duration']) + ' min)'
|
||||||
|
return s
|
||||||
|
|
||||||
|
def setup_calendars(self):
|
||||||
|
self.calendars = dict()
|
||||||
|
if self.api_key:
|
||||||
|
for roomid in self.calendar_rooms:
|
||||||
|
calendars = self.calendar_rooms[roomid]
|
||||||
|
for calid in calendars:
|
||||||
|
self.calendars[calid] = Calendar(calid, self.api_key)
|
||||||
|
self.calendars[calid].timestamp = int(time.time())
|
||||||
|
|
||||||
|
def get_settings(self):
|
||||||
|
return { 'apikey': self.api_key or '', 'calendar_rooms': self.calendar_rooms }
|
||||||
|
|
||||||
|
def set_settings(self, data):
|
||||||
|
if data.get('calendar_rooms'):
|
||||||
|
self.calendar_rooms = data['calendar_rooms']
|
||||||
|
if data.get('apikey'):
|
||||||
|
self.api_key = data['apikey']
|
||||||
|
if self.api_key and len(self.api_key)==0:
|
||||||
|
self.api_key = None
|
||||||
|
self.setup_calendars()
|
Loading…
Reference in New Issue