Skip to content

Commit fdeaff7

Browse files
committed
Implement selfhosted logs fully
1 parent 894d0d1 commit fdeaff7

File tree

6 files changed

+39
-19
lines changed

6 files changed

+39
-19
lines changed

app.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010

1111
@app.listener('before_server_start')
1212
async def init(app, loop):
13-
app.db = AsyncIOMotorClient(os.getenv('MONGO_URI')).modmail
13+
app.db = AsyncIOMotorClient(os.getenv('MONGO_URI')).modmail_bot
1414

15-
app.get('/')
15+
@app.get('/')
1616
async def index(request):
17-
return response.json('Welcome!')
17+
return response.text('Welcome! This simple webserver is used to display your modmail logs.')
1818

19-
@app.get('/<key>')
19+
@app.get('/logs/<key>')
2020
async def getlogsfile(request, key):
21+
print(key)
22+
2123
log = await app.db.logs.find_one({'key': key})
2224

2325
if log is None:

bot.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import aiohttp
3636
from discord.ext import commands
3737
from discord.ext.commands.view import StringView
38+
from motor.motor_asyncio import AsyncIOMotorClient
39+
3840
from colorama import init, Fore, Style
3941
import emoji
4042

@@ -59,6 +61,8 @@ def __init__(self):
5961
self.session = aiohttp.ClientSession(loop=self.loop)
6062
self.config = ConfigManager(self)
6163
self.selfhosted = bool(self.config.get('mongo_uri'))
64+
if self.selfhosted:
65+
self.db = AsyncIOMotorClient(self.config.mongo_uri).modmail_bot
6266
self.modmail_api = SelfhostedClient(self) if self.selfhosted else ModmailApiClient(self)
6367
self.data_task = self.loop.create_task(self.data_loop())
6468
self.autoupdate_task = self.loop.create_task(self.autoupdate_loop())
@@ -161,8 +165,11 @@ async def get_pre(bot, message):
161165
async def on_connect(self):
162166
print(line + Fore.RED + Style.BRIGHT)
163167
if not self.selfhosted:
168+
print('Mode: using api.modmail.tk')
164169
await self.validate_api_token()
165170
print(line)
171+
else:
172+
print('Mode: selfhosting logs.')
166173
print(Fore.CYAN + 'Connected to gateway.')
167174
await self.config.refresh()
168175
status = self.config.get('status')
@@ -405,7 +412,7 @@ async def autoupdate_loop(self):
405412
print('Github access token not found.')
406413
print('Autoupdates disabled.')
407414
return
408-
415+
409416
while True:
410417
metadata = await self.modmail_api.get_metadata()
411418

cogs/modmail.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,9 +343,9 @@ async def logs(self, ctx, *, member: Union[discord.Member, discord.User, obj]=No
343343
time = date.strftime(r'%H:%M')
344344

345345
key = entry['key']
346-
user_id = entry['user_id']
346+
user_id = entry.get('user_id')
347347
closer = entry['closer']['name']
348-
log_url = f"https://logs.modmail.tk/{user_id}/{key}"
348+
log_url = f"https://logs.modmail.tk/{user_id}/{key}" if not self.bot.selfhosted else self.bot.config.log_url + f'/logs/{key}'
349349

350350
truncate = lambda c: c[:47].strip() + '...' if len(c) > 50 else c
351351

core/clients.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ def __init__(self, bot):
187187
}
188188

189189
@property
190-
def db(self)
191-
return self.bot.db
190+
def db(self):
191+
return self.app.db
192192

193193
@property
194194
def logs(self):
@@ -234,15 +234,19 @@ async def get_log_url(self, recipient, channel, creator):
234234
'messages': []
235235
})
236236

237-
return f'https://{self.app.config.log_domain}/logs/{key}'
237+
return f'{self.app.config.log_url}/logs/{key}'
238238

239239
async def get_config(self):
240-
return await self.db.config.find_one({})
240+
conf = await self.db.config.find_one({'bot_id': self.app.user.id})
241+
if conf is None:
242+
await self.db.config.insert_one({'bot_id': self.app.user.id})
243+
return {'bot_id': self.app.user.id}
244+
return conf
241245

242246
async def update_config(self, data):
243247
valid_keys = self.app.config.valid_keys - self.app.config.protected_keys
244248
data = {k: v for k, v in data.items() if k in valid_keys}
245-
return await self.db.config.find_one_and_replace({}, data)
249+
return await self.db.config.update_one({'bot_id': self.app.user.id}, {'$set': data})
246250

247251
async def append_log(self, message, channel_id=''):
248252
channel_id = str(channel_id) or str(message.channel.id)
@@ -269,19 +273,24 @@ async def append_log(self, message, channel_id=''):
269273
)
270274

271275
async def post_log(self, channel_id, payload):
272-
await self.logs.find_one_and_replace({'channel_id': channel_id}, payload)
276+
log = await self.logs.find_one_and_update(
277+
{'channel_id': str(channel_id)},
278+
{'$set': {key: payload[key] for key in payload}},
279+
return_document=ReturnDocument.AFTER
280+
)
281+
return log
273282

274283
async def update_repository(self):
275284
user = await Github.login(self.app)
276285
data = await user.update_repository()
277286
return {'data': data}
278287

279-
def get_user_info(self):
288+
async def get_user_info(self):
280289
user = await Github.login(self.app)
281290
return {
282291
'user': {
283292
'username': user.username,
284293
'avatar_url': user.avatar_url,
285294
'url': user.url
286295
}
287-
296+
}

core/config.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class ConfigManager:
1717

1818
protected_keys = {
1919
'token', 'owners', 'modmail_api_token', 'guild_id', 'modmail_guild_id',
20-
'mongo_uri', 'github_access_token', 'log_domain'
20+
'mongo_uri', 'github_access_token', 'log_url'
2121
}
2222

2323
valid_keys = allowed_to_change_in_command.union(internal_keys).union(protected_keys)
@@ -50,8 +50,6 @@ def populate_cache(self):
5050
data = {k.lower(): v for k, v in data.items() if k.lower() in self.valid_keys}
5151
self.cache = data
5252

53-
self.bot.loop.create_task(self.refresh())
54-
5553
async def update(self, data=None):
5654
"""Updates the config with data from the cache"""
5755
self._modified = False

core/thread.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,11 @@ async def close(self, *, closer, after=0, silent=False, delete_channel=True, mes
7373
if isinstance(log_data, str):
7474
print(log_data) # errored somehow on server
7575

76-
log_url = f"https://logs.modmail.tk/{log_data['user_id']}/{log_data['key']}"
76+
if self.bot.selfhosted:
77+
log_url = f'{self.bot.config.log_url}/logs/{log_data["key"]}'
78+
else:
79+
log_url = f"https://logs.modmail.tk/{log_data['user_id']}/{log_data['key']}"
80+
7781
user = self.recipient.mention if self.recipient else f'`{self.id}`'
7882

7983
if log_data['messages']:

0 commit comments

Comments
 (0)