nsfw.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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. @app.on_message((filters.document | filters.photo | filters.sticker) & ~filters.private, group=nsfw_detect_group)
  17. @capture_err
  18. async def detect_nsfw(_, message):
  19. if message.document:
  20. if int(message.document.file_size) > 3145728:
  21. return
  22. mime_type = message.document.mime_type
  23. if mime_type != "image/png" and mime_type != "image/jpeg":
  24. return
  25. if not await is_nsfw_on(message.chat.id):
  26. return
  27. image = await message.download(f"{randint(6666, 9999)}.jpg")
  28. async with aiofiles.open(image, mode='rb') as f:
  29. payload = {
  30. "key": IMGBB_API_KEY,
  31. "image": await f.read(),
  32. "expiration": "60"
  33. }
  34. async with aiohttp.ClientSession() as session:
  35. async with session.post("https://api.imgbb.com/1/upload", data=payload) as resp:
  36. data = await resp.json()
  37. url = data['data']['url']
  38. os.remove(image)
  39. try:
  40. results = await arq.nsfw_scan(url)
  41. except Exception as e:
  42. print(e)
  43. return
  44. hentai = results.data.hentai
  45. sexy = results.data.sexy
  46. porn = results.data.porn
  47. drawings = results.data.drawings
  48. neutral = results.data.neutral
  49. if neutral > 80:
  50. return
  51. if (hentai + porn + sexy) < 85:
  52. return
  53. if neutral > 20:
  54. return
  55. user_mention = message.from_user.mention
  56. user_id = message.from_user.id
  57. m = await message.forward(MESSAGE_DUMP_CHAT)
  58. try:
  59. await message.delete()
  60. except Exception:
  61. pass
  62. await message.reply_text(f"""
  63. **NSFW [Image]({m.link}) Detected & Deleted Successfully!
  64. ————————————————————————**
  65. **User:** {user_mention} [`{user_id}`]
  66. **Safe:** `{neutral} %`
  67. **Porn:** `{porn} %`
  68. **Adult:** `{sexy} %`
  69. **Hentai:** `{hentai} %`
  70. **Drawings:** `{drawings} %`
  71. **————————————————————————**
  72. __Use '/anti_nsfw disable' to disable this.__
  73. """)
  74. @app.on_message(filters.command("nsfw_scan"))
  75. @capture_err
  76. async def nsfw_scan_command(_, message):
  77. if not message.reply_to_message:
  78. await message.reply_text("Reply to an image or document to scan it.")
  79. return
  80. reply = message.reply_to_message
  81. if not reply.document and not reply.photo and not reply.sticker:
  82. await message.reply_text("Reply to an image/document/sticker to scan it.")
  83. return
  84. if message.reply_to_message.document:
  85. if int(message.reply_to_message.document.file_size) > 3145728:
  86. return
  87. mime_type = message.reply_to_message.document.mime_type
  88. if mime_type != "image/png" and mime_type != "image/jpeg":
  89. return
  90. m = await message.reply_text("Scanning")
  91. image = await message.reply_to_message.download(f"{randint(6666, 9999)}.jpg")
  92. async with aiofiles.open(image, mode='rb') as f:
  93. payload = {
  94. "key": IMGBB_API_KEY,
  95. "image": await f.read(),
  96. "expiration": "60"
  97. }
  98. async with aiohttp.ClientSession() as session:
  99. async with session.post("https://api.imgbb.com/1/upload", data=payload) as resp:
  100. data = await resp.json()
  101. url = data['data']['url']
  102. os.remove(image)
  103. try:
  104. results = await arq.nsfw_scan(url)
  105. except Exception as e:
  106. print(e)
  107. await m.edit(str(e))
  108. return
  109. hentai = results.data.hentai
  110. sexy = results.data.sexy
  111. porn = results.data.porn
  112. drawings = results.data.drawings
  113. neutral = results.data.neutral
  114. await m.edit(f"""
  115. **Neutral:** `{neutral} %`
  116. **Porn:** `{porn} %`
  117. **Hentai:** `{hentai} %`
  118. **Sexy:** `{sexy} %`
  119. **Drawings:** `{drawings} %`
  120. """)
  121. @app.on_message(filters.command("anti_nsfw") & ~filters.private)
  122. @capture_err
  123. async def nsfw_enable_disable(_, message):
  124. if len(message.command) != 2:
  125. await message.reply_text("Usage: /anti_nsfw [enable | disable]")
  126. return
  127. status = message.text.split(None, 1)[1].strip()
  128. status = status.lower()
  129. chat_id = message.chat.id
  130. user_id = message.from_user.id
  131. permissions = await member_permissions(chat_id, user_id)
  132. if "can_change_info" not in permissions:
  133. await message.reply_text("You don't have enough permissions.")
  134. return
  135. if status == "enable":
  136. await nsfw_on(chat_id)
  137. await message.reply_text("Enabled AntiNSFW System. I will Delete Messages Containing Inappropriate Content.")
  138. elif status == "disable":
  139. await nsfw_off(chat_id)
  140. await message.reply_text("Disabled AntiNSFW System.")
  141. else:
  142. await message.reply_text("Unknown Suffix, Use /anti_nsfw [enable|disable]")