File size: 8,915 Bytes
1cbc430
62d9953
b002286
 
c3b4392
b002286
 
67daa79
b002286
1cbc430
2fc8036
b002286
 
 
 
 
8e64093
 
fa04dc3
62d9953
b002286
 
 
 
62d9953
b002286
 
 
62d9953
 
fa04dc3
 
 
62d9953
 
 
 
 
 
fa04dc3
 
0e42816
b002286
67daa79
1cbc430
b002286
 
 
 
 
a6269a8
b002286
 
a6269a8
1cbc430
 
b002286
dc41ab1
67daa79
b002286
dfdebb3
67daa79
b002286
67daa79
 
1cbc430
 
 
d9f4368
c3b4392
1cbc430
d9f4368
 
1cbc430
c3b4392
 
 
768892d
c3b4392
768892d
c3b4392
768892d
c3b4392
231a179
c3b4392
 
 
b002286
9cab3bd
 
 
5be98cf
9cab3bd
5be98cf
9cab3bd
5be98cf
9cab3bd
5be98cf
9cab3bd
5be98cf
9cab3bd
 
 
b002286
c3b4392
 
b002286
d9f4368
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b002286
d9f4368
8e64093
 
67daa79
1cbc430
dfdebb3
62d9953
1cbc430
 
b002286
1cbc430
67daa79
1cbc430
c3b4392
1cbc430
 
 
d9f4368
 
 
 
 
1cbc430
 
c3b4392
d9f4368
 
 
b002286
d9f4368
 
 
 
 
 
 
5341b2a
62d9953
 
fa04dc3
62d9953
 
d9f4368
 
5341b2a
 
d9f4368
 
 
 
 
5341b2a
 
d9f4368
 
 
 
8e64093
 
b002286
2fc8036
dfdebb3
b002286
dfdebb3
b002286
 
 
 
2fc8036
 
b002286
 
 
 
c6c04b2
 
b002286
 
 
 
c6c04b2
 
 
 
 
 
 
 
 
 
 
 
b002286
 
 
c6c04b2
 
b002286
67daa79
b002286
8e64093
f26f9dc
653eedb
f26f9dc
 
 
b002286
dfdebb3
 
 
 
1cbc430
b002286
 
 
1cbc430
67daa79
1cbc430
facee4e
8e64093
c3b4392
facee4e
b002286
 
 
8e64093
1cbc430
 
 
b7d0333
c3b4392
 
 
b002286
1cbc430
fec5a2d
1cbc430
 
b002286
4ce98fd
d76971a
98572d5
d76971a
98572d5
3a13e4a
 
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
import os
from pyrogram import enums
from datetime import datetime
from traceback import format_exc
from Powers.bot_class import Gojo
from pyrogram.types import Message
from Powers.utils.chat_type import c_type
from Powers.database.users_db import Users
from Powers.database.antispam_db import GBan
from Powers.utils.custom_filters import command
from Powers.utils.extract_user import extract_user
from Powers import (
    LOGGER, DEV_USERS, SUDO_USERS, SUPPORT_STAFF, WHITELIST_USERS)


gban_db = GBan()


async def count(c: Gojo, chat):
    administrator = []
    async for admin in c.get_chat_members(
        chat_id=chat, filter=enums.ChatMembersFilter.ADMINISTRATORS
    ):
        total_admin = administrator.append(admin)
    bot = []
    async for tbot in c.get_chat_members(
        chat_id=chat, filter=enums.ChatMembersFilter.BOTS
    ):
        total_bot = bot.append(tbot)
    bot_admin = 0
    ban = []
    async for banned in c.get_chat_members(chat, filter=enums.ChatMembersFilter.BANNED):
        total_banned = ban.append(banned)
    for x in total_admin:
        for y in total_bot:
            if x == y:
                bot_admin += 1
    total_admin = len(total_admin)
    total_bot = len(total_bot)
    total_banned = len(total_banned)
    return total_bot, total_admin, bot_admin, total_banned


