#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.
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.