File size: 6,535 Bytes
518de8c
 
818420a
 
 
 
 
 
 
83fe5dc
818420a
 
83fe5dc
818420a
 
 
 
 
 
 
 
 
 
 
 
bb1bfd1
518de8c
 
 
 
 
 
 
 
 
818420a
 
 
 
89ad488
 
 
 
 
 
 
 
 
 
 
818420a
89ad488
6cef7ec
 
 
 
818420a
 
 
 
 
 
 
89ad488
818420a
 
89ad488
818420a
 
 
 
6cef7ec
818420a
 
6cef7ec
818420a
 
89ad488
 
818420a
 
 
 
 
 
 
 
 
83fe5dc
bb1bfd1
818420a
 
 
518de8c
6cef7ec
982e098
 
518de8c
6cef7ec
 
518de8c
 
982e098
818420a
 
982e098
818420a
 
6cef7ec
818420a
6cef7ec
818420a
 
6cef7ec
 
818420a
 
6cef7ec
818420a
 
6cef7ec
818420a
6cef7ec
818420a
518de8c
982e098
 
 
 
 
 
 
 
89ad488
982e098
818420a
 
 
 
 
982e098
 
89ad488
982e098
818420a
518de8c
6cef7ec
 
982e098
518de8c
6cef7ec
 
518de8c
 
89ad488
818420a
518de8c
6cef7ec
518de8c
982e098
518de8c
6cef7ec
 
518de8c
 
818420a
 
 
6cef7ec
818420a
 
 
 
 
 
 
 
 
 
6cef7ec
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
from traceback import format_exc

from pyrogram import filters
from pyrogram.enums import ChatMemberStatus as CMS
from pyrogram.types import CallbackQuery, ChatJoinRequest
from pyrogram.types import InlineKeyboardButton as ikb
from pyrogram.types import InlineKeyboardMarkup as ikm
from pyrogram.types import Message

from Powers import LOGGER
from Powers.bot_class import Gojo
from Powers.database.autojoin_db import AUTOJOIN
from Powers.supports import get_support_staff
from Powers.utils.custom_filters import admin_filter, auto_join_filter, command


@Gojo.on_message(command(["joinreq"]) & admin_filter)
async def accept_join_requests(c: Gojo, m: Message):
    if m.chat.id == m.from_user.id:
        await m.reply_text("Use it in groups")
        return

    split = m.command
    a_j = AUTOJOIN()

    try:
        status = (await m.chat.get_member(c.me.id)).status
        if status != CMS.ADMINISTRATOR:
            await m.reply_text("I should be admin to accept and reject join requests")
            return
    except Exception as ef:
        await m.reply_text(f"Some error occured, report it using `/bug`\n<b>Error:</b> <code>{ef}</code>")
        LOGGER.error(ef)
        LOGGER.error(format_exc())
        return
    if len(split) == 1:
        txt = "**USAGE**\n/joinreq [on | off]"
    else:
        yes_no = split[1].lower()
        if yes_no == "on":
            is_al = a_j.load_autojoin(m.chat.id)

            txt = (
                "Now I will approve all the join request of the chat\nIf you want that I will just notify admins about the join request use command\n/joinreqmode [manual | auto]"
                if is_al
                else "Auto approve join request is already on for this chat\nIf you want that I will just notify admins about the join request use command\n/joinreqmode [manual | auto]"
            )
        elif yes_no == "off":
            a_j.remove_autojoin(m.chat.id)
            txt = "Now I will neither auto approve join request nor notify any admins about it"
        else:
            txt = "**USAGE**\n/joinreq [on | off]"

    await m.reply_text(txt)
    return


