-
Notifications
You must be signed in to change notification settings - Fork 0
/
Starry_Bot.py
290 lines (244 loc) · 12.5 KB
/
Starry_Bot.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
import discord
from discord.ext import commands;
import aiohttp
import os
import dotenv
from discord import app_commands
import typing
import time
import re
import io
import random
import asyncio
intents = discord.Intents.default()
intents.message_content =True;
intents.members = True;
bot = commands.Bot(command_prefix='.',intents=intents)
client = discord.Client (intents=intents)
dotenv.load_dotenv();
TOKEN = os.getenv('DISCORD_BOT_TOKEN');
STAR_KEY=os.getenv('STARRY_AI_KEY')
PRIMARY_EMBED_COLOR = int(os.getenv("EMBED_COLOR"),16)
BOT_NAME=os.getenv('BOTNAME')
GENERATION_STEPS = os.getenv('GENERATION_STEPS')#im using 40 by default the app uses 50 40 should give good enough results
MAX_IMAGES = os.getenv('MAX_IMAGES')
VERSION="1.0.6"
smile = "\U0001F600"
frown = "\U0001F641"
heart = "🩷"
negative_prompt = """nudity, penis, clit, vagina, tits, phallus, areola, cum, sperm, gore,
naked, testicles, nsfw, unclothed, butthole, asshole, erotic, porn, hentai, xxx, orgy, bdsm, fetish,
masturbation, vibrator, dildo, bukkake, anal, bondage, bestiality, scat, incest, rape, pedophilia, necrophilia, snuff,
orgasm, moan, swallow, creampie, ejaculation, kink, masochism, sadism, threesome, gang bang, glory hole, escort,
stripper, explicit, obscene, lewd , lowres, cropped, worst quality, low quality, ugly, morbid, mutilated,out of frame, extra fingers,
poorly drawn hands, poorly drawn face, deformed, blurry, bad anatomy, bad proportions, extra limbs,cloned face, disfigured, gross proportions missing arms, missing legs,extra arms, extra legs
"""
banned_words = [
"nudity", "penis", "clit", "vagina", "tits", "dick", "phallus", "areola", "cum", "sperm", "gore",
"naked", "no clothes", "testicles", "nsfw", "unclothed", "butthole", "asshole", "prolapse",
"disembowelment", "erotic", "porn", "pornstar", "hentai", "xxx", "orgy", "bdsm", "fetish",
"masturbation", "vibrator", "dildo", "bukkake", "anal", "bondage", "bestiality", "beastiality",
"furry", "scat", "watersports", "incest", "rape", "pedophilia", "necrophilia", "snuff",
"orgasm", "moan", "swallow", "creampie", "ejaculation", "kink", "swinger", "dominatrix",
"masochism", "sadism", "threesome", "gang bang", "sex tape", "camgirl", "camboy",
"playboy", "penthouse", "hustler", "playgirl", "fleshlight", "glory hole", "escort",
"stripper", "lap dance", "peep show", "dominatrix", "fetish", "adult video", "adult website",
"dirty talk", "sexy", "explicit", "obscene", "lewd", "forbidden", "perverted", "degenerate", "erect", "fellatio", "cunnilingus", "analingus", "rimming", "sexting", "erotica", "aphrodisiac",
"sexploitation", "sex toy", "intimate", "pheromone", "lingerie", "sexy outfit", "roleplay",
"cybersex", "dirty minded", "lecherous", "lascivious", "concupiscent", "libidinous",
"licentious", "priapic", "smut", "adult content", "explicit content", "indecent",
"topless", "bottomless", "camel toe", "bulge", "upskirt", "downblouse", "nipple slip",
"erotic novel", "sex chat", "phone sex", "virtual reality porn", "amateur porn",
"fetishism", "exhibitionism", "voyeurism", "peeping tom", "sex scene", "explicit photo",
"sex act", "sexual intercourse", "erotic massage", "sensual", "steamy", "arousing",
"provocative", "salacious", "titillating", "sizzling", "dirty movies", "kinky",
"taboo", "lustful", "sexy talk", "erogenous", "dominatrix", "fellatio", "autofellatio", "orgiastic", "libidinous", "voyeur",
"fornicate", "pheromones", "urethral play", "figging", "coprophilia", "queening", "daisy chain",
"shrimping", "pansexual", "tit torture", "ball busting", "chastity belt", "cock and ball torture",
"dick flick", "felching", "gokkun", "happy ending", "jelly donut", "knob polishing", "pearl necklace",
"quickie", "queef", "rusty trombone", "taint", "unicorn", "vibrating panties", "wet dream", "x-rated",
"yoni massage", "zinc", "69", "aphrodisiac", "BDSM", "cock ring", "double penetration", "edge-play",
"fetishwear", "golden shower", "hedonism", "inflatable dildo", "jilling off", "kinky boots",
"macrophilia", "nymphomania", "oedipal", "pegging", "quim", "rubber ball", "sapphic", "teabagging",
"undress", "vixen", "watersports", "xerophile", "yiff", "zentai","barebody","fucking","orgasm","foot job","clit ring","faggot","twink","vulva","ballsack","sex"
]
friends = [
"rosh007",
"Persona Slates",
"Switch",
"thekwitt",
"Ryno matic",
"KawaiiWaifu",
"Cthylla",
"(Not) That Guy¹",
"Manda"
]
friend_string = ""
for friend in friends:
friend_string = friend_string + "\n" + friend + " " + heart
sizes = [
"square",
"landscape",
"portrait",
"wide"
]
#all; the good styles your welcome
art_styles = [
# "hydra",
# "fantasy",
# "detailedIllustration",
# "3dIllustration",
# "flatIllustration",
"realvisxl",
"anime_2",
"anime_stylized",
#"anime_vintage",
"pixelart",
"luna_3d",
#"cyberPunk"
]
# not availbel yet..... cyberPunk""anime_3",
# too damn slow and low quality "animaginexl"
# Kinda not pretty mabee with more steps which more money which is more time .... "stylevisionxl",
#populating array with count values i.e 1,2... based on the max value set in max_images
image_numbers = []
for i in range (int(MAX_IMAGES)) :
image_numbers.append(str(i+1))
art_styles.sort();
def remove_special_characters(string:str):
allowed_characters = re.compile(r'[a-zA-Z0-9_\-\.]+') #regex to allow only alphanumeric characters and _ - . characters
#its easier to find the allowed characters than to find the disallowed characters also i hate regex with a passion
# Use the findall method to get a list of allowed character sequences
allowed_parts = re.findall(allowed_characters, string)
# Join the allowed parts to form the cleaned file name
cleaned_string = ''.join(allowed_parts)
return cleaned_string
def contains_banned_words(prompt: str) -> bool:
prompt_lower = prompt.lower()
return any(word in prompt_lower for word in banned_words)
@bot.event
async def on_ready():
print(f'Logged in as {bot.user.name}');
print('-----------')
await bot.tree.sync()
@bot.tree.command(name="myfriends",description="These people inspired my creator to make me ")
async def myfriends(interaction:discord.Interaction):
embed = discord.Embed(title="My Friends " + smile, color=PRIMARY_EMBED_COLOR)
embed.add_field(name="This is my Name " + heart , value=BOT_NAME, inline=True)
embed.add_field(name="Version", value=VERSION, inline=True)
embed.add_field(name="Author", value="Scott/itachi/ZERO", inline=True)
embed.add_field(name="Friends", value=friend_string, inline=False)
embed.add_field(name="Thank you for helping to bring me into reality " + heart + heart + heart , value=BOT_NAME, inline=True)
await interaction.response.send_message(embed=embed)
async def style_autocompletion(
interaction:discord.Interaction,
current: str
) -> typing.List[app_commands.Choice[str]]:
data = []
for style_choice in art_styles:
data.append(app_commands.Choice(name=style_choice,value=style_choice))
return data;
async def size_autocompletion(
interaction:discord.Interaction,
current: str
) -> typing.List[app_commands.Choice[str]]:
data = []
for size_choice in sizes:
data.append(app_commands.Choice(name=size_choice,value=size_choice))
return data;
async def number_of_images_autocompletion(
interaction:discord.Interaction,
current: str
) -> typing.List[app_commands.Choice[str]]:
data = []
for number_choice in image_numbers:
data.append(app_commands.Choice(name=number_choice,value=number_choice))
return data;
@bot.tree.command(name="create_pic", description="give me a prompt to generate art")
@app_commands.autocomplete(style=style_autocompletion, size=size_autocompletion, number_of_images=number_of_images_autocompletion)
async def create_pic(interaction: discord.Interaction, *, prompt: str, style: str, size: str = "square", number_of_images: str = "1"):
await interaction.response.defer()
try:
if len(prompt) >= 256:
title = prompt[:128] + "..."
else:
title = prompt
if contains_banned_words(prompt):
embed = discord.Embed(title="Sorry, I can't make that", description="Your prompt contains inappropriate content.", color=PRIMARY_EMBED_COLOR)
await interaction.followup.send(embed=embed)
return
image_urls = []
headers = {
'X-API-Key': STAR_KEY,
'Content-Type': "application/json"
}
payload = {
"model": style,
"aspectRatio": size,
"highResolution": False,
"images": int(number_of_images),
"steps": int(GENERATION_STEPS),
"prompt": prompt,
"initialImageMode": "color",
"negativePrompt":negative_prompt
}
link = "https://api.starryai.com/creations/"
async with aiohttp.ClientSession() as session:
async with session.post(link, json=payload, headers=headers) as response:
if response.status == 200:
data = await response.json()
job_id = data['id']
creation_pickup_link = f"https://api.starryai.com/creations/{job_id}"
await asyncio.sleep(5)
files = []
sleeptime = 5
for i in range(10):
sleeptime += i + 1
async with session.get(creation_pickup_link, headers=headers) as response:
if response.status == 200:
data = await response.json()
if data['status'] == "completed":
image_urls = data['images']
break
else:
await asyncio.sleep(sleeptime)
else:
break
for url in image_urls:
image_url = url['url']
async with session.get(image_url) as resp:
if resp.status != 200:
return await interaction.followup.send('Could not get image...')
data = io.BytesIO(await resp.read())
title = remove_special_characters(title)
random_numb = random.randrange(1000, 4000)
file_name = str(int(time.time())) + str(random_numb) + "_" + title + ".png"
files.append(discord.File(data, filename=file_name))
embed = discord.Embed(title="Here is your image of: " + title, color=PRIMARY_EMBED_COLOR)
await interaction.followup.send(embed=embed, files=files)
else:
embed = discord.Embed(title="There was an error generating the image", color=PRIMARY_EMBED_COLOR)
await interaction.followup.send("Could not get image")
return
except Exception as e:
embed = discord.Embed(title="There was an error generating the image", color=PRIMARY_EMBED_COLOR)
print(e)
await interaction.followup.send("Could not get image, try again later")
return
#help
@bot.tree.command(name="help",description="commands etc")
async def create_pic(interaction:discord.Interaction):
await interaction.response.defer()
embed = discord.Embed(title="Commands", color=PRIMARY_EMBED_COLOR)
embed.add_field(name="create_pic", value="Generates an image based on the prompt", inline=False)
embed.add_field(name="help", value="Shows this message", inline=False)
await interaction.followup.send(embed=embed)
#version
@bot.tree.command(name="version",description="Get"+ BOT_NAME +" bot version")
async def version(interaction:discord.Interaction):
embed = discord.Embed(title="My Version Info :D ", color=PRIMARY_EMBED_COLOR)
embed.add_field(name="This is my Name :) ", value=BOT_NAME, inline=True)
embed.add_field(name="Version", value=VERSION, inline=True)
embed.add_field(name="Author", value="Scott/itachi", inline=True)
await interaction.response.send_message(embed=embed)
bot.run(TOKEN);