Search code examples
pythondiscorddiscord.pyreplit

Discord API cloudflare banning my repl.it repo


#type: ignore
import os
from keep_alive import keep_alive
from discord.ext import commands
import discord
import asyncio
import datetime
import re

DC_TOK = os.environ['DC_TOK']

bot = commands.Bot(command_prefix='!', intents=discord.Intents(4194303))


@bot.event
async def on_message(msg: discord.Message):
  if msg.author == bot.user:
    return
  guild = msg.guild
  if msg.content == '!quack':
    await msg.channel.send('''!ticket open subject - Creates a new ticket

**Ticket Support Team++**
!ticket close - Closes on-going ticket

!invite ping_message - Invites user to ticket
!remove ping_message - Removes user from ticket

!mark rank - Makes the ticket exclusive for specific rank
!category TITLE - Briefly categorises the ticket
''')
  elif msg.content[:12] == '!ticket open':
    chn = msg.channel
    ticket_title = msg.content[13:]
    if ticket_title.strip() == '':
      ticket_title = 'None'
    ticketer_acc = msg.author
    ticketer = ticketer_acc.display_name
    category = discord.utils.get(guild.categories, name="Tickets 2")
    tcc = discord.utils.get(guild.channels, name="ticket-creation-logs")
    elem = None
    _ = None
    async for mg in tcc.history():
      if mg.content.startswith('CATEG'):
        continue
      elem, _ = mg.content.split(' ')
      elem = int(elem)
      _ = int(_)
      break
    assert (elem is not None)
    elem += 1
    await tcc.send(str(elem) + ' ' + str(msg.author.id))
    tck_channel = await guild.create_text_channel(f'{elem}-{ticketer}',
                                                  category=category)
    await tck_channel.set_permissions(ticketer_acc,
                                      read_messages=True,
                                      send_messages=True)
    await chn.send(
      f'**TICKET {elem}**\n\nYour ticket has been created. <#{tck_channel.id}>'
    )
    await tck_channel.send(
      f'<@{ticketer_acc.id}> Hello emo! Your ticket has been created, subject: `{ticket_title}`.\nOur support team will be with you soon! Meanwhile please address your problem because those emos are really busy!!!'
    )
  elif msg.content == '!ticket close':
    category = discord.utils.get(guild.categories, name="Tickets 2")
    if msg.channel.category != category:
      return
    if not (discord.utils.get(guild.roles, name='Ticket support team')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Administrator') in msg.author.roles
            or discord.utils.get(guild.roles,
                                 name='Co-owners (A.K.A. super admin)')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Owner') in msg.author.roles):
      return
    closed_cat = discord.utils.get(guild.categories, name="Tickets 3")
    nam = msg.channel.name.lstrip('🔱🛡️')
    tick_id = int(nam[:nam.find('-')])
    tcc = discord.utils.get(guild.channels, name="ticket-creation-logs")
    elem = None
    creator = None
    async for mg in tcc.history():
      if mg.content.startswith('CATEG'):
        continue
      elem, creator = mg.content.split(' ')
      elem = int(elem)
      creator = int(creator)
      if elem == tick_id:
        break
    assert (elem is not None)
    await msg.channel.send('Closing ticket...')
    counter = {}
    async for mg in msg.channel.history():
      if mg.author.bot or mg.author.id == creator:
        continue
      if mg.author.id not in counter.keys():
        counter[mg.author.id] = 1
      else:
        counter[mg.author.id] += 1
    max_num = 0
    max_authors = []
    for key, value in counter.items():
      if value > max_num:
        max_num = value
        max_authors = [key]
      elif value == max_num:
        max_authors.append(key)
    user_ping_list = ' '.join([f'<@{usr}>' for usr in max_authors
                               ]) + ' contributed the most.'
    if user_ping_list == ' contributed the most.':
      user_ping_list = 'No one contributed.'
    await msg.channel.send(user_ping_list)
    await msg.channel.send('We hope we were able to solve your problem.')
    await asyncio.sleep(3)
    tick_creator = discord.utils.get(guild.members, id=creator)
    assert (tick_creator is not None)
    await msg.channel.set_permissions(tick_creator, overwrite=None)
    await msg.channel.edit(category=closed_cat)
    dms = discord.utils.get(guild.members, id=creator)
    assert (dms is not None)
    DM = dms
    dms = DM._user.dm_channel
    if dms is None:
      dms = await DM._user.create_dm()
    del DM
    cr = msg.channel.created_at
    assert (cr is not None)
    tick_created: datetime.datetime = cr.replace(tzinfo=None)
    time_cur = datetime.datetime.utcnow().replace(tzinfo=None)
    td = time_cur - tick_created
    mm, ss = divmod(td.seconds, 60)
    hh, mm = divmod(mm, 60)
    timestr = ''
    if td.days > 0:
      timestr += f'{td.days}d '
    if hh > 0:
      timestr += f'{hh}h '
    if mm > 0:
      timestr += f'{mm}m '
    if ss > 0:
      timestr += f'{ss}s'
    await dms.send(f'''Your ticket has been closed by <@{msg.author.id}>
Your ticket lasted `{timestr}`.
We hope we were able to solve your problem. :partying_face:''')
  elif msg.content == '!mark co':
    category = discord.utils.get(guild.categories, name="Tickets 2")
    if msg.channel.category != category:
      return
    if not (discord.utils.get(guild.roles, name='Ticket support team')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Administrator') in msg.author.roles
            or discord.utils.get(guild.roles,
                                 name='Co-owners (A.K.A. super admin)')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Owner') in msg.author.roles):
      return
    await msg.channel.send('Requesting to mark this ticket for: `Co-owner`')
    nam = msg.channel.name
    if nam.startswith('🛡️'):
      nam = nam[1:]
    assert (nam is not None)
    if nam.startswith('🔱'):
      await msg.channel.send('Ticket already marked for `Co-owner`')
    else:
      await msg.channel.edit(name='🔱' + nam)
      await msg.channel.send(
        f'<@{msg.author.id}> marked this ticket for: `Co-owner`')
      await msg.channel.send(':trident:')
  elif msg.content == '!mark admin':
    category = discord.utils.get(guild.categories, name="Tickets 2")
    if msg.channel.category != category:
      return
    if not (discord.utils.get(guild.roles, name='Ticket support team')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Administrator') in msg.author.roles
            or discord.utils.get(guild.roles,
                                 name='Co-owners (A.K.A. super admin)')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Owner') in msg.author.roles):
      return
    await msg.channel.send(
      'Requesting to mark this ticket for: `Administrator`')
    nam = msg.channel.name
    assert (nam is not None)
    if nam.startswith('🛡️'):
      await msg.channel.send('Ticket already marked for `Administrator`')
    elif nam.startswith('🔱'):
      await msg.channel.send('Ticket already marked for `Co-owner`')
    else:
      await msg.channel.edit(name='🛡️' + nam)
      await msg.channel.send(
        f'<@{msg.author.id}> marked this ticket for: `Adiministrator`')
      await msg.channel.send(':shield:')
  elif msg.content[:7] == '!invite':
    category = discord.utils.get(guild.categories, name="Tickets 2")
    if msg.channel.category != category:
      return
    if not (discord.utils.get(guild.roles, name='Ticket support team')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Administrator') in msg.author.roles
            or discord.utils.get(guild.roles,
                                 name='Co-owners (A.K.A. super admin)')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Owner') in msg.author.roles):
      return
    usr_ping = msg.content[8:]
    if not (usr_ping.startswith('<@') and usr_ping.endswith('>')
            and usr_ping[2:-1].isdigit()):
      return
    invited_usr = discord.utils.get(guild.members, id=int(usr_ping[2:-1]))
    assert (invited_usr is not None)
    await msg.channel.set_permissions(invited_usr,
                                      read_messages=True,
                                      send_messages=True)
    await msg.channel.send(f'{usr_ping} was invited into the ticket.')
  elif msg.content[:7] == '!remove':
    category = discord.utils.get(guild.categories, name="Tickets 2")
    if msg.channel.category != category:
      return
    if not (discord.utils.get(guild.roles, name='Ticket support team')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Administrator') in msg.author.roles
            or discord.utils.get(guild.roles,
                                 name='Co-owners (A.K.A. super admin)')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Owner') in msg.author.roles):
      return
    usr_ping = msg.content[8:]
    if not (usr_ping.startswith('<@') and usr_ping.endswith('>')
            and usr_ping[2:-1].isdigit()):
      return
    invited_usr = discord.utils.get(guild.members, id=int(usr_ping[2:-1]))
    assert (invited_usr is not None)
    await msg.channel.set_permissions(invited_usr, overwrite=None)
    await msg.channel.send(f'{usr_ping} was removed from the ticket.')
  elif msg.content[:9] == '!category':
    category = discord.utils.get(guild.categories, name="Tickets 2")
    if msg.channel.category != category:
      return
    if not (discord.utils.get(guild.roles, name='Ticket support team')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Administrator') in msg.author.roles
            or discord.utils.get(guild.roles,
                                 name='Co-owners (A.K.A. super admin)')
            in msg.author.roles or discord.utils.get(
              guild.roles, name='Owner') in msg.author.roles):
      return
    categ = msg.content[10:]
    tcc = discord.utils.get(guild.channels, name="ticket-creation-logs")
    nam = msg.channel.name.lstrip('🔱🛡️')
    tick_id = int(nam[:nam.find('-')])
    async for mg in tcc.history():
      if mg.content.startswith(f'CATEG {tick_id}'):
        await msg.channel.send(
          f'''This ticket is already marked with category **{mg.content[len(f'CATEG{tick_id}')+2:]}**'''
        )
        return
    await tcc.send(f'CATEG {tick_id} {categ}')
    await msg.channel.send(
      f'''<@{msg.author.id}> marked this ticket with category **{categ}**''')
  else:
    category = discord.utils.get(guild.categories, name="Tickets 2")
    if msg.channel.category != category:
      return
    PING_PTN = '<@[0-9]+>'
    pings = re.findall(PING_PTN, msg.content, re.UNICODE)
    usrs = [
      discord.utils.get(guild.members, id=int(ping[2:-1])) for ping in pings
    ]
    remainder = msg.content
    for ping in pings:
      remainder = remainder.replace(str(ping), '')
    for usr in usrs:
      assert (usr is not None)
      DM = usr
      dms = DM._user.dm_channel
      if dms is None:
        dms = await DM._user.create_dm()
      del DM
      await dms.send(
        f'''`{msg.author.name}#{msg.author.discriminator}`Pinged you in a ticket: <#{msg.channel.id}>

`{remainder}`''')


keep_alive()
bot.run(DC_TOK)

main.py

from flask import Flask
from threading import Thread

app = Flask('')


@app.route('/')
def home():
  return "Hello. I am alive!"


def run():
  app.run(host='0.0.0.0', port=8080)


def keep_alive():
  t = Thread(target=run)
  t.start()

keep_alive.py

I am hosting my project on repl.it and using uptimerobot to ping it every 10 minutes so that it does not go dormant. But discord cloudflare bans it. I hear some say it's because of uptimerobot but how does that even affect the discord API? Also, the plan you give me must not require payment or payment methods of any type. I am a minor.


Solution

  • As moinierer3000 said,

    Replit uses shared IPs to host your Discord bots.

    This means that when you run your bots, it sends requests to Discord servers, that are proxies by Cloudflare that rate-limits how much requests an IP can make to defend the app from DDoS attacks.

    I'd recommend you to just shutdown the bot, wait 15-30 minutes and try again later. I've done this numerous times and it worked great.

    Hope this answer helped you.