async def user_info(c: Gojo, user, already=False):
    if not already:
        # try:
        # user = Users.get_user_info(int(user))  # Try to fetch user info form database if available give key error if user is not present
        #  user = user["_id"]
        #  user = await c.get_users(user_ids=user)
        #  except KeyError:
        #    LOGGER.warning(f"Calling api to fetch info about user {user}")
        # user = await c.get_users(user_ids=user) # Fetch user info in
        # traditional way if not available in db
        user = await c.get_users(user_ids=user)
    if not user.first_name:
        return ["Deleted account", None]

    gbanned, reason_gban = gban_db.get_gban(user)
    if gbanned:
        gban = True
        reason = f"The user is gbanned because {reason_gban}"
    else:
        gban = False
        reason = "User is not gbanned"

    user_id = user.id
    username = user.username
    first_name = user.first_name
    last_name = user.last_name
    mention = user.mention(f"{first_name}")
    dc_id = user.dc_id
    is_verified = user.is_verified
    is_restricted = user.is_restricted
    photo_id = user.photo.big_file_id if user.photo else None
    is_support = user_id in SUPPORT_STAFF
    if user_id in SUPPORT_STAFF:
        if user_id in DEV_USERS:
            omp = "User is dev"
        elif user_id in SUDO_USERS:
            omp = "User is sudoer"
        elif user_id in WHITELIST_USERS:
            omp = "User is in whitelist"
        else:
            omp = "Hmmm.......Who is that again?"
    is_bot = user.is_bot
    is_fake = user.is_fake
    status = user.status

    if is_bot is True:
        last_date = "Targeted user is a bot"
    elif status == "recently":
        last_date = "Last seen Recently"
    elif status == "within_week":
        last_date = "Last seen within the last week"
    elif status == "within_month":
        last_date = "Last seen within the last month"
    elif status == "long_time_ago":
        last_date = "Last seen a long time ago or may be I am blocked by the user  :("
    elif status == "online":
        last_date = "User is currently Online"
    elif status == "offline":
        last_date = datetime.fromtimestamp(user.status.date).strftime(
            "%a, %d %b %Y, %H:%M:%S"
        )
    else:
        last_date = "User is currently online"

    caption = f"""
<b><i><u>⚑ Extracted User info From Telegram ⚑</b></i></u>

<b>πŸ†”οΈ User ID</b>: <code>{user_id}</code>
<b>πŸ“Ž Link To Profile</b>: <a href='tg://user?id={user_id}'>Click HereπŸšͺ</a>
<b>πŸ—£οΈ Mention</b>: {mention}
<b>πŸ—£οΈ First Name</b>: <code>{first_name}</code>
<b>πŸ—£οΈ Second Name</b>: <code>{last_name}</code>
<b>πŸ” Username</b>: {("@" + username) if username else "NA"}
<b>πŸ₯Έ Support</b>: {is_support}
<b>πŸ€“ Support user type</b>: <code>{omp}</code>
<b>πŸ’£ Gbanned</b>: {gban}
<b>🀭 Gban reason</b>: <code>{reason}</code>
<b>🌐 DC ID</b>: {dc_id}
<b>🧐 RESTRICTED</b>: {is_restricted}
<b>βœ… VERIFIED</b>: {is_verified}
<b>🧐 FAKE</b> : {is_fake}
<b>πŸ€– BOT</b>: {is_bot}
<b>πŸ‘€ Last seen</b>: <code>{last_date}</code>

"""

    return caption, photo_id


