def test_no_library(self): for extension in ["7z", "zip"]: errors, warnings, _, curation_type, _, _ = validate_curation( f"test_curations/test_curation_none_library.{extension}") self.assertCountEqual(errors, []) self.assertCountEqual(warnings, []) self.assertEqual(curation_type, CurationType.FLASH_GAME)
def test_trailing_language_semicolon(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_languages_semicolon.{extension}" ) self.assertCountEqual(errors, []) self.assertCountEqual(warnings, [])
def test_desktop_ini(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_desktop_ini.{extension}") self.assertCountEqual( errors, ["desktop.ini file found in curation, please remove."]) self.assertCountEqual(warnings, [])
def test_valid_yaml_meta_extreme(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme = validate_curation( f"test_curations/test_curation_valid_extreme.{extension}") self.assertCountEqual(errors, []) self.assertCountEqual(warnings, []) self.assertTrue(is_extreme)
def test_missing_tags(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_missing_tags.{extension}") self.assertCountEqual( errors, ["Missing tags. At least one tag must be specified."]) self.assertCountEqual(warnings, [])
def test_valid_legacy_genre(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme = validate_curation( f"test_curations/test_curation_valid_legacy_genre.{extension}") self.assertCountEqual(errors, []) self.assertCountEqual(warnings, []) self.assertFalse(is_extreme)
def test_empty_content(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_empty_content.{extension}") self.assertCountEqual(errors, ["No files found in content folder."]) self.assertCountEqual(warnings, [])
def test_curation_too_large(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_2GB.{extension}") self.assertCountEqual(errors, []) self.assertCountEqual(warnings, [ "The archive is too large to be validated (`2000MB/1000MB`)." ])
def test_comma_in_languages(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_comma_in_languages.{extension}") self.assertCountEqual( errors, ["Languages should be separated with semicolons, not commas."]) self.assertCountEqual(warnings, [])
def test_curation_capital_extension_logo(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme, _, _, _ = validate_curation( f"test_curations/test_curation_capital_extension_logo.{extension}" ) self.assertCountEqual(errors, ["Logo file extension must be lowercase."]) self.assertCountEqual(warnings, [])
def test_invalid_yaml_meta_extreme(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme, _, _, _ = validate_curation( f"test_curations/test_curation_invalid_extreme.{extension}") self.assertCountEqual( errors, ["Curation is extreme but lacks extreme tags."]) self.assertCountEqual(warnings, []) self.assertTrue(is_extreme)
def test_valid_date(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_invalid_date.{extension}") self.assertCountEqual( errors, ["Invalid release date. Ensure entered date is valid."]) self.assertCountEqual(warnings, [])
def test_language_name(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_language_name.{extension}") self.assertCountEqual(errors, [ "Languages must be in ISO 639-1 format, so please use `ja` instead of `Japanese`" ]) self.assertCountEqual(warnings, [])
def test_curation_capital_extension_screenshot(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme = validate_curation( f"test_curations/test_curation_capital_extension_screenshot.{extension}" ) self.assertCountEqual( errors, ["Screenshot file extension must be lowercase."]) self.assertCountEqual(warnings, [])
def test_curation_null_languages(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_nul_languages.{extension}") self.assertCountEqual( errors, ["The `Languages` property in the meta file is mandatory."]) self.assertCountEqual(warnings, [])
def test_missing_status(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_missing_status.{extension}") self.assertCountEqual( errors, ["The `Status` property in the meta file is mandatory."]) self.assertCountEqual(warnings, [])
def test_curation_invalid_archive(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme = validate_curation( f"test_curations/test_curation_invalid_archive.{extension}") self.assertCountEqual( errors, [f"There seems to a problem with your {extension} file."]) self.assertCountEqual(warnings, [])
def test_missing_ss(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_missing_ss.{extension}") self.assertCountEqual(errors, [ "Screenshot file is either missing or its filename is incorrect." ]) self.assertCountEqual(warnings, [])
def test_missing_meta(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_missing_meta.{extension}") self.assertCountEqual(errors, [ "Meta file is either missing or its filename is incorrect. Are you using Flashpoint Core for curating?" ]) self.assertCountEqual(warnings, [])
def test_curation_duplicate_launch_command(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme = validate_curation( f"test_curations/test_curation_duplicate_launch_command.{extension}" ) self.assertCountEqual(errors, [ "Identical launch command already present in the master database. Is your curation a duplicate?" ]) self.assertCountEqual(warnings, [])
def test_common_bad_language(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_common_bad_language.{extension}" ) self.assertCountEqual(errors, [ "The correct ISO 639-1 language code for Japanese is `ja`, not `jp`." ]) self.assertCountEqual(warnings, [])
def test_localflash_no_folder(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_localflash_no_folder.{extension}" ) self.assertCountEqual(errors, [ "Content must be in additional folder in localflash rather than in localflash directly." ]) self.assertCountEqual(warnings, [])
def test_missing_application_path_warning(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_missing_application_path.{extension}" ) self.assertCountEqual(errors, [ "The `Application Path` property in the meta file is mandatory." ]) self.assertCountEqual(warnings, [])
def test_localflash_bad_name(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_localflash_bad_name.{extension}" ) self.assertCountEqual(errors, [ "Extremely common localflash containing folder name, please change." ]) self.assertCountEqual(warnings, [])
def test_unknown_tag_warning(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_unknown_tag.{extension}") self.assertCountEqual(errors, []) self.assertCountEqual(warnings, [ "Tag `Unknown Tag` is not a known tag, please verify (did you write it correctly?).", "Tag `Another Unknown Tag` is not a known tag, please verify (did you write it correctly?)." ])
def test_missing_root_folder(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_missing_root_folder.{extension}" ) self.assertCountEqual(errors, [ "Logo, screenshot, content folder and meta not found. Is your curation structured properly?" ]) self.assertCountEqual(warnings, [])
def test_missing_launch_command(self): for extension in ["7z", "zip"]: errors, warnings, _, _, _, _ = validate_curation( f"test_curations/test_curation_missing_launch_command.{extension}" ) self.assertCountEqual(errors, [ "The `Launch Command` property in the meta file is mandatory." ]) self.assertCountEqual(warnings, [])
def test_curation_empty_meta(self): for extension in ["7z", "zip"]: errors, warnings, is_extreme = validate_curation( f"test_curations/test_curation_empty_meta.{extension}") self.assertCountEqual(errors, ["The meta file seems to be empty."]) self.assertCountEqual(warnings, [])
async def check_curation_in_message(message: discord.Message, dry_run: bool = True): if len(message.attachments ) != 1: # TODO can we have more than one attachment? return is_flash_game = message.channel.id == FLASH_GAMES_CHANNEL is_other_game = message.channel.id == OTHER_GAMES_CHANNEL is_animation = message.channel.id == ANIMATIONS_CHANNEL is_audition = message.channel.id == AUDITIONS_CHANNEL # TODO disable # is_curator_lounge = message.channel.id == CURATOR_LOUNGE_CHANNEL if not (is_flash_game or is_other_game or is_animation or is_audition): # or is_curator_lounge): return attachment = message.attachments[0] archive_filename: str = attachment.filename if not (archive_filename.endswith('.7z') or archive_filename.endswith('.zip') or archive_filename.endswith('.rar')): return l.debug( f"detected message '{message.id}' from user '{message.author}' in channel '{message.channel}' with attachment '{archive_filename}'" ) l.debug( f"downloading attachment '{attachment.id}' - '{archive_filename}'...") await attachment.save(archive_filename) try: curation_errors, curation_warnings, is_extreme = validate_curation( archive_filename) except Exception as e: l.exception(e) l.debug(f"removing archive {archive_filename}...") os.remove(archive_filename) if not dry_run: l.debug(f"adding 💥 reaction to message '{message.id}'") await message.add_reaction('💥') reply_channel: discord.TextChannel = bot.get_channel( BOT_TESTING_CHANNEL) await reply_channel.send( f"<@{GOD_USER}> the curation validator has thrown an exception:\n" f"🔗 {message.jump_url}\n" f"```{traceback.format_exc()}```") return # archive cleanup l.debug(f"removing archive {archive_filename}...") os.remove(archive_filename) # format reply final_reply: str = "" if len(curation_errors) > 0: final_reply += message.author.mention + f" Your curation is invalid:\n" \ f"🔗 {message.jump_url}\n" if len(curation_errors) == 0 and len(curation_warnings) > 0: final_reply += message.author.mention + f" Your curation might have some problems:\n" \ f"🔗 {message.jump_url}\n" if len(curation_errors) > 0: if not dry_run: l.debug(f"adding 🚫 reaction to message '{message.id}'") await message.add_reaction('🚫') for curation_error in curation_errors: final_reply += f"🚫 {curation_error}\n" # TODO tag warnings changed to errors this way because i'm lazy for now if len(curation_warnings) > 0: if not dry_run: l.debug(f"adding 🚫 reaction to message '{message.id}'") await message.add_reaction('🚫') for curation_warning in curation_warnings: final_reply += f"🚫 {curation_warning}\n" if len(final_reply) > 0: # TODO tag warnings changed to errors this way because i'm lazy for now # if len(curation_errors) == 0 and len(curation_warnings) > 0: # final_reply += "⚠️ If the problems detected are valid and you're going to upload a fixed version, " \ # "please remove the original curation submission after you upload the new one." reply_channel: discord.TextChannel = bot.get_channel( BOT_ALERTS_CHANNEL) if is_extreme: reply_channel = bot.get_channel(NSFW_LOUNGE_CHANNEL) elif is_flash_game or is_other_game or is_animation: reply_channel = bot.get_channel(BOT_ALERTS_CHANNEL) elif is_audition: reply_channel = bot.get_channel(AUDITION_CHAT_CHANNEL) if not dry_run: l.info(f"sending reply to message '{message.id}' : '" + final_reply.replace('\n', ' ') + "'") await reply_channel.send(final_reply) else: l.info(f"NOT SENDING reply to message '{message.id}' : '" + final_reply.replace('\n', ' ') + "'") else: if not dry_run: l.debug(f"adding 🤖 reaction to message '{message.id}'") await message.add_reaction('🤖') l.info( f"curation in message '{message.id}' validated and is OK - {message.jump_url}" )
def test_missing_content(self): for extension in ["7z", "zip"]: errors, warnings, _ = validate_curation( f"test_curations/test_curation_missing_content.{extension}") self.assertCountEqual(errors, ["Content folder not found."]) self.assertCountEqual(warnings, [])