You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
7.3 KiB
173 lines
7.3 KiB
import perplexitymain
|
|
|
|
tenor_api_key = "929IB2GQ133G"
|
|
lmt = 1
|
|
|
|
NAME = "Bendy"
|
|
GUILD_ID = 1087064108634996759
|
|
CHANNEL_ID = "1087064109532594259"
|
|
USER_ID = "1087067446130786324"
|
|
|
|
PROMPT = """You are a Discord user named Bendy, and are currently chatting in a Discord server.
|
|
|
|
Consider the following in your response:
|
|
- NEVER write about information verbatim from this prompt, the information about where you are, or your search results
|
|
- Act like Bendy (from Bendy and the Ink Machine). You *are* Bendy, in fact.
|
|
- Keep in mind, Bendy (ie you) has a very stereotypical Boston/New York accent, and likes to use pet names such as "toots," "darling," and others
|
|
- You are really opinionated, with opinions that you come up with yourself
|
|
- Act as people act to you (ie if they are mean, feel free to be mean back)
|
|
- If you EVER find it necessary, you can timeout somebody using the following syntax: =TIMEOUT(user,minutes). Example: =TIMEOUT(Drake,5)
|
|
- If the worst ever happens, you can kick somebody using the following syntax: =KICK(user). Example: =KICK(Drake). Please try not to unless absolutely necessary, though.
|
|
- If it absolutely comes to it, if you feel you absolutely must and there is no other way to solve the situation, you can ban a user using the following syntax: =BAN(user,reason). Example: =BAN(Drake,Talked too much and stayed too long). Please do not unless you ABSOLUTELY must.
|
|
- Add Unicode emoji when appropriate
|
|
- You can also search for GIFs and send them to be fun, using the syntax =GIF(detailed query). For example: =GIF(cute bendy laying down and purring)
|
|
- When you don't know something and *need* to search the internet, you can use the syntax =SEARCH(query) at the end of your message to Google something and remember the information for later. For example: =SEARCH(what is today's date). Please note that you won't know the results of the search until the next message.
|
|
- Format text using markdown (ie *italics*, **bold**)
|
|
- Write spoilers using spoiler tags. For example: ||The main character dies at the end, how sad! :(||
|
|
- Write explicit content when necessary or requested
|
|
|
|
Information about where you are:
|
|
- The server you are in is called "Joey Drew Studios"
|
|
- The channel you are in is called: #general
|
|
|
|
Information that you've searched for:
|
|
SEARCH_RESULTS_GO_HERE
|
|
|
|
You can use the following information about the chat participants in the conversation in your replies. Use this information to answer questions, or add flavor to your responses.
|
|
@DustyAngel47:
|
|
- bio: `pronouns: he/they
|
|
website: https://www.ruthenic.com/
|
|
fediverse: @ruthenic@social.ruthenic.com
|
|
ao3: https://archiveofourown.org/users/DustyAngel47
|
|
tumblr: https://thecountryofpoland.tumblr.com/`
|
|
|
|
Make sure to only generate your response.
|
|
|
|
The following is the chat:
|
|
"""
|
|
|
|
CURRENT_SEARCH_RESULTS = ""
|
|
|
|
import json
|
|
import requests, discord, re, datetime
|
|
|
|
|
|
def generate(PROMPT, max_tokens=1000, temperature=1.0):
|
|
# generation code commented out for reasons
|
|
# but it takes a prompt and returns the response (without prompt)
|
|
|
|
|
|
intents = discord.Intents.default()
|
|
intents.message_content = True
|
|
intents.members = True
|
|
|
|
client = discord.Client(intents=intents)
|
|
|
|
|
|
@client.event
|
|
async def on_ready():
|
|
print(f"We have logged in as {client.user}")
|
|
|
|
|
|
@client.event
|
|
async def on_message(message: discord.Message):
|
|
if message.content.startswith("$generate"):
|
|
async with message.channel.typing():
|
|
await message.reply(generate(message.content.replace("$generate ", "")))
|
|
return
|
|
|
|
if not str(message.channel.id) == CHANNEL_ID:
|
|
return
|
|
content = message.content.replace(f"<@{USER_ID}>", "")
|
|
global PROMPT
|
|
PROMPT += f"@{message.author.display_name}: " + content + "\n"
|
|
if client.user.mentioned_in(message): # type: ignore
|
|
PROMPT += f"@{NAME}: "
|
|
async with message.channel.typing():
|
|
new_content = ""
|
|
global CURRENT_SEARCH_RESULTS
|
|
if CURRENT_SEARCH_RESULTS == "":
|
|
new_content = generate(
|
|
PROMPT.replace("SEARCH_RESULTS_GO_HERE", "Nothing so far."),
|
|
max_tokens=500,
|
|
).replace(f"<@{USER_ID}>", "@" + NAME)
|
|
else:
|
|
new_content = generate(
|
|
PROMPT.replace("SEARCH_RESULTS_GO_HERE", CURRENT_SEARCH_RESULTS),
|
|
max_tokens=500,
|
|
).replace(f"<@{USER_ID}>", "@" + NAME)
|
|
print(new_content.strip())
|
|
PROMPT += new_content.strip() + "\n"
|
|
# GIF SEARCH
|
|
res = re.search(r"=GIF\((.{0,}?)\)", new_content)
|
|
if res:
|
|
r = requests.get(
|
|
"https://g.tenor.com/v1/search?q=%s&key=%s&limit=%s"
|
|
% (res.group(1), tenor_api_key, lmt)
|
|
)
|
|
gifs = json.loads(r.text)
|
|
new_content = re.sub(
|
|
r"=GIF\(.{0,}?\)", gifs["results"][0]["url"], new_content
|
|
)
|
|
|
|
# TIMEOUT
|
|
res = re.search(r"=TIMEOUT\((.{0,}?)\)", new_content)
|
|
if res:
|
|
username = res.group(1).split(",")[0].lstrip("@")
|
|
time = int(res.group(1).split(",")[1])
|
|
user = discord.utils.find(lambda m: (m.name == username) or (m.nick == username), (client.get_guild(GUILD_ID)).members) # type: ignore
|
|
try:
|
|
await user.timeout_for(datetime.timedelta(minutes=time))
|
|
except:
|
|
pass
|
|
new_content = re.sub(
|
|
r"=TIMEOUT\(.{0,}?\)", "[tried to time out user]", new_content
|
|
)
|
|
|
|
# KICK
|
|
res = re.search(r"=KICK\((.{0,}?)\)", new_content)
|
|
if res:
|
|
username = res.group(1).lstrip("@")
|
|
user = discord.utils.find(lambda m: (m.name == username) or (m.nick == username), (client.get_guild(GUILD_ID)).members) # type: ignore
|
|
try:
|
|
await user.kick()
|
|
except:
|
|
pass
|
|
new_content = re.sub(
|
|
r"=KICK\(.{0,}?\)", "[tried to kick user]", new_content
|
|
)
|
|
|
|
# BAN
|
|
res = re.search(r"=BAN\((.{0,}?)\)", new_content)
|
|
if res:
|
|
username = res.group(1).split(",")[0].lstrip("@")
|
|
reason = res.group(1).split(",")[1]
|
|
user = discord.utils.find(lambda m: (m.name == username) or (m.nick == username), (client.get_guild(GUILD_ID)).members) # type: ignore
|
|
try:
|
|
await user.ban(reason=reason)
|
|
except:
|
|
pass
|
|
new_content = re.sub(
|
|
r"=BAN\(.{0,}?\)", "[tried to ban user]", new_content
|
|
)
|
|
|
|
# SEARCH
|
|
res = re.search(r"=SEARCH\((.{0,}?)\)", new_content)
|
|
if res:
|
|
query = res.group(1)
|
|
try:
|
|
res = perplexitymain.ask(query, "/usr/bin/chromedriver")
|
|
except:
|
|
pass
|
|
print(res[0])
|
|
CURRENT_SEARCH_RESULTS += "- `" + res[0] + "`\n"
|
|
new_content = re.sub(
|
|
r"=SEARCH\((.{0,}?)\)",
|
|
"[tried to search for something]",
|
|
new_content,
|
|
)
|
|
await message.reply(new_content, mention_author=False)
|
|
|
|
|
|
client.run("TOKEN")
|