async def chat_info(c: Gojo, chat, already=False):
    if not already:
        chat = await c.get_chat(chat)
    online_mem = c.get_chat_online_count(chat)
    chat_id = chat.id
    username = chat.username
    total_bot, total_admin, total_bot_admin, total_banned = await count(c, chat)
    title = chat.title
    type_ = c_type(c, chat_id=chat)
    is_scam = chat.is_scam
    is_fake = chat.is_fake
    description = chat.description
    members = chat.members_count
    is_restricted = chat.is_restricted
    if is_restricted:
        reasons = chat.restrictions
    else:
        reasons = "Chat is not restricted..."
    invite_link = chat.invite_link
    dc_id = chat.dc_id
    photo_id = chat.photo.big_file_id if chat.photo else None
    can_save = chat.has_protected_content
    sticker_set = chat.sticker_set_name
    linked_chat = chat.linked_chat
    reactions = chat.available_reactions

    caption = f"""
πŸ”° <b>CHAT INFO</b> πŸ”°

<b>πŸ†” ID</b>: <code>{chat_id}</code>
<b>πŸš€ Chat Title</b>: {title}
<b>✨ Chat Type</b>: {type_}
<b>🌐 DataCentre ID</b>: {dc_id}
<b>πŸ” Username</b>: {("@" + username) if username else "NA"}
<b>⚜️ Administrators</b>: {total_admin}
<b>πŸ€– Bots</b>: {total_bot}
<b>🚫 Banned</b>: {total_banned}
<b>⚜️ Admin πŸ€– Bots</b>: {total_bot_admin}
<b>πŸ‘¨β€πŸ’» Currently online</b>: {online_mem}
<b>🧐 Scam</b>: {is_scam}
<b>🀨 Fake</b>: {is_fake}
<b>🧐 Restricted</b>: {is_restricted}
<b>🀭 Reasons</b>: {reasons}
<b>πŸ‘¨πŸΏβ€πŸ’» Description: <code>{description}</code>
<b>πŸ‘ͺ Total members</b>: {members}
<b>πŸ“Ž Link to the chat</b>: <a href={invite_link}>Click HereπŸšͺ</a>
<b>🚫 Can Save Content</b>: {can_save}
<b>πŸ˜‹ Sticker set</b>: {sticker_set}
<b>πŸ”— Linked Chat</b>: {linked_chat if linked_chat else "Not Linked"}
<b>πŸ”₯ Reactions</b>: {reactions}

"""

    return caption, photo_id


@Gojo.on_message(command(["info", "whois"]))
async def info_func(c: Gojo, message: Message):
    try:
        user, _, _ = await extract_user(c, message)
    except Exception as e:
        return await message.reply_text(
            f"Got an error while running extract_user function error is {e}.....Give this message in supoort group"
        )

    if not user:
        message.reply_text("Can't find user to fetch info!")

    m = await message.reply_text(
        f"Fetching user info of user {message.from_user.id}..."
    )

    try:
        info_caption, photo_id = await user_info(c, user=user)
        LOGGER.info(
            f"{message.from_user.id} tried to fetch user info of user {message.from_user.id} in {message.chat.id}"
        )
    except Exception as e:
        LOGGER.error(e)
        LOGGER.error(format_exc())
        return await m.edit(str(e))

    if not photo_id:
        return await m.edit(info_caption, disable_web_page_preview=True)
    photo = await Gojo.download_media(photo_id)

    await message.reply_photo(photo, caption=info_caption, quote=False)
    await m.delete()
    os.remove(photo)
    LOGGER.info(
        f"{message.from_user.id} fetched user info of user {user.username} in {m.chat.id}"
    )


@Gojo.on_message(command(["chinfo", "chatinfo", "chat_info"]))
async def chat_info_func(c: Gojo, message: Message):
    splited = message.text.split()
    try:
        if len(splited) == 1:
            chat = message.chat.id

        else:
            chat = splited[1]

        try:
            chat = int(chat)
        except ValueError:
            return await message.reply_text("**Usage:**/chinfo [USERNAME|ID]")

        m = await message.reply_text(
            f"Fetching chat info of chat **{message.chat.title}**....."
        )

        info_caption, photo_id = await chat_info(c, chat=chat)
        if not photo_id:
            return await m.edit(info_caption, disable_web_page_preview=True)

        photo = await Gojo.download_media(photo_id)
        await message.reply_photo(photo, caption=info_caption, quote=False)
        LOGGER.info(
            f"{message.from_user.id} fetched chat info of chat {chat} in {message.chat.id}"
        )

        await m.delete()
        os.remove(photo)
    except Exception as e:
        await message.reply_text(text=e)
        LOGGER.error(e)
        LOGGER.error(format_exc())


__PLUGIN__ = "info"
__alt_name__ = [
    "info",
    "chinfo",
]

__HELP__ = """
***Information***

* /info - To get info about the user
* /chinfo - To get info about the chat
"""