File size: 7,925 Bytes
07091ae
11ae35a
ca4eb6d
f0f9ad9
11ae35a
 
 
 
 
83fe5dc
cddafb3
11ae35a
ca4eb6d
 
87abec5
11ae35a
 
83fe5dc
ca4eb6d
11ae35a
 
ca4eb6d
 
 
 
6cef7ec
ca4eb6d
 
 
c15d499
ca4eb6d
 
 
 
 
 
 
 
 
 
 
87abec5
ca4eb6d
 
 
 
 
 
 
 
 
 
 
 
 
07091ae
 
 
 
 
 
 
 
 
 
ca4eb6d
07091ae
 
 
 
 
 
 
 
 
 
 
ca4eb6d
07091ae
 
ca4eb6d
07091ae
ca4eb6d
 
07091ae
 
 
 
 
ca4eb6d
07091ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca4eb6d
07091ae
ca4eb6d
 
f64c3e7
 
ca4eb6d
 
07091ae
6cef7ec
83fe5dc
07091ae
 
 
ca4eb6d
07091ae
 
 
 
ca4eb6d
07091ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6cef7ec
07091ae
 
 
 
 
ca4eb6d
07091ae
ca4eb6d
 
 
f192ee1
ca4eb6d
 
6cef7ec
ca4eb6d
 
 
 
 
 
 
 
 
 
 
 
 
c15d499
af1662b
ca4eb6d
6dcea66
ca4eb6d
 
6cef7ec
 
ca4eb6d
 
 
11170eb
 
af1662b
ca4eb6d
0fa46d3
aef1161
ca4eb6d
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
from datetime import datetime, timedelta
from re import escape as re_escape
from time import time
from traceback import format_exc

from pyrogram import filters
from pyrogram.errors import ChatAdminRequired, RPCError, UserAdminInvalid
from pyrogram.types import ChatPermissions, Message

from Powers import LOGGER, MESSAGE_DUMP
from Powers.bot_class import Gojo
from Powers.database.antispam_db import ANTISPAM_BANNED, GBan
from Powers.database.approve_db import Approve
from Powers.database.blacklist_db import Blacklist
from Powers.database.group_blacklist import BLACKLIST_CHATS
from Powers.database.pins_db import Pins
from Powers.database.warns_db import Warns, WarnSettings
from Powers.supports import get_support_staff
from Powers.utils.caching import ADMIN_CACHE, admin_cache_reload
from Powers.utils.parser import mention_html
from Powers.utils.regex_utils import regex_searcher

# Initialise
gban_db = GBan()


@Gojo.on_message(filters.linked_channel)
async def antichanpin_cleanlinked(c: Gojo, m: Message):
    try:
        msg_id = m.id
        pins_db = Pins(m.chat.id)
        curr = pins_db.get_settings()
        if curr["antichannelpin"]:
            await c.unpin_chat_message(chat_id=m.chat.id, message_id=msg_id)
        if curr["cleanlinked"]:
            await c.delete_messages(m.chat.id, msg_id)
    except ChatAdminRequired:
        await m.reply_text(
            "Disabled antichannelpin as I don't have enough admin rights!",
        )
        pins_db.antichannelpin_off()
        LOGGER.warning(f"Disabled antichannelpin in {m.chat.id} as i'm not an admin.")
    except Exception as ef:
        LOGGER.error(ef)
        LOGGER.error(format_exc())

    return


