From 42d647210b8d5fa845cc156f18478a567f8da2ee Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Fri, 9 Dec 2022 12:12:34 +1100 Subject: [PATCH 1/6] Added requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..503dba9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +discord.py \ No newline at end of file From 96a3b5576782882d6c64e99aa87f6219debf26ba Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Fri, 9 Dec 2022 12:13:24 +1100 Subject: [PATCH 2/6] Added .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b34f717 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vscode/ +venv/ +*.secret From 1beadf61f34a164c9438c324c6f4e1e79ce26791 Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Fri, 9 Dec 2022 12:19:06 +1100 Subject: [PATCH 3/6] Added bot skeleton --- weeeabot.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 weeeabot.py diff --git a/weeeabot.py b/weeeabot.py new file mode 100644 index 0000000..95a8633 --- /dev/null +++ b/weeeabot.py @@ -0,0 +1,28 @@ +import discord +from sys import exit + +try: + with open("token.secret", 'r') as f: + discord_client_token = f.read() +except FileNotFoundError: + print("Cannot locate token.secret please generate a token") + exit(69) + +intents = discord.Intents.default() +intents.message_content = 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): + if message.author == client.user: + return + + if message.content.startswith('$hello'): + await message.channel.send('Hello!') + +client.run(discord_client_token) From aaee407af42cbcca8404dcc74a8e4119fbe27b24 Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Sat, 10 Dec 2022 02:26:35 +1100 Subject: [PATCH 4/6] Bot now does degen things ;) --- requirements.txt | 3 +- testing.ipynb | 22 +++++----- weeeabot.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 123 insertions(+), 13 deletions(-) diff --git a/requirements.txt b/requirements.txt index 503dba9..3aed5b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -discord.py \ No newline at end of file +discord.py +aiohttp \ No newline at end of file diff --git a/testing.ipynb b/testing.ipynb index f488cc2..84e488f 100644 --- a/testing.ipynb +++ b/testing.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 32, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -13,14 +13,14 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "payload = {\n", - " \"prompt\": \"view from behind web developer sitting in a chair, sfw\",\n", - " \"styles\": [\"default\"],\n", - " \"steps\": 28,\n", + " \"prompt\": \"cute girlhand on cheek eyes closed thinking hard, sfw\",\n", + " \"styles\": [\"Bot\"],\n", + " \"steps\": 70,\n", " \"seed\": -1,\n", " \"n_iter\": 1,\n", " \"height\": 1024,\n", @@ -39,25 +39,25 @@ "\n", "payload.update(override_payload)\n", "\n", - "# url = \"https://art.jurydoak.com/sdapi/v1\"\n", - "url = \"http://localhost:7860/sdapi/v1\"" + "url = \"https://art.jurydoak.com/sdapi/v1\"\n", + "# url = \"http://localhost:7860/sdapi/v1\"" ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" ] }, - "execution_count": 58, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -95,7 +95,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.8" + "version": "3.10.8 (main, Nov 1 2022, 14:18:21) [GCC 12.2.0]" }, "orig_nbformat": 4, "vscode": { diff --git a/weeeabot.py b/weeeabot.py index 95a8633..71dab05 100644 --- a/weeeabot.py +++ b/weeeabot.py @@ -1,4 +1,9 @@ import discord +import requests +import aiohttp +import asyncio +from base64 import b64decode +import json from sys import exit try: @@ -13,16 +18,120 @@ intents.message_content = True client = discord.Client(intents=intents) +nsfw_enabled = True +steps = 28 +seed = -1 +url = "https://art.jurydoak.com" + +async def gen_image(message): + # global sess + + sess = aiohttp.ClientSession(url) + + payload = { + "prompt": "cute girlhand on cheek eyes closed thinking hard, sfw", + "styles": ["Bot"], + "steps": steps, + "seed": seed, + "n_iter": 1, + "height": 1024, + "negative_prompts": "nsfw, not safe for work, nudity, multiple keyboards", + "cfg_scale": 12 + } + + settings = { + "filter_nsfw": not nsfw_enabled, + "samples_save": True, + } + + override_payload = { + "override_settings": settings + } + + payload.update(override_payload) + user_prompt = " ".join(message.content.split(' ')[1:]) + payload['prompt'] = user_prompt + # url = "https://art.jurydoak.com/sdapi/v1" + + image_req = await sess.post("/sdapi/v1/txt2img", json=payload) + x = await image_req.json() + image_req.close() + await sess.close() + + image = x['images'][0] + # image = requests.post(f"{url}/txt2img", json=payload).json()['images'][0] + with open('/tmp/image.png', 'wb') as f: + f.write(b64decode(image)) + + e = discord.Embed() + upload_file = discord.File("/tmp/image.png", filename="image.png") + e.set_image(url="attachment://image.png") + e.title = user_prompt + await message.channel.send("", file=upload_file, embed=e) + + @client.event async def on_ready(): + + bot_setup_id = 775489296932405319 + channel = client.get_channel(bot_setup_id) + await channel.send(f"Awake and ready to degen, NSFW: {nsfw_enabled}, STEPS: {steps}") + await client.change_presence(activity=discord.Game(name="Thinking degenerate thoughts...")) + + # text_channel_list = [] + # for server in discord.Client.servers: + # for channel in server.channels: + # if channel.type == "text": + # text_channel_list.append(channel) + + # print(text_channel_list) print(f'We have logged in as {client.user}') + @client.event async def on_message(message): + global nsfw_enabled if message.author == client.user: return if message.content.startswith('$hello'): - await message.channel.send('Hello!') + print(message.content) + await message.channel.send('Hopefully queued the image') + await gen_image(message) + + if message.content.startswith('$degen'): + await message.channel.send('Disabling kink mode' if nsfw_enabled else 'Enabling kink mode') + if nsfw_enabled: + nsfw_enabled = False + else: + nsfw_enabled = True + + if message.content.startswith("$steps"): + global steps + try: + num = int(message.content.split(" ")[1]) + steps = num + await message.channel.send(f"Setting steps to {steps}") + except: + pass + + + if message.content.startswith("$seed"): + global seed + try: + num = int(message.content.split(" ")[1]) + seed = num + await message.channel.send(f"Setting seed to {seed}") + except: + pass + + if message.content.startswith("$host"): + global url + try: + host = message.content.split(" ")[1] + url = host + await message.channel.send(f"Setting host to {host}") + except: + pass client.run(discord_client_token) From e9338fe6b9462807933a37e7e61da5cfdb1f478d Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Sat, 10 Dec 2022 17:52:24 +1100 Subject: [PATCH 5/6] Bot improvements --- weeeabot.py | 326 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 231 insertions(+), 95 deletions(-) diff --git a/weeeabot.py b/weeeabot.py index 71dab05..0a74c39 100644 --- a/weeeabot.py +++ b/weeeabot.py @@ -1,9 +1,7 @@ import discord -import requests +from discord.ext import commands import aiohttp -import asyncio from base64 import b64decode -import json from sys import exit try: @@ -16,23 +14,61 @@ except FileNotFoundError: intents = discord.Intents.default() intents.message_content = True -client = discord.Client(intents=intents) +# client = discord.Client(intents=intents) -nsfw_enabled = True -steps = 28 -seed = -1 -url = "https://art.jurydoak.com" +class Settings: + def __init__(self, nsfw_enabled=True, num_steps=28, ai_seed=-1, url="https://art.jurydoak.com", styles=["Bot"]): -async def gen_image(message): - # global sess - - sess = aiohttp.ClientSession(url) - + self.nsfw_enabled = nsfw_enabled + self.num_steps = num_steps + self.ai_seed = ai_seed + self.url = url + self.styles = styles + + +main_settings = Settings() +activity = discord.Activity(type=discord.ActivityType.listening, name="!help") + + +bot = commands.Bot(intents=intents, command_prefix="!", activity=activity, help_command=commands.DefaultHelpCommand()) + +async def send_request(ctx, endpoint, payload): + global num_steps + global ai_seed + sess = aiohttp.ClientSession(main_settings.url) + alive = await sess.head('/') + + if alive.status != 200: + await ctx.reply("I'm sorry but it appears my brain is offline") + alive.close() + await sess.close() + return { + 'images': [None] + } + + print(payload) + request = await sess.post(endpoint, json=payload) + try: + req_json = await request.json() + except: + print(await request.text()) + return { + 'images': [None] + } + request.close() + await sess.close() + return req_json + +@bot.command() +async def prompt(ctx, *args): + '''Generate an image with the provided prompt''' + prompt = " ".join(args) + await ctx.reply("Generating your image boo") payload = { - "prompt": "cute girlhand on cheek eyes closed thinking hard, sfw", - "styles": ["Bot"], - "steps": steps, - "seed": seed, + "prompt": prompt, + "styles": main_settings.styles, + "steps": main_settings.num_steps, + "seed": main_settings.ai_seed, "n_iter": 1, "height": 1024, "negative_prompts": "nsfw, not safe for work, nudity, multiple keyboards", @@ -40,7 +76,7 @@ async def gen_image(message): } settings = { - "filter_nsfw": not nsfw_enabled, + "filter_nsfw": not main_settings.nsfw_enabled, "samples_save": True, } @@ -49,89 +85,189 @@ async def gen_image(message): } payload.update(override_payload) - user_prompt = " ".join(message.content.split(' ')[1:]) - payload['prompt'] = user_prompt - # url = "https://art.jurydoak.com/sdapi/v1" - - image_req = await sess.post("/sdapi/v1/txt2img", json=payload) - x = await image_req.json() - image_req.close() - await sess.close() - - image = x['images'][0] - # image = requests.post(f"{url}/txt2img", json=payload).json()['images'][0] - with open('/tmp/image.png', 'wb') as f: - f.write(b64decode(image)) + image_data = await send_request(ctx, endpoint="/sdapi/v1/txt2img", payload=payload) - e = discord.Embed() - upload_file = discord.File("/tmp/image.png", filename="image.png") - e.set_image(url="attachment://image.png") - e.title = user_prompt - await message.channel.send("", file=upload_file, embed=e) - - -@client.event -async def on_ready(): - - bot_setup_id = 775489296932405319 - channel = client.get_channel(bot_setup_id) - await channel.send(f"Awake and ready to degen, NSFW: {nsfw_enabled}, STEPS: {steps}") - await client.change_presence(activity=discord.Game(name="Thinking degenerate thoughts...")) - - # text_channel_list = [] - # for server in discord.Client.servers: - # for channel in server.channels: - # if channel.type == "text": - # text_channel_list.append(channel) - - # print(text_channel_list) - print(f'We have logged in as {client.user}') - - -@client.event -async def on_message(message): - global nsfw_enabled - if message.author == client.user: + if image_data['images'][0] is None: + await ctx.reply("Something went wrong, please report this to the admin so it can be ignored") return - if message.content.startswith('$hello'): - print(message.content) - await message.channel.send('Hopefully queued the image') - await gen_image(message) + with open('/tmp/image.png', 'wb') as f: + f.write(b64decode(image_data['images'][0])) - if message.content.startswith('$degen'): - await message.channel.send('Disabling kink mode' if nsfw_enabled else 'Enabling kink mode') - if nsfw_enabled: - nsfw_enabled = False - else: - nsfw_enabled = True + embed = discord.Embed() + upload_file = discord.File("/tmp/image.png", filename="image.png") + embed.set_image(url="attachment://image.png") + # embed.title = prompt - if message.content.startswith("$steps"): - global steps - try: - num = int(message.content.split(" ")[1]) - steps = num - await message.channel.send(f"Setting steps to {steps}") - except: - pass + await ctx.reply("", file=upload_file, embed=embed) + + +@bot.command() +async def seed(ctx, arg): + '''Set the seed for the image generation''' + try: + arg = int(arg) + except: + pass + + # global ai_seed + main_settings.ai_seed = arg + + await ctx.reply(f"I have updated the seed to {main_settings.ai_seed} for you my master.") + +@bot.command() +async def steps(ctx, arg): + '''Set how many steps the AI will run (max 50)''' + try: + arg = int(arg) + except: + pass + + if arg > 50: + await ctx.reply("I'm sorry Dave, I can't do that") + return + + # global num_steps + main_settings.num_steps = arg + + await ctx.reply(f"I have updated the steps to {main_settings.num_steps} for you my master.") + +@bot.command() +async def settings(ctx): + '''See the currently configured settings (BROKEN)''' + global ai_seed, steps + settings = f""" + ``` + seed: {main_settings.ai_seed} + steps: {main_settings.num_steps} + ``` + """ + await ctx.message.channel.send(settings) + +@bot.command() +async def test(ctx): + '''Test function, currently changes the URL and bot settings''' + if main_settings.url != "http://localhost:7860": + main_settings.url = "http://localhost:7860" + main_settings.styles = ["default"] + await ctx.reply("Set to fastboi") + else: + main_settings.url = "https://art.jurydoak.com" + main_settings.styles = ["Bot"] + await ctx.reply("Set to main api") + + +# async def gen_image(message): +# # global sess + +# sess = aiohttp.ClientSession(url) + +# payload = { +# "prompt": "cute girlhand on cheek eyes closed thinking hard, sfw", +# "styles": ["Bot"], +# "steps": steps, +# "seed": seed, +# "n_iter": 1, +# "height": 1024, +# "negative_prompts": "nsfw, not safe for work, nudity, multiple keyboards", +# "cfg_scale": 12 +# } + +# settings = { +# "filter_nsfw": not nsfw_enabled, +# "samples_save": True, +# } + +# override_payload = { +# "override_settings": settings +# } + +# payload.update(override_payload) +# user_prompt = " ".join(message.content.split(' ')[1:]) +# payload['prompt'] = user_prompt +# # url = "https://art.jurydoak.com/sdapi/v1" + +# image_req = await sess.post("/sdapi/v1/txt2img", json=payload) +# x = await image_req.json() +# image_req.close() +# await sess.close() + +# image = x['images'][0] +# # image = requests.post(f"{url}/txt2img", json=payload).json()['images'][0] +# with open('/tmp/image.png', 'wb') as f: +# f.write(b64decode(image)) + +# e = discord.Embed() +# upload_file = discord.File("/tmp/image.png", filename="image.png") +# e.set_image(url="attachment://image.png") +# e.title = user_prompt +# await message.channel.send("", file=upload_file, embed=e) + + +# @client.event +# async def on_ready(): + +# bot_setup_id = 775489296932405319 +# channel = client.get_channel(bot_setup_id) +# # await channel.send(f"Awake and ready to degen, NSFW: {nsfw_enabled}, STEPS: {steps}") +# await client.change_presence(activity=discord.Game(name="Thinking degenerate thoughts...")) + +# # text_channel_list = [] +# # for server in discord.Client.servers: +# # for channel in server.channels: +# # if channel.type == "text": +# # text_channel_list.append(channel) + +# # print(text_channel_list) +# print(f'We have logged in as {client.user}') + + +# @client.event +# async def on_message(message): +# global nsfw_enabled +# if message.author == client.user: +# return + +# if message.content.startswith('$hello'): +# print(message.content) +# await message.channel.send('Hopefully queued the image') +# await gen_image(message) + +# if message.content.startswith('$degen'): +# await message.channel.send('Disabling kink mode' if nsfw_enabled else 'Enabling kink mode') +# if nsfw_enabled: +# nsfw_enabled = False +# else: +# nsfw_enabled = True + +# if message.content.startswith("$steps"): +# global steps +# try: +# num = int(message.content.split(" ")[1]) +# steps = num +# await message.channel.send(f"Setting steps to {steps}") +# except: +# pass - if message.content.startswith("$seed"): - global seed - try: - num = int(message.content.split(" ")[1]) - seed = num - await message.channel.send(f"Setting seed to {seed}") - except: - pass +# if message.content.startswith("$seed"): +# global seed +# try: +# num = int(message.content.split(" ")[1]) +# seed = num +# await message.channel.send(f"Setting seed to {seed}") +# except: +# pass - if message.content.startswith("$host"): - global url - try: - host = message.content.split(" ")[1] - url = host - await message.channel.send(f"Setting host to {host}") - except: - pass +# if message.content.startswith("$host"): +# global url +# try: +# host = message.content.split(" ")[1] +# url = host +# await message.channel.send(f"Setting host to {host}") +# except: +# pass -client.run(discord_client_token) +# client.run(discord_client_token) + +bot.run(discord_client_token) \ No newline at end of file From 470d42ee2fa84d35b890a338f0300290c05a62d8 Mon Sep 17 00:00:00 2001 From: Benjamyn Love Date: Sat, 10 Dec 2022 18:32:32 +1100 Subject: [PATCH 6/6] Removed old code --- weeeabot.py | 114 ---------------------------------------------------- 1 file changed, 114 deletions(-) diff --git a/weeeabot.py b/weeeabot.py index 0a74c39..7b04ed9 100644 --- a/weeeabot.py +++ b/weeeabot.py @@ -156,118 +156,4 @@ async def test(ctx): main_settings.styles = ["Bot"] await ctx.reply("Set to main api") - -# async def gen_image(message): -# # global sess - -# sess = aiohttp.ClientSession(url) - -# payload = { -# "prompt": "cute girlhand on cheek eyes closed thinking hard, sfw", -# "styles": ["Bot"], -# "steps": steps, -# "seed": seed, -# "n_iter": 1, -# "height": 1024, -# "negative_prompts": "nsfw, not safe for work, nudity, multiple keyboards", -# "cfg_scale": 12 -# } - -# settings = { -# "filter_nsfw": not nsfw_enabled, -# "samples_save": True, -# } - -# override_payload = { -# "override_settings": settings -# } - -# payload.update(override_payload) -# user_prompt = " ".join(message.content.split(' ')[1:]) -# payload['prompt'] = user_prompt -# # url = "https://art.jurydoak.com/sdapi/v1" - -# image_req = await sess.post("/sdapi/v1/txt2img", json=payload) -# x = await image_req.json() -# image_req.close() -# await sess.close() - -# image = x['images'][0] -# # image = requests.post(f"{url}/txt2img", json=payload).json()['images'][0] -# with open('/tmp/image.png', 'wb') as f: -# f.write(b64decode(image)) - -# e = discord.Embed() -# upload_file = discord.File("/tmp/image.png", filename="image.png") -# e.set_image(url="attachment://image.png") -# e.title = user_prompt -# await message.channel.send("", file=upload_file, embed=e) - - -# @client.event -# async def on_ready(): - -# bot_setup_id = 775489296932405319 -# channel = client.get_channel(bot_setup_id) -# # await channel.send(f"Awake and ready to degen, NSFW: {nsfw_enabled}, STEPS: {steps}") -# await client.change_presence(activity=discord.Game(name="Thinking degenerate thoughts...")) - -# # text_channel_list = [] -# # for server in discord.Client.servers: -# # for channel in server.channels: -# # if channel.type == "text": -# # text_channel_list.append(channel) - -# # print(text_channel_list) -# print(f'We have logged in as {client.user}') - - -# @client.event -# async def on_message(message): -# global nsfw_enabled -# if message.author == client.user: -# return - -# if message.content.startswith('$hello'): -# print(message.content) -# await message.channel.send('Hopefully queued the image') -# await gen_image(message) - -# if message.content.startswith('$degen'): -# await message.channel.send('Disabling kink mode' if nsfw_enabled else 'Enabling kink mode') -# if nsfw_enabled: -# nsfw_enabled = False -# else: -# nsfw_enabled = True - -# if message.content.startswith("$steps"): -# global steps -# try: -# num = int(message.content.split(" ")[1]) -# steps = num -# await message.channel.send(f"Setting steps to {steps}") -# except: -# pass - - -# if message.content.startswith("$seed"): -# global seed -# try: -# num = int(message.content.split(" ")[1]) -# seed = num -# await message.channel.send(f"Setting seed to {seed}") -# except: -# pass - -# if message.content.startswith("$host"): -# global url -# try: -# host = message.content.split(" ")[1] -# url = host -# await message.channel.send(f"Setting host to {host}") -# except: -# pass - -# client.run(discord_client_token) - bot.run(discord_client_token) \ No newline at end of file