master
HeyMoon 2022-08-22 20:30:52 -05:00
parent 2fa671a2a3
commit 7ee94cd077
2 changed files with 140 additions and 68 deletions

View File

@ -1,6 +1,7 @@
import base64 import base64
import io import io
import json import json
from random import random
import re import re
from typing import Callable, TypeVar from typing import Callable, TypeVar
import meme_generator import meme_generator
@ -18,6 +19,7 @@ from bs4 import BeautifulSoup
from utils import get_real_filename from utils import get_real_filename
TEST_MODE = True TEST_MODE = True
DRY_MODE = True
TEST_AUTH_TOKEN = "ED3eURMKP9FKBFbi-JUxo8MPGWkEihuyIlAUGtVL7xwx0NEy4Nf6J_mxWYTPgAQx1iy1X91hx7PPHyEBS79hvKVIy5DMEzOyAe9PAc5pmqSJlLGq_-ROewMwFzGrqer4" TEST_AUTH_TOKEN = "ED3eURMKP9FKBFbi-JUxo8MPGWkEihuyIlAUGtVL7xwx0NEy4Nf6J_mxWYTPgAQx1iy1X91hx7PPHyEBS79hvKVIy5DMEzOyAe9PAc5pmqSJlLGq_-ROewMwFzGrqer4"
MINUTES_BEFORE_FORCED_SHUTDOWN = 10 MINUTES_BEFORE_FORCED_SHUTDOWN = 10
DB_FILENAME = "automeme_database.db" DB_FILENAME = "automeme_database.db"
@ -25,12 +27,20 @@ PAGES_TO_SCAN = 5
AUTOMEME_ID = 13427 AUTOMEME_ID = 13427
ALLOWED_COMMENTS_PER_POST = 20 ALLOWED_COMMENTS_PER_POST = 20
ALLOWED_COMMENTS_PER_USER_PER_DAY = 20 ALLOWED_COMMENTS_PER_USER_PER_DAY = 20
MESSAGE = "i have a meme for u :marseyshy: \nPROTIP: I reply randomly. Put !!meme in your message to make sure I reply"
SOY_VS_CHAD_TRIGGER_CHANGE = 1.0
MODERN_MEME_WITH_MARSEY_TRIGGER_CHANGE = 1.0 #0.1
MODERN_MEME_WITH_IMAGE_TRIGGER_CHANGE = 1.0
CLASSIC_MEME_WITH_MARSEY_TRIGGER_CHANGE = 1.0 #0.5
CLASSIC_MEME_WITH_IMAGE_TRIGGER_CHANGE = 1.0
WEBCOMIC_TRIGGER_CHANCE = 1.0
EMOJI_REGEX = r":[^ ]*:" EMOJI_REGEX = r":[^ ]*:"
IMAGE_REGEX = r"!\[\]\(/images/([1234567890]*)\.webp\)" IMAGE_REGEX = r"!\[\]\(/images/([1234567890]*)\.webp\)"
GIF_REGEX = r"https:\/\/media\.giphy\.com\/media\/([a-zA-Z0-9]*)\/giphy\.webp" GIF_REGEX = r"https:\/\/media\.giphy\.com\/media\/([a-zA-Z0-9]*)\/giphy\.webp"
PARSED_IMAGE_REGEX = r"IMAGE:/images/[1234567890]*\.webp" PARSED_IMAGE_REGEX = r"IMAGE:/images/[1234567890]*\.webp"
PARSED_GIF_REGEX = r"GIF:([a-zA-Z0-9]*)" PARSED_GIF_REGEX = r"GIF:[a-zA-Z0-9]*"
INJECTABLE_IMAGE_REGEX = r"IMAGE:/images/\1\.webp" INJECTABLE_IMAGE_REGEX = r"IMAGE:/images/\1\.webp"
INJECTABLE_GIF_REGEX = r"GIF:\1" INJECTABLE_GIF_REGEX = r"GIF:\1"
@ -125,7 +135,7 @@ def get_text_only(text_elements : list[TextElement]) -> str:
return " ".join(text) return " ".join(text)
def text_elements(string : str): def text_elements(string : str):
FULL_REGEX = rf"({EMOJI_REGEX})|({PARSED_IMAGE_REGEX})" FULL_REGEX = rf"({EMOJI_REGEX})|({PARSED_IMAGE_REGEX})|({PARSED_GIF_REGEX})"
elements = re.split(FULL_REGEX, string) elements = re.split(FULL_REGEX, string)
to_return = [] to_return = []
for element in elements: for element in elements:
@ -152,6 +162,7 @@ def text_elements(string : str):
def strip_markdown(markdown_string): def strip_markdown(markdown_string):
markdown_string = re.sub(IMAGE_REGEX, INJECTABLE_IMAGE_REGEX, markdown_string) markdown_string = re.sub(IMAGE_REGEX, INJECTABLE_IMAGE_REGEX, markdown_string)
markdown_string = re.sub(GIF_REGEX, INJECTABLE_GIF_REGEX, markdown_string) markdown_string = re.sub(GIF_REGEX, INJECTABLE_GIF_REGEX, markdown_string)
markdown_string = re.sub("!![^\s]*", "", markdown_string)
markdown_string = re.sub(">.*\n", "", markdown_string) markdown_string = re.sub(">.*\n", "", markdown_string)
try: try:
html = markdown(markdown_string) html = markdown(markdown_string)
@ -163,6 +174,7 @@ def strip_markdown(markdown_string):
text = re.sub(r"fortune", "", text) text = re.sub(r"fortune", "", text)
text = re.sub(r"factcheck", "", text) text = re.sub(r"factcheck", "", text)
text = re.sub("!slots.*?\s", "", text) text = re.sub("!slots.*?\s", "", text)
text = re.sub(r"\"", "'", text) text = re.sub(r"\"", "'", text)
# make sure there are only letters in the string. # make sure there are only letters in the string.
@ -199,23 +211,45 @@ def get_full_rdrama_image_url(partial_url) -> str:
else: else:
return f"https://rdrama.net{partial_url}" return f"https://rdrama.net{partial_url}"
def extract_directives(string : str):
list = re.findall("!![^\s]*", string)
list = [i.lower()[2:] for i in list]
return list
def create_comment_message(chud: bool, pizza: bool, bird : bool, marsey : bool):
if (marsey):
return ":marseyshy:"
message = MESSAGE
if (chud):
message += "\ntrans lives matter"
if (pizza):
message += "\nUpon closer examination, one can see how Bikini Bottom is an allegory for the destiny of Faustian europe. Squidward clearly represents the Apollonian aryan man, stern, cultured, full of the creative Hyperborean soul and solar aristocratic character, and yet there is a tragic aspect to his character, in that his spiritual and creative passions are given no place in the degenrate modernistic kosher bacchanale that is modern Krabs-run Bikini Bottom. Spongebob represents the Dionysian aspect of aryan culture- he is the unawakened gentile, who has succumbed to cultural marxist brainwashing. Always maintaining a cheerful, carefree demeanor, and yet fawning and servile before the semitic crustacean power structure. Patrick represents the introduction of the primitive negroidic blood into the formerly pure white ethnos- He is an utter buffoon and unproductive anti-social drain on society, and yet the good goy Spongebob has been conditioned to accept his friendship, unaware of how his own way of life is gradually succumbing to the cthonic, subterranean negroid elements. As Im sure were all aware, well aware, Mr. Krabs represents the eternal merchant himself, as while not only is he a filthy money-grubber, it is shown, in season 1 episode 12, that he is pushing race-mixing upon the racially unaware Spongebob by trying to set him up on a date with his ball busting yenta whale daughter Pearl. Clearly, this show was ahead of its time."
return message
def main_processing_task(rdrama : RDramaAPIInterface, session : Session): def main_processing_task(rdrama : RDramaAPIInterface, session : Session):
is_chudded = False #Do we have the chud award? is_chudded = False #Do we have the chud award?
can_communicate = True #Can we send any message at all? can_communicate = True #Can we send any message at all?
is_pizzad = False is_pizzad = False
is_marseyed = False
is_birdsite = False
rdrama.get_front_page() rdrama.get_front_page()
automeme_information = rdrama.get_user_information(AUTOMEME_ID) automeme_information = rdrama.get_user_information(AUTOMEME_ID)
print(f"coins: {automeme_information['coins']} comments: {automeme_information['comment_count']}") print(f"coins: {automeme_information['coins']} comments: {automeme_information['comment_count']}")
for badge in automeme_information['badges']: for badge in automeme_information['badges']:
if (badge['name'] == "Marsey Award"): if (badge['name'] == "Marsey Award"):
print("We have the marsey award. STOP.") print("We have the marsey award. STOP.")
can_communicate = False is_marseyed = True
can_communicate = True
if (badge['name'] == "Chud"): if (badge['name'] == "Chud"):
print("We have the CHUD award. CONTINUE") print("We have the CHUD award. CONTINUE")
is_chudded = True is_chudded = True
if (badge['name'] == "Bird Site Award"): if (badge['name'] == "Bird Site Award"):
print("We have the Bird Site Award. STOP.") print("We have the Bird Site Award. STOP.")
can_communicate = False can_communicate = False
is_birdsite = True
if (badge['name'] == "Pizzashill Award"): if (badge['name'] == "Pizzashill Award"):
print("We have the Pizzashill Award. CONTINUE.") print("We have the Pizzashill Award. CONTINUE.")
is_pizzad = True is_pizzad = True
@ -236,8 +270,15 @@ def main_processing_task(rdrama : RDramaAPIInterface, session : Session):
continue continue
comment_text = eligible_comment['body'] comment_text = eligible_comment['body']
directives = extract_directives(comment_text)
cleaned_comment_text = strip_markdown(comment_text) cleaned_comment_text = strip_markdown(comment_text)
if ("meme" in directives):
random_float = 0.0
else:
random_float = random()
comment_lines = cleaned_comment_text.split("\n") comment_lines = cleaned_comment_text.split("\n")
comment_lines = [comment_line for comment_line in comment_lines if comment_line != ""] comment_lines = [comment_line for comment_line in comment_lines if comment_line != ""]
element_lines = [TextLine(line) for line in comment_lines] element_lines = [TextLine(line) for line in comment_lines]
@ -257,96 +298,119 @@ def main_processing_task(rdrama : RDramaAPIInterface, session : Session):
image_lines_count = len(image_lines) image_lines_count = len(image_lines)
image = None image = None
print(f"ROLLED = {random_float}")
if (dialog_lines_count == 2): if (dialog_lines_count == 2):
#Soy vs Chad print(f"[{eligible_comment['id']}] SOY_VS_CHAD")
line1 = dialog_lines[0] if (random_float <= SOY_VS_CHAD_TRIGGER_CHANGE):
line2 = dialog_lines[1] #Soy vs Chad
line1 = dialog_lines[0]
line2 = dialog_lines[1]
emoji1 = line1.emojis[0].emoji emoji1 = line1.emojis[0].emoji
emoji2 = line2.emojis[0].emoji emoji2 = line2.emojis[0].emoji
caption1 = line1.text caption1 = line1.text
caption2 = line2.text caption2 = line2.text
image = meme_generator.create_soy_vs_chad_meme(emoji1, emoji2, caption1, caption2) image = meme_generator.create_soy_vs_chad_meme(emoji1, emoji2, caption1, caption2)
elif (big_marsey_lines_count == 1 and pure_text_lines_count == 1): elif (big_marsey_lines_count == 1 and pure_text_lines_count == 1):
# Modern Meme with Marsey print(f"[{eligible_comment['id']}] MODERN_MEME_WITH_MARSEY")
text_line = pure_text_lines[0] if (random_float <= MODERN_MEME_WITH_MARSEY_TRIGGER_CHANGE):
marsey_line = big_marsey_lines[0]
marsey = marsey_line.emojis[0].emoji # Modern Meme with Marsey
caption = text_line.text text_line = pure_text_lines[0]
marsey_line = big_marsey_lines[0]
image = meme_generator.create_modern_meme_from_emoji(marsey, caption) marsey = marsey_line.emojis[0].emoji
caption = text_line.text
image = meme_generator.create_modern_meme_from_emoji(marsey, caption)
elif (image_lines_count == 1 and pure_text_lines_count == 1): elif (image_lines_count == 1 and pure_text_lines_count == 1):
# Modern Meme with Image print(f"[{eligible_comment['id']}] MODERN_MEME_WITH_IMAGE")
text_line = pure_text_lines[0] if (random_float <= MODERN_MEME_WITH_IMAGE_TRIGGER_CHANGE):
image_line = image_lines[0] # Modern Meme with Image
text_line = pure_text_lines[0]
image_line = image_lines[0]
image = image_line.images[0] image = image_line.images[0]
full_image_url = image.url full_image_url = image.url
caption = text_line.text caption = text_line.text
image = meme_generator.create_modern_meme_from_url(full_image_url, caption) image = meme_generator.create_modern_meme_from_url(full_image_url, caption)
elif (big_marsey_lines_count == 1 and pure_text_lines_count == 2): elif (big_marsey_lines_count == 1 and pure_text_lines_count == 2):
# Classic Meme with big marsey print(f"[{eligible_comment['id']}] CLASSIC_MEME_WITH_MARSEY")
top_text_line = pure_text_lines[0] if (random_float <= CLASSIC_MEME_WITH_MARSEY_TRIGGER_CHANGE):
bottom_text_line = pure_text_lines[1] # Classic Meme with big marsey
marsey_line = big_marsey_lines[0] top_text_line = pure_text_lines[0]
bottom_text_line = pure_text_lines[1]
marsey_line = big_marsey_lines[0]
emoji = marsey_line.emojis[0].emoji emoji = marsey_line.emojis[0].emoji
top_caption = top_text_line.text top_caption = top_text_line.text
bottom_caption = bottom_text_line.text bottom_caption = bottom_text_line.text
image = meme_generator.create_classic_meme_from_emoji(emoji, top_caption, bottom_caption) image = meme_generator.create_classic_meme_from_emoji(emoji, top_caption, bottom_caption)
elif (image_lines_count == 1 and pure_text_lines_count == 2): elif (image_lines_count == 1 and pure_text_lines_count == 2):
# Classic Meme with Image print(f"[{eligible_comment['id']}] CLASSIC_MEME_WITH_IMAGE")
top_text_line = pure_text_lines[0] if (random_float <= CLASSIC_MEME_WITH_IMAGE_TRIGGER_CHANGE):
bottom_text_line = pure_text_lines[1] # Classic Meme with Image
image_line = image_lines[0] top_text_line = pure_text_lines[0]
bottom_text_line = pure_text_lines[1]
image_line = image_lines[0]
image = image_line.images[0] image = image_line.images[0]
full_image_url = image.url full_image_url = image.url
top_caption = top_text_line.text top_caption = top_text_line.text
bottom_caption = bottom_text_line.text bottom_caption = bottom_text_line.text
image = meme_generator.create_classic_meme_from_url(full_image_url, top_caption, bottom_caption) image = meme_generator.create_classic_meme_from_url(full_image_url, top_caption, bottom_caption)
elif (argument_lines_count >= 1 or dialog_lines_count >= 1): elif (argument_lines_count >= 1 or dialog_lines_count >= 1):
panels : 'list[WebcomicPanel]' = [] print(f"[{eligible_comment['id']}] WEBCOMIC")
if (random_float <= WEBCOMIC_TRIGGER_CHANCE):
panels : 'list[WebcomicPanel]' = []
for element_line in element_lines: for element_line in element_lines:
if element_line.is_dialogue_line: if element_line.is_dialogue_line:
caption = element_line.text caption = element_line.text
emoji = element_line.emojis[0].emoji emoji = element_line.emojis[0].emoji
if len(caption) > 100: if len(caption) > 100:
in_background = True in_background = True
else: else:
in_background = False in_background = False
oneCharacterWebcomicPanel = OneCharacterWebcomicPanel(emoji, caption, in_background) oneCharacterWebcomicPanel = OneCharacterWebcomicPanel(emoji, caption, in_background)
panels.append(oneCharacterWebcomicPanel) panels.append(oneCharacterWebcomicPanel)
elif element_line.is_argument_line: elif element_line.is_argument_line:
left_caption = element_line.captions[0].text left_caption = element_line.captions[0].text
if len(element_line.captions) == 2: if len(element_line.captions) == 2:
right_caption = element_line.captions[1].text right_caption = element_line.captions[1].text
else: else:
right_caption = "" right_caption = ""
left_emoji = element_line.emojis[0].emoji left_emoji = element_line.emojis[0].emoji
right_emoji = element_line.emojis[1].emoji right_emoji = element_line.emojis[1].emoji
twoCharacterWebcomicPanel = TwoCharacterWebcomicPanel(left_emoji, left_caption, right_emoji, right_caption) twoCharacterWebcomicPanel = TwoCharacterWebcomicPanel(left_emoji, left_caption, right_emoji, right_caption)
panels.append(twoCharacterWebcomicPanel) panels.append(twoCharacterWebcomicPanel)
elif element_line.is_pure_text_line: elif element_line.is_pure_text_line:
panels.append(TitleCardWebcomicPanel(element_line.text)) panels.append(TitleCardWebcomicPanel(element_line.text))
image = create_webcomic(panels) image = create_webcomic(panels)
if image != None: if image != None:
print(f"[{eligible_comment['id']}] posting...")
image = add_watermark(image, eligible_comment['author']['username']) image = add_watermark(image, eligible_comment['author']['username'])
user_id = eligible_comment['author']['id'] user_id = eligible_comment['author']['id']
parent_comment_id = eligible_comment['id'] parent_comment_id = eligible_comment['id']
post_id = eligible_comment['post_id'] post_id = eligible_comment['post_id']
automeme_comment_id = comment_with_image("yo got a meme for ya nigga", image, eligible_comment['id'], eligible_comment['post_id']) message = create_comment_message(is_chudded, is_pizzad, is_birdsite, is_marseyed)
if not DRY_MODE:
automeme_comment_id = comment_with_image(message, image, eligible_comment['id'], eligible_comment['post_id'])
else:
automeme_comment_id = None
image.save(f"dry/{eligible_comment['id']}.webp")
Comment.create_new_comment(parent_comment_id, automeme_comment_id, session) Comment.create_new_comment(parent_comment_id, automeme_comment_id, session)
Post.increment_replies(post_id, session) Post.increment_replies(post_id, session)
User.increase_number_of_comments(user_id, session) User.increase_number_of_comments(user_id, session)
end = datetime.now() end = datetime.now()
print(end-begin) print(end-begin)
else:
Comment.create_new_comment(eligible_comment['id'], None, session)
if __name__ == "__main__": if __name__ == "__main__":
TEST_AUTH_TOKEN = "ED3eURMKP9FKBFbi-JUxo8MPGWkEihuyIlAUGtVL7xwx0NEy4Nf6J_mxWYTPgAQx1iy1X91hx7PPHyEBS79hvKVIy5DMEzOyAe9PAc5pmqSJlLGq_-ROewMwFzGrqer4" TEST_AUTH_TOKEN = "ED3eURMKP9FKBFbi-JUxo8MPGWkEihuyIlAUGtVL7xwx0NEy4Nf6J_mxWYTPgAQx1iy1X91hx7PPHyEBS79hvKVIy5DMEzOyAe9PAc5pmqSJlLGq_-ROewMwFzGrqer4"

