Skip to content

Commit 89f37ca

Browse files
committed
Start creating a self hosted api interface
1 parent 144b516 commit 89f37ca

File tree

5 files changed

+114
-2
lines changed

5 files changed

+114
-2
lines changed

Procfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
worker: python bot.py
1+
worker: python bot.py
2+
web: python app.py

app.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import os
2+
3+
from sanic import Sanic, response
4+
from motor.motor_asyncio import AsyncIOMotorClient
5+
import aiohttp
6+
7+
from core.models import LogEntry
8+
9+
app = Sanic(__name__)
10+
11+
@app.listener('before_server_start')
12+
async def init(app, loop):
13+
app.db = AsyncIOMotorClient(os.getenv('MONGO_URI')).modmail
14+
15+
app.get('/')
16+
async def index(request):
17+
return response.json('Welcome!')
18+
19+
@app.get('/<key>')
20+
async def getlogsfile(request, key):
21+
log = await app.db.logs.find_one({'key': key})
22+
23+
if log is None:
24+
return response.text('Not Found', status=404)
25+
else:
26+
return response.text(str(LogEntry(log)))
27+
28+
if __name__ == '__main__':
29+
app.run(host='0.0.0.0', port=os.getenv('PORT'))

bot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from colorama import init, Fore, Style
3939
import emoji
4040

41-
from core.api import Github, ModmailApiClient
41+
from core.interfaces import Github, ModmailApiClient, SelfhostedApiInterface
4242
from core.thread import ThreadManager
4343
from core.config import ConfigManager
4444
from core.changelog import ChangeLog

core/api.py renamed to core/interfaces.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,11 @@ def append_log(self, message, channel_id=''):
117117

118118
def post_log(self, channel_id, payload):
119119
return self.request(self.logs + f'/{channel_id}', method='POST', payload=payload)
120+
121+
122+
class SelfhostedApiInterface(ModmailApiClient):
123+
@property
124+
def db(self)
125+
return self.bot.db
126+
127+

core/models.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from datetime import datetime
2+
import dateutil.parser
3+
4+
class LogEntry:
5+
def __init__(self, data):
6+
self.key = data['key']
7+
self.open = data['open']
8+
self.created_at = dateutil.parser.parse(data['created_at'])
9+
self.closed_at = dateutil.parser.parse(data['closed_at']) if not self.open else None
10+
self.channel_id = int(data['channel_id'])
11+
self.guild_id = int(data['guild_id'])
12+
self.creator = User(data['creator'])
13+
self.recipient = User(data['recipient'])
14+
self.closer = User(data['closer']) if not self.open else None
15+
self.messages = [Message(m) for m in data['messages']]
16+
17+
def __str__(self):
18+
out = f"Thread created at {self.created_at.strftime('%d %b %Y - %H:%M UTC')}\n"
19+
20+
if self.creator == self.recipient:
21+
out += f'[R] {self.creator} ({self.creator.id}) created a modmail thread. \n'
22+
else:
23+
out += f'[M] {self.creator} created a thread with [R] {self.recipient} ({self.recipient.id})\n'
24+
25+
out += '────────────────' * 3 + '\n'
26+
27+
if self.messages:
28+
for index, message in enumerate(self.messages):
29+
next_index = index + 1 if index + 1 < len(self.messages) else index
30+
curr, next = message.author, self.messages[next_index].author
31+
32+
author = curr
33+
base = message.created_at.strftime('%d/%m %H:%M') + (' [M] ' if author.mod else ' [R] ')
34+
base += f'{author}: {message.content}\n'
35+
for attachment in message.attachments:
36+
base += 'Attachment: ' + attachment + '\n'
37+
38+
out += base
39+
40+
if curr != next:
41+
out += '────────────────' * 2 + '\n'
42+
current_author = author
43+
44+
if not self.open:
45+
if self.messages: # only add if at least 1 message was sent
46+
out += '────────────────' * 3 + '\n'
47+
out += f'[M] {self.closer} ({self.closer.id}) closed the modmail thread. \n'
48+
out += f"Thread closed at {self.closed_at.strftime('%d %b %Y - %H:%M UTC')} \n"
49+
50+
return out
51+
52+
53+
class User:
54+
def __init__(self, data):
55+
self.id = int(data.get('id'))
56+
self.name = data['name']
57+
self.discriminator = data['discriminator']
58+
self.avatar_url = data['avatar_url']
59+
self.mod = data['mod']
60+
61+
def __str__(self):
62+
return f'{self.name}#{self.discriminator}'
63+
64+
def __eq__(self, other):
65+
return self.id == other.id and self.mod is other.mod
66+
67+
68+
class Message:
69+
def __init__(self, data):
70+
self.id = int(data['message_id'])
71+
self.created_at = dateutil.parser.parse(data['timestamp'])
72+
self.content = data['content']
73+
self.attachments = data['attachments']
74+
self.author = User(data['author'])

0 commit comments

Comments
 (0)