"TypeError: 'datetime.datetime' object is not callable" on making discord bot with discord.py
Question:
I’m trying to make the bot to kick the player who has the role for a week, but I’m getting some errors.
2022-06-23T04:48:44.209432+00:00 app[worker.1]: Ignoring exception in on_member_update
2022-06-23T04:48:44.209541+00:00 app[worker.1]: Traceback (most recent call last):
2022-06-23T04:48:44.209560+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/discord/client.py", line 343, in _run_event
2022-06-23T04:48:44.209561+00:00 app[worker.1]: await coro(*args, **kwargs)
2022-06-23T04:48:44.209570+00:00 app[worker.1]: File "/app/ttsbot.py", line 112, in on_member_update
2022-06-23T04:48:44.209571+00:00 app[worker.1]: max_join_time_1 = timenow() - timedelta(weeks=1)
2022-06-23T04:48:44.209592+00:00 app[worker.1]: TypeError: 'datetime.datetime' object is not callable
import discord
import asyncio
import datetime
import math
import pytz
from discord.ext import commands
from discord.ext.commands import has_permissions, MissingPermissions
from discord.utils import get
from datetime import datetime, timedelta, timezone
TOKEN = "*something*"
intents = discord.Intents.all()
intents.members = True
bot = commands.Bot(command_prefix='.', intents = intents)
bot.remove_command('help')
utc=pytz.UTC
@bot.event
async def on_member_update(before, after):
if len(before.roles) < len(after.roles):
new_role = next(role for role in after.roles if role not in before.roles)
guild = bot.get_guild(*something*)
if '.• 미인증 유저' in new_role.name:
role_name1 = ".• 미인증 유저"
role1 = discord.utils.get(guild.roles, name=role_name1)
await asyncio.sleep(604800)
timenow = datetime.now(timezone.utc)
max_join_time_1 = timenow() - timedelta(weeks=1)
current_timezone_time = after.joined_at
new_timezone_time = current_timezone_time.astimezone(pytz.UTC)
log_channel = bot.get_channel(*something*)
if after in role1.members and new_timezone_time < max_join_time_1:
await after.kick(reason="일주일동안 인증하지 않으셨습니다.")
embed = discord.Embed(title="강퇴",
colour=0xB11B1B,
timestamp=datetime.now())
embed.set_thumbnail(url=after.avatar_url)
fields = [("이름", f"{after.name}", False),
("사유", f"7일간 미인증으로 머물러 강퇴당함.", False)]
for name, value, inline in fields:
embed.add_field(name=name, value=value, inline=inline)
await log_channel.send(embed=embed)
else:
pass
else:
pass
I’ve tried some of the relevant answers in stackoverflow, like TypeError: 'module' object is not callable and TypeError: 'datetime.datetime' object is not callable, but nothing worked. Maybe because it’s my first time working with python?
Sorry for my bad english, but I need some help.
-edit-
My first code was actually
@bot.event
async def on_member_update(before, after):
if len(before.roles) < len(after.roles):
new_role = next(role for role in after.roles if role not in before.roles)
guild = bot.get_guild(*something*)
if '.• 미인증 유저' in new_role.name:
role_name1 = ".• 미인증 유저"
role1 = discord.utils.get(guild.roles, name=role_name1)
await asyncio.sleep(604800)
timenow = datetime.now
max_join_time_1 = timenow() - timedelta(weeks=1)
log_channel = bot.get_channel(*something*)
if after in role1.members and after.joined_at < max_join_time_1:
await after.kick(reason="일주일동안 인증하지 않으셨습니다.")
embed = discord.Embed(title="강퇴",
colour=0xB11B1B,
timestamp=datetime.now())
embed.set_thumbnail(url=after.avatar_url)
fields = [("이름", f"{after.name}", False),
("사유", f"7일간 미인증으로 머물러 강퇴당함.", False)]
for name, value, inline in fields:
embed.add_field(name=name, value=value, inline=inline)
await log_channel.send(embed=embed)
else:
pass
else:
pass
but then I had the
TypeError: can’t compare offset-naive and offset-aware datetimes
error, so I fixed both of the timezone to utc.
First it worked fine when I ran it my computer, and it had errors only when I uploaded it to heroku.
But after the edit I can’t run it by my computer, too.
Answers:
Here is the problem:
timenow = datetime.now(timezone.utc)
max_join_time_1 = timenow() - timedelta(weeks=1)
# ^^
You create a datetime
object called timenow
and then you try to call it on the next line.
Remove the parentheses:
timenow = datetime.now(timezone.utc)
max_join_time_1 = timenow - timedelta(weeks=1)
In my situation, there is a datetime.py exist in the same directory of my active python file.
Renaming or removing it resolve my issue
I’m trying to make the bot to kick the player who has the role for a week, but I’m getting some errors.
2022-06-23T04:48:44.209432+00:00 app[worker.1]: Ignoring exception in on_member_update
2022-06-23T04:48:44.209541+00:00 app[worker.1]: Traceback (most recent call last):
2022-06-23T04:48:44.209560+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.10/site-packages/discord/client.py", line 343, in _run_event
2022-06-23T04:48:44.209561+00:00 app[worker.1]: await coro(*args, **kwargs)
2022-06-23T04:48:44.209570+00:00 app[worker.1]: File "/app/ttsbot.py", line 112, in on_member_update
2022-06-23T04:48:44.209571+00:00 app[worker.1]: max_join_time_1 = timenow() - timedelta(weeks=1)
2022-06-23T04:48:44.209592+00:00 app[worker.1]: TypeError: 'datetime.datetime' object is not callable
import discord
import asyncio
import datetime
import math
import pytz
from discord.ext import commands
from discord.ext.commands import has_permissions, MissingPermissions
from discord.utils import get
from datetime import datetime, timedelta, timezone
TOKEN = "*something*"
intents = discord.Intents.all()
intents.members = True
bot = commands.Bot(command_prefix='.', intents = intents)
bot.remove_command('help')
utc=pytz.UTC
@bot.event
async def on_member_update(before, after):
if len(before.roles) < len(after.roles):
new_role = next(role for role in after.roles if role not in before.roles)
guild = bot.get_guild(*something*)
if '.• 미인증 유저' in new_role.name:
role_name1 = ".• 미인증 유저"
role1 = discord.utils.get(guild.roles, name=role_name1)
await asyncio.sleep(604800)
timenow = datetime.now(timezone.utc)
max_join_time_1 = timenow() - timedelta(weeks=1)
current_timezone_time = after.joined_at
new_timezone_time = current_timezone_time.astimezone(pytz.UTC)
log_channel = bot.get_channel(*something*)
if after in role1.members and new_timezone_time < max_join_time_1:
await after.kick(reason="일주일동안 인증하지 않으셨습니다.")
embed = discord.Embed(title="강퇴",
colour=0xB11B1B,
timestamp=datetime.now())
embed.set_thumbnail(url=after.avatar_url)
fields = [("이름", f"{after.name}", False),
("사유", f"7일간 미인증으로 머물러 강퇴당함.", False)]
for name, value, inline in fields:
embed.add_field(name=name, value=value, inline=inline)
await log_channel.send(embed=embed)
else:
pass
else:
pass
I’ve tried some of the relevant answers in stackoverflow, like TypeError: 'module' object is not callable and TypeError: 'datetime.datetime' object is not callable, but nothing worked. Maybe because it’s my first time working with python?
Sorry for my bad english, but I need some help.
-edit-
My first code was actually
@bot.event
async def on_member_update(before, after):
if len(before.roles) < len(after.roles):
new_role = next(role for role in after.roles if role not in before.roles)
guild = bot.get_guild(*something*)
if '.• 미인증 유저' in new_role.name:
role_name1 = ".• 미인증 유저"
role1 = discord.utils.get(guild.roles, name=role_name1)
await asyncio.sleep(604800)
timenow = datetime.now
max_join_time_1 = timenow() - timedelta(weeks=1)
log_channel = bot.get_channel(*something*)
if after in role1.members and after.joined_at < max_join_time_1:
await after.kick(reason="일주일동안 인증하지 않으셨습니다.")
embed = discord.Embed(title="강퇴",
colour=0xB11B1B,
timestamp=datetime.now())
embed.set_thumbnail(url=after.avatar_url)
fields = [("이름", f"{after.name}", False),
("사유", f"7일간 미인증으로 머물러 강퇴당함.", False)]
for name, value, inline in fields:
embed.add_field(name=name, value=value, inline=inline)
await log_channel.send(embed=embed)
else:
pass
else:
pass
but then I had the
TypeError: can’t compare offset-naive and offset-aware datetimes
error, so I fixed both of the timezone to utc.
First it worked fine when I ran it my computer, and it had errors only when I uploaded it to heroku.
But after the edit I can’t run it by my computer, too.
Here is the problem:
timenow = datetime.now(timezone.utc)
max_join_time_1 = timenow() - timedelta(weeks=1)
# ^^
You create a datetime
object called timenow
and then you try to call it on the next line.
Remove the parentheses:
timenow = datetime.now(timezone.utc)
max_join_time_1 = timenow - timedelta(weeks=1)
In my situation, there is a datetime.py exist in the same directory of my active python file.
Renaming or removing it resolve my issue