View File

@ -297,7 +297,7 @@ def add_text(base : Image, caption : str, region_size : tuple[int, int], coordin
def add_watermark(image : Image, name_of_other_creator): def add_watermark(image : Image, name_of_other_creator):
global watermark_captions global watermark_captions
WATERMARK_HEIGHT = 30 WATERMARK_HEIGHT = int(0.05 * image.height)
image_size_x, image_size_y = image.size image_size_x, image_size_y = image.size
base = AnimatedImage.new(size=(image_size_x, image_size_y + WATERMARK_HEIGHT)) base = AnimatedImage.new(size=(image_size_x, image_size_y + WATERMARK_HEIGHT))
base = base.paste(image, (0,0)) base = base.paste(image, (0,0))
@ -382,6 +382,14 @@ class AnimatedImage():
def size(self) -> Tuple[int, int]: def size(self) -> Tuple[int, int]:
return self.frames[0].size return self.frames[0].size
@property
def height(self) -> int:
return self.frames[0].size[1]
@property
def width(self) -> int:
return self.frames[0].size[0]
def flip(self) -> 'AnimatedImage': def flip(self) -> 'AnimatedImage':
new_frames = [] new_frames = []
for frame in self.frames: for frame in self.frames:
@ -492,5 +500,5 @@ def get_leftover_primes(a_, b_):
#create_modern_meme_from_url("https://media.giphy.com/media/gYkga3bZav66I/giphy.webp", "me when i see a black person (i am extremely racist)").save("racism.webp") #create_modern_meme_from_url("https://media.giphy.com/media/gYkga3bZav66I/giphy.webp", "me when i see a black person (i am extremely racist)").save("racism.webp")
#create_classic_meme_from_url("https://rdrama.net/assets/images/rDrama/sidebar/98.webp", "in all seriousness it probably isn't worth the effort because this is just one of many ways they could goad the bot into saying something innapropriate. Like who cares lol its just one of many things they could say.", "also there isn't really any specific harm done to anyone by a bot saying pedophile nonsense, it's offensive at worst and funny at best. i laughed at least. also also this legit is something that only happens every 2500 comments or so (there was another comment a while back where bbbb said something similar)").save("bruh.webp") #create_classic_meme_from_url("https://rdrama.net/assets/images/rDrama/sidebar/98.webp", "in all seriousness it probably isn't worth the effort because this is just one of many ways they could goad the bot into saying something innapropriate. Like who cares lol its just one of many things they could say.", "also there isn't really any specific harm done to anyone by a bot saying pedophile nonsense, it's offensive at worst and funny at best. i laughed at least. also also this legit is something that only happens every 2500 comments or so (there was another comment a while back where bbbb said something similar)").save("bruh.webp")
#create_modern_meme_from_url("https://cdn.discordapp.com/attachments/1007776259910152292/1007833711540174885/unknown.png", "and then heymoon says the imposter is among us").save("modern_image.webp") #create_modern_meme_from_url("https://cdn.discordapp.com/attachments/1007776259910152292/1007833711540174885/unknown.png", "and then heymoon says the imposter is among us").save("modern_image.webp")
#create_classic_meme_from_emoji("marseydeterminedgun", "I WANT TO PUT MY DICK", "INSIDE OF MARSEY").save("classic_with_emoji.webp") #create_classic_meme_from_emoji("marseycock", "I WANT TO PUT MY DICK", "INSIDE OF MARSEY").save("classic_with_emoji.webp")
#create_modern_meme_from_emoji("rdramajanny", "youll be sorry when i get my mop you BITCH").save("modern_emoji.webp") #create_modern_meme_from_emoji("rdramajanny", "youll be sorry when i get my mop you BITCH").save("modern_emoji.webp")