Last active 1511060079

Discord script to save a channel log

channelsave.py Raw
1#!/usr/bin/env python3
2import discord
3from peewee import *
4from argparse import ArgumentParser
5
6client = discord.Client()
7db = SqliteDatabase("logs.db")
8args = None
9
10class BaseModel(Model):
11 class Meta:
12 database = db
13
14class Author(BaseModel):
15 discriminator = CharField()
16 id = CharField(primary_key=True)
17 username = CharField()
18
19class Server(BaseModel):
20 name = CharField()
21 id = CharField(primary_key=True)
22
23class Channel(BaseModel):
24 name = CharField()
25 server = ForeignKeyField(Server, related_name="channels")
26 id = CharField(primary_key=True)
27
28class Message(BaseModel):
29 author = ForeignKeyField(Author, related_name="messages")
30 server = ForeignKeyField(Server, related_name="messages")
31 channel = ForeignKeyField(Channel, related_name="messages")
32 content = CharField()
33 id = CharField(primary_key=True)
34 timestamp = DateField()
35
36db.connect()
37try:
38 db.create_tables([Author, Server, Channel, Message])
39except OperationalError:
40 pass
41
42@client.event
43async def on_ready():
44 print("Logged in as {} ({})".format(client.user.name, client.user.id))
45 if client.user.bot:
46 print(discord.utils.oauth_url(client.user.id, permissions=discord.Permissions(74752)))
47 target = client.get_channel(args.channel)
48 if not target:
49 print("Channel not found")
50 await client.logout()
51 return
52 x = 0
53 server = None
54 channel = None
55 authors = {}
56 cache = []
57 try:
58 async for logline in client.logs_from(target, limit=args.limit):
59 if logline.server:
60 if not server:
61 try:
62 server = Server.get(id=logline.server.id)
63 except Server.DoesNotExist:
64 server = Server.create(id=logline.server.id, name=logline.server.name)
65 if not channel:
66 try:
67 channel = Channel.get(id=logline.channel.id)
68 except Channel.DoesNotExist:
69 channel = Channel.create(id=logline.channel.id, name=logline.channel.name, server=server)
70 if not logline.author.id in authors:
71 try:
72 authors[logline.author.id] = Author.get(id=logline.author.id)
73 except Author.DoesNotExist:
74 authors[logline.author.id] = Author.create(id=logline.author.id, username=logline.author.name, discriminator=logline.author.discriminator)
75 cache.append(dict(author=authors[logline.author.id], channel=channel, server=server, content=logline.content, id=logline.id, timestamp=logline.timestamp))
76 x += 1
77 if len(cache) >= 50:
78 Message.insert_many(cache).upsert().execute()
79 cache = []
80 print(x, end="\r")
81 finally:
82 Message.insert_many(cache).upsert().execute()
83 print("Saved {} messages from {}".format(x, target.name))
84 await client.logout()
85
86try:
87 parser = ArgumentParser()
88 parser.add_argument("channel")
89 parser.add_argument("--limit", default=10**15, type=int)
90 args = parser.parse_args()
91 with open(".bottoken") as f:
92 creds = f.read()
93 if " " in creds or "." in creds:
94 client.run(*creds.split(None, 1), bot=False)
95 else:
96 client.run(creds.strip())
97finally:
98 db.close()