@Gojo.on_message(command("joinreqmode") & admin_filter)
async def join_request_mode(c: Gojo, m: Message):
    if m.chat.id == m.from_user.id:
        await m.reply_text("Use it in groups")
        return
    u_text = "**USAGE**\n/joinreqmode [auto | manual]\nauto: auto approve joins\nmanual: will notify admin about the join request"

    split = m.command
    a_j = AUTOJOIN()

    if len(split) == 1:
        await m.reply_text(u_text)
    else:
        auto_manual = split[1]
        if auto_manual not in ["auto", "manual"]:
            await m.reply_text(u_text)
        else:
            a_j.update_join_type(m.chat.id, auto_manual)
            txt = "Changed join request type"
            await m.reply_text(txt)

    return


@Gojo.on_chat_join_request(auto_join_filter)
async def join_request_handler(c: Gojo, j: ChatJoinRequest):
    user = j.from_user.id
    userr = j.from_user
    chat = j.chat.id
    aj = AUTOJOIN()
    join_type = aj.get_autojoin(chat)
    SUPPORT_STAFF = get_support_staff()

    if not join_type:
        return
    if join_type == "auto" or user in SUPPORT_STAFF:
        try:
            await c.approve_chat_join_request(chat, user)
            await c.send_message(chat, f"Accepted join request of the {userr.mention}")
            return
        except Exception as ef:
            await c.send_message(chat,
                                 f"Some error occured while approving request, report it using `/bug`\n<b>Error:</b> <code>{ef}</code>")
            LOGGER.error(ef)
            LOGGER.error(format_exc())
            return
    elif join_type == "manual":
        txt = "New join request is available\n**USER's INFO**\n"
        txt += f"Name: {userr.full_name}"
        txt += f"Mention: {userr.mention}"
        txt += f"Id: {user}"
        txt += f"Scam: {'True' if userr.is_scam else 'False'}"
        if userr.username:
            txt += f"Username: @{userr.username}"
        kb = [
            [
                ikb("Accept", f"accept_joinreq_uest_{user}"),
                ikb("Decline", f"decline_joinreq_uest_{user}")
            ]
        ]
        await c.send_message(chat, txt, reply_markup=ikm(kb))
        return


@Gojo.on_callback_query(filters.regex("^accept_joinreq_uest_") | filters.regex("^decline_joinreq_uest_"))
async def accept_decline_request(c: Gojo, q: CallbackQuery):
    user_id = q.from_user.id
    chat = q.message.chat.id
    try:
        user_status = (await q.message.chat.get_member(user_id)).status
        if user_status not in {CMS.OWNER, CMS.ADMINISTRATOR}:
            await q.answer(
                "You're not even an admin, don't try this explosive shit!",
                show_alert=True,
            )
            return
    except Exception:
        await q.answer("Unknow error occured. You are not admin or owner")
        return
    split = q.data.split("_")
    chat = q.message.chat.id
    user = int(split[-1])
    data = split[0]
    try:
        userr = await c.get_users(user)
    except Exception:
        userr = None
    if data == "accept":
        try:
            await c.approve_chat_join_request(chat, user)
            await q.answer(f"Accepted join request of the {userr.mention if userr else user}", True)
            await q.edit_message_text(f"Accepted join request of the {userr.mention if userr else user}")
        except Exception as ef:
            await c.send_message(chat,
                                 f"Some error occured while approving request, report it using `/bug`\n<b>Error:</b> <code>{ef}</code>")
            LOGGER.error(ef)
            LOGGER.error(format_exc())

    elif data == "decline":
        try:
            await c.decline_chat_join_request(chat, user)
            await q.answer(f"DECLINED: {user}")
            await q.edit_message_text()
        except Exception as ef:
            await c.send_message(chat,
                                 f"Some error occured while approving request, report it using `/bug`\n<b>Error:</b> <code>{ef}</code>")
            LOGGER.error(ef)
            LOGGER.error(format_exc())

    return


__PLUGIN__ = "auto join"

__alt_name__ = ["join_request"]

__HELP__ = """
**Auto join request**

**Admin commands:**
• /joinreq [on | off]: To switch on auto accept join request 
• /joinreqmode [auto | manual]: `auto` to accept join request automatically and `manual` to get notified when new join request is available
"""