Yes, you can do
@bot.event
async def on_message(message):
if message.content == "Hi":
await bot.send_message(message.channel,"Hello")
This way you use an event instead of a command so when you write "Hi" into the chat the bot will catch it and run the method
If you want to pass something to the command function you can do so just like you would with a normal method
@bot.command()
async def example(something):
print(something)
When you do !example Hello There
the bot will print out Hello
because from the strings it got as input (separated by whitespaces) it picked the first value and assigned it to your variable just like a normal program getting its input from the command line.
To catch all elements you can use *args
@bot.command()
async def example(*args):
print(args)
which will return a tuple of all the values you gave from the chat.
!example Hello There
will print out ('Hello', 'There')