File size: 7,604 Bytes
1cbc430
facee4e
9cab3bd
8e64093
1cbc430
8e64093
facee4e
c3b4392
67daa79
 
1cbc430
2fc8036
84e9122
8e64093
67daa79
8e64093
0e42816
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67daa79
1cbc430
67daa79
 
 
 
1cbc430
 
67daa79
 
 
 
 
 
 
 
1cbc430
 
 
c3b4392
1cbc430
 
c3b4392
 
 
768892d
c3b4392
768892d
c3b4392
768892d
c3b4392
231a179
c3b4392
 
9cab3bd
c3b4392
9cab3bd
 
 
 
 
5be98cf
9cab3bd
5be98cf
9cab3bd
5be98cf
9cab3bd
5be98cf
9cab3bd
5be98cf
9cab3bd
 
 
 
c3b4392
 
9cab3bd
1cbc430
 
 
 
c3b4392
1cbc430
c3b4392
 
 
67daa79
 
c3b4392
 
1cbc430
0e42816
1cbc430
8e64093
 
67daa79
1cbc430
c3b4392
1cbc430
 
 
67daa79
1cbc430
c3b4392
1cbc430
 
 
c3b4392
1cbc430
 
c3b4392
1cbc430
 
 
 
 
c3b4392
1cbc430
 
 
c3b4392
 
1cbc430
 
 
0e42816
1cbc430
8e64093
 
8827622
2fc8036
 
 
 
 
768892d
f26f9dc
c6c04b2
653eedb
 
 
 
 
 
 
2fc8036
 
 
 
653eedb
c6c04b2
 
67daa79
653eedb
c6c04b2
 
 
 
 
 
 
 
 
 
 
 
653eedb
c6c04b2
 
c3b4392
8827622
67daa79
f26f9dc
8e64093
f26f9dc
653eedb
f26f9dc
 
8e64093
2fc8036
1cbc430
f26f9dc
 
 
 
1cbc430
7a22bcc
1cbc430
67daa79
1cbc430
facee4e
8e64093
c3b4392
facee4e
653eedb
8e64093
1cbc430
 
 
 
c3b4392
 
 
1cbc430
fec5a2d
1cbc430
 
8e64093
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
import os
from traceback import format_exc
from datetime import datetime

from pyrogram.types import Message

from Powers import DEV_USERS, SUDO_USERS, WHITELIST_USERS, SUPPORT_STAFF, LOGGER
from Powers.bot_class import Gojo
from Powers.database.antispam_db import GBan
from Powers.database.users_db import Users
from Powers.utils.custom_filters import command
from Powers.utils.extract_user import extract_user
from Powers.utils.chat_type import c_type

gban_db=GBan()

escape = "\n"
empty = " "

bold = lambda x: f"**{x}:** "
bold_ul = lambda x: f"**--{x}:**-- "

single_func = lambda x: f"`{x}`{escape}"


def change(
        title: str,
        body: dict,
        indent: int = 2,
        underline: bool = False,
) -> str:
    text = (bold_ul(title) + escape) if underline else bold(title) + escape

    for key, value in body.items():
        text += (
                indent * empty
                + bold(key)
                + ((value[0] + escape) if isinstance(value, list) else single_func(value))
        )
    return text


async def user_info(c: Gojo, user, already=False):
    if not already:
        try:
            user = Users.get_user_info(int(user_id))  # Try to fetch user info form database if available give key error if user is not present
        except KeyError:
            user = await Gojo.get_users(user_ids=user) # Fetch user info in traditional way if not available in db
    if not user.first_name:
        return ["Deleted account", None]
    gbanned, reason_gban = gban_db.get_gban(user_id)
    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
    mention = user.mention(f"{first_name}")
    dc_id = user.dc_id
    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"
        
    body = {
        "ID": user_id,
        "DC": dc_id,
        "Name": [first_name],
        "Username": [("@" + username) if username else None],
        "Mention": [mention],
        "Support": is_support,
        "Support user type": [omp],
        "Bot" : is_bot,
        "Gbanned": gban,
        "Gban reason":[reason],
        "Fake" : is_fake,
        "Last seen" : [last_date],
    }
    caption = change("User info", body)
    return [caption, photo_id]


async def chat_info(c: Gojo, chat, already=False):
    if not already:
        chat = await Gojo.get_chat(chat)
    chat_id = chat.id
    username = chat.username
    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
    link = f"[Link](t.me/{username})" if username else None
    dc_id = chat.dc_id
    photo_id = chat.photo.big_file_id if chat.photo else None
    can_save = chat.has_protected_content
    body = {
        "ID": chat_id,
        "DC": dc_id,
        "Type": type_,
        "Name": [title],
        "Username": [("@" + username) if username else None],
        "Mention": [link],
        "Members": members,
        "Scam": is_scam,
        "Fake" : is_fake,
        "Can save content" : can_save,
        "Restricted": is_restricted,
        "Description": [description],
    }
    caption = change("Chat info", body)
    return [caption, photo_id]


@Gojo.on_message(command(["info","whois"]))
async def info_func(c: Gojo, message: Message):
    if len(message.text.split()) == 1 and not message.reply_to_message:
        await message.reply_text(text="I can't info fecth of nothing!")
        await message.stop_propagation()
    elif len(message.text.split()) > 2 and not message.reply_to_message:
        await message.reply_text("You are not providing proper arguments.......**Usage:**/info [USERNAME|ID]....Example /info @iamgojoof6eyes")
        await message.stop_propagation()

    if m.reply_to_message and not m.reply_to_message.from_user:
        user = message.reply_to_message.from_user.id
    else:
        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 {user.username}...")

    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 {user.username} in {m.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

        elif len(splited) > 2:
            return await message.reply_text(
                "**Usage:**/chinfo [USERNAME|ID]"
            )
        
        else:
            chat = splited[1]
        

        m = await message.reply_text(f"Fetching chat info of chat **{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.title} in {m.chat.id}")

        await m.delete()
        os.remove(photo)
    except Exception as e:
        await m.edit(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
"""