@Gojo.on_message(filters.text & filters.group, group=5)
async def bl_watcher(_, m: Message):
    if m and not m.from_user:
        return

    bl_db = Blacklist(m.chat.id)
    try:
        async def perform_action_blacklist(m: Message, action: str, trigger: str):
            if action == "kick":
                tim = datetime.now() + timedelta(minutes=45)
                await m.chat.ban_member(m.from_user.id, tim)
                await m.reply_text(
                    text="Kicked {user} for sending a blacklisted word!".format(
                        user=m.from_user.username or f"<b>{m.from_user.first_name}</b>",
                    ),
                )

            elif action == "ban":
                (
                    await m.chat.ban_member(
                        m.from_user.id,
                    )
                )
                await m.reply_text(
                    text="Banned {user} for sending a blacklisted word!".format(
                        user=m.from_user.username or f"<b>{m.from_user.first_name}</b>",
                    ),
                )

            elif action == "mute":
                await m.chat.restrict_member(
                    m.from_user.id,
                    ChatPermissions(),
                )

                await m.reply_text(
                    text="Muted {user} for sending a blacklisted word!".format(
                        user=m.from_user.username or f"<b>{m.from_user.first_name}</b>",
                    ),
                )

            elif action == "warn":
                warns_settings_db = WarnSettings(m.chat.id)
                warns_db = Warns(m.chat.id)
                warn_settings = warns_settings_db.get_warnings_settings()
                warn_reason = bl_db.get_reason()
                _, num = warns_db.warn_user(m.from_user.id, warn_reason)
                if num >= warn_settings["warn_limit"]:
                    if warn_settings["warn_mode"] == "kick":
                        await m.chat.ban_member(
                            m.from_user.id,
                            until_date=int(time() + 45),
                        )
                        action = "kicked"
                    elif warn_settings["warn_mode"] == "ban":
                        await m.chat.ban_member(m.from_user.id)
                        action = "banned"
                    elif warn_settings["warn_mode"] == "mute":
                        await m.chat.restrict_member(m.from_user.id, ChatPermissions())
                        action = "muted"
                    await m.reply_text(
                        (
                            f"Warnings {num}/{warn_settings['warn_limit']}\n"
                            f"{(await mention_html(m.from_user.first_name, m.from_user.id))} has been <b>{action}!</b>"
                        ),
                    )
                    return
                await m.reply_text(
                    (
                        f"{(await mention_html(m.from_user.first_name, m.from_user.id))} warned {num}/{warn_settings['warn_limit']}\n" +
                       "Last warn was for:\n<i>{}</i>".format(warn_reason.format(trigger))
                    ),
                )
            return

        SUPPORT_STAFF = get_support_staff()
        if m.from_user.id in SUPPORT_STAFF:
            # Don't work on Support Staff!
            return

        # If no blacklists, then return
        chat_blacklists = bl_db.get_blacklists()
        if not chat_blacklists:
            return

        # Get admins from admin_cache, reduces api calls
        try:
            admin_ids = {i[0] for i in ADMIN_CACHE[m.chat.id]}
        except KeyError:
            admin_ids = await admin_cache_reload(m, "blacklist_watcher")

        if m.from_user.id in admin_ids:
            return

        # Get approved user from cache/database
        app_users = Approve(m.chat.id).list_approved()
        if m.from_user.id in {i[0] for i in app_users}:
            return

        # Get action for blacklist
        action = bl_db.get_action()
        for trigger in chat_blacklists:
            pattern = r"( |^|[^\w])" + re_escape(trigger) + r"( |$|[^\w])"
            match = await regex_searcher(pattern, m.text.lower())
            if not match:
                continue
            if match:
                try:
                    await perform_action_blacklist(m, action, trigger)

                    await m.delete()
                except RPCError as ef:
                    LOGGER.error(ef)
                    LOGGER.error(format_exc())
                break
        return
    except Exception:
        return


@Gojo.on_message(filters.user(list(ANTISPAM_BANNED)) & filters.group, 5)
async def gban_watcher(c: Gojo, m: Message):
    from Powers import SUPPORT_GROUP

    if m and not m.from_user:
        return

    try:
        _banned = gban_db.check_gban(m.from_user.id)
    except Exception as ef:
        LOGGER.error(ef)
        LOGGER.error(format_exc())
        return

    if _banned:
        try:
            await m.chat.ban_member(m.from_user.id)
            await m.delete(m.id)  # Delete users message!
            user_gbanned = await mention_html(m.from_user.first_name, m.from_user.id)
            await m.reply_text(
                text=f"This user ({user_gbanned}) has been banned globally!\n\nTo get unbanned, appeal at @{SUPPORT_GROUP}")
            return
        except (ChatAdminRequired, UserAdminInvalid):
            pass  # For now just ignore the user in future will let the admins know once or after few times think abt it later

        except RPCError as ef:
            await c.send_message(
                MESSAGE_DUMP,
                text=f"""<b>Gban Watcher Error!</b>
        <b>Chat:</b> <code>{m.chat.id}</code>
        <b>Error:</b> <code>{ef}</code>""",
            )


@Gojo.on_message(filters.chat(BLACKLIST_CHATS))
async def bl_chats_watcher(c: Gojo, m: Message):
    from Powers import SUPPORT_GROUP

    await c.send_message(
        m.chat.id,
        (
            "This is a blacklisted group!\n"
            f"For Support, Join @{SUPPORT_GROUP}\n"
            "Now, I'm outta here!"
        ),
    )
    await c.leave_chat(m.chat.id)
    return