Skip to content
Snippets Groups Projects
json_import.py 3.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • import os
    import uuid
    import datetime
    
    import discord
    from dotenv import load_dotenv
    
    from models import Appointment
    from views.appointment_view import AppointmentView
    
    
    
    def import_links(json_file: str) -> None:
        file = open(json_file, mode="r")
        links = json.load(file)
    
        for channel, categories in links.items():
            for category, links in categories.items():
                category = category.capitalize()
                db_category = models.LinkCategory.get_or_create(channel=int(channel), name=category)
                for title, link in links.items():
    
                    link = link[1:-1] if link[0] == "<" and link[-1] == ">" else link
                    models.Link.create(url=link, title=title, category=db_category[0].id)
    
    
    def import_news(json_file: str) -> None:
        file = open(json_file, mode="r")
        news = json.load(file)
    
        for link, date in news.items():
            models.News.create(link=link, date=date)
    
    
    def import_commands(json_file: str) -> None:
        file = open(json_file, mode="r")
        commands = json.load(file)
    
        for command, data in commands.items():
            db_command = models.Command.get_or_create(command=command, description=data["description"])
            for text in data["data"]:
                models.CommandText.create(text=text, command=db_command[0].id)
    
    
    def import_courses(json_file: str) -> None:
        file = open(json_file, mode="r")
        courses = json.load(file)
    
        for course in courses:
            models.Course.get_or_create(name=course["name"], short=course["short"], url=course["url"],
                                        role_id=int(course["role"]))
    
    async def import_appointments(json_file: str) -> None:
        file = open(json_file, mode="r")
        appointments = json.load(file)
    
        for channel_id, messages in appointments.items():
            for message_id, appointment in messages.items():
                date_time = datetime.datetime.strptime(appointment["date_time"], "%d.%m.%Y %H:%M")
                reminder_sent = True if appointment["reminder"] == 0 and appointment.get(
                    "original_reminder") is not None else False
    
                app = models.Appointment.create(channel=int(channel_id), message=int(message_id), date_time=date_time, appointment=appointment["reminder"], description="", author=appointment["author_id"],
                                                recurring=appointment.get("recurring", 0), reminder_sent=reminder_sent,
                                                uuid=uuid.uuid4())
                channel = await client.fetch_channel(app.channel_id)
                message = await channel.fetch_message(app.message)
                for reaction in message.reactions:
                        if reaction.emoji == "👍":
                            async for user in reaction.users():
                                if not user.bot:
                                    models.Attendee.create(appointment=app, member_id=user.id)
                new_msg = await channel.send(embed=appointment.get_embed(0), view=AppointmentView())
                Appointment.update(message=new_msg.id).where(Appointment.id == app.id).execute()
    
    
    load_dotenv()
    client = discord.Client(intents=discord.Intents.all())
    
    
    @client.event()
    async def on_ready():
    
            Make sure to create a database backup before you import data from json files.
    
        # import_news("data/news.json")
        # import_commands("data/text_commands.json")
        # import_courses("data/courses_of_studies.json")
    
        await import_appointments("data/appointments.json")
    
    
    client.run(os.getenv("DISCORD_TOKEN"))