nsfw.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. from wbb import app, arq, IMGBB_API_KEY, MESSAGE_DUMP_CHAT
  2. from wbb.utils.filter_groups import nsfw_detect_group
  3. from wbb.utils.dbfunctions import is_nsfw_on, nsfw_on, nsfw_off
  4. from wbb.modules.admin import member_permissions
  5. from wbb.core.decorators.errors import capture_err
  6. from pyrogram import filters
  7. from random import randint
  8. import aiohttp
  9. import aiofiles
  10. import os
  11. __MODULE__ = "NSFW"
  12. __HELP__ = """
  13. /nsfw_scan - Manually Scan An Image/Sticker/Document.
  14. /anti_nsfw [ENABLE | DISABLE] - Turn This Module On/Off
  15. """
  16. def calculate_horny(hentai_value, neutral_value, porn_value, sexy_value):
  17. weight_hentai = 0.18
  18. weight_neutral = 0.32
  19. weight_sexy = 0.22
  20. weight_porn = 0.28
  21. prominent = max (hentai_value, porn_value, sexy_value)
  22. if neutral < prominent:
  23. factor_calculation = weight_hentai * hentai_value - weight_neutral * neutral_value + weight_sexy * sexy_value + weight_porn * porn_value
  24. horny_factor = ((1 - factor_calculation/prominent) * 100)
  25. return horny_factor
  26. else:
  27. return -1 * neutral_value
  28. @app.on_message((filters.document | filters.photo | filters.sticker) & ~filters.private, group=nsfw_detect_group)
  29. @capture_err
  30. async def detect_nsfw(_, message):
  31. if message.document:
  32. if int(message.document.file_size) > 3145728:
  33. return
  34. mime_type = message.document.mime_type
  35. if mime_type != "image/png" and mime_type != "image/jpeg":
  36. return
  37. if not await is_nsfw_on(message.chat.id):
  38. return
  39. image = await message.download(f"{randint(6666, 9999)}.jpg")
  40. async with aiofiles.open(image, mode='rb') as f:
  41. payload = {
  42. "key": IMGBB_API_KEY,
  43. "image": await f.read(),
  44. "expiration": "60"
  45. }
  46. async with aiohttp.ClientSession() as session:
  47. async with session.post("https://api.imgbb.com/1/upload", data=payload) as resp:
  48. data = await resp.json()
  49. try:
  50. url = data['data']['url']
  51. except KeyError:
  52. return
  53. os.remove(image)
  54. try:
  55. results = await arq.nsfw_scan(url)
  56. except Exception as e:
  57. print(e)
  58. return
  59. hentai = results.data.hentai
  60. sexy = results.data.sexy
  61. porn = results.data.porn
  62. drawings = results.data.drawings
  63. neutral = results.data.neutral
  64. hornyfactor = calculate_horny(hentai,neutral,porn,sexy)
  65. if hornyfactor >= 70:
  66. pass
  67. elif hornyfactor >= 50:
  68. # The reason its like this is because later on the plan is to
  69. # Allow the moderator to decide the maximum allowed nsfw content
  70. pass
  71. elif hornyfactor >= 30:
  72. # This should be okay but still returning True
  73. # For now only strict checking is implemented
  74. pass
  75. else:
  76. return
  77. user_mention = message.from_user.mention
  78. user_id = message.from_user.id
  79. m = await message.forward(MESSAGE_DUMP_CHAT)
  80. try:
  81. await message.delete()
  82. except Exception:
  83. pass
  84. await message.reply_text(f"""
  85. **NSFW [Image]({m.link}) Detected & Deleted Successfully!
  86. ————————————————————————**
  87. **User:** {user_mention} [`{user_id}`]
  88. **Safe:** `{neutral} %`
  89. **Porn:** `{porn} %`
  90. **Adult:** `{sexy} %`
  91. **Hentai:** `{hentai} %`
  92. **Drawings:** `{drawings} %`
  93. **————————————————————————**
  94. __Use '/anti_nsfw disable' to disable this.__
  95. """)
  96. @app.on_message(filters.command("nsfw_scan"))
  97. @capture_err
  98. async def nsfw_scan_command(_, message):
  99. if not message.reply_to_message:
  100. await message.reply_text("Reply to an image or document to scan it.")
  101. return
  102. reply = message.reply_to_message
  103. if not reply.document and not reply.photo and not reply.sticker:
  104. await message.reply_text("Reply to an image/document/sticker to scan it.")
  105. return
  106. if message.reply_to_message.document:
  107. if int(message.reply_to_message.document.file_size) > 3145728:
  108. return
  109. mime_type = message.reply_to_message.document.mime_type
  110. if mime_type != "image/png" and mime_type != "image/jpeg":
  111. return
  112. m = await message.reply_text("Scanning")
  113. image = await message.reply_to_message.download(f"{randint(6666, 9999)}.jpg")
  114. async with aiofiles.open(image, mode='rb') as f:
  115. payload = {
  116. "key": IMGBB_API_KEY,
  117. "image": await f.read(),
  118. "expiration": "60"
  119. }
  120. async with aiohttp.ClientSession() as session:
  121. async with session.post("https://api.imgbb.com/1/upload", data=payload) as resp:
  122. data = await resp.json()
  123. try:
  124. url = data['data']['url']
  125. except KeyError:
  126. await m.edit("Failed to upload this to api server.")
  127. os.remove(image)
  128. try:
  129. results = await arq.nsfw_scan(url)
  130. except Exception as e:
  131. print(e)
  132. await m.edit(str(e))
  133. return
  134. hentai = results.data.hentai
  135. sexy = results.data.sexy
  136. porn = results.data.porn
  137. drawings = results.data.drawings
  138. neutral = results.data.neutral
  139. await m.edit(f"""
  140. **Neutral:** `{neutral} %`
  141. **Porn:** `{porn} %`
  142. **Hentai:** `{hentai} %`
  143. **Sexy:** `{sexy} %`
  144. **Drawings:** `{drawings} %`
  145. """)
  146. @app.on_message(filters.command("anti_nsfw") & ~filters.private)
  147. @capture_err
  148. async def nsfw_enable_disable(_, message):
  149. if len(message.command) != 2:
  150. await message.reply_text("Usage: /anti_nsfw [enable | disable]")
  151. return
  152. status = message.text.split(None, 1)[1].strip()
  153. status = status.lower()
  154. chat_id = message.chat.id
  155. user_id = message.from_user.id
  156. permissions = await member_permissions(chat_id, user_id)
  157. if "can_change_info" not in permissions:
  158. await message.reply_text("You don't have enough permissions.")
  159. return
  160. if status == "enable":
  161. await nsfw_on(chat_id)
  162. await message.reply_text("Enabled AntiNSFW System. I will Delete Messages Containing Inappropriate Content.")
  163. elif status == "disable":
  164. await nsfw_off(chat_id)
  165. await message.reply_text("Disabled AntiNSFW System.")
  166. else:
  167. await message.reply_text("Unknown Suffix, Use /anti_nsfw [enable|disable]")