Rest Commit AUgs 2023

This commit is contained in:
yasir 2023-08-03 11:01:15 +07:00
commit e960a69126
204 changed files with 21042 additions and 0 deletions

13
.deepsource.toml Normal file
View file

@ -0,0 +1,13 @@
version = 1
[[analyzers]]
name = "python"
[analyzers.meta]
runtime_version = "3.x.x"
[[transformers]]
name = "isort"
[[transformers]]
name = "black"

4
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,4 @@
# These are supported funding model platforms
github: [yasirarism] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
other: ['https://yasirpedia.eu.org/images/my-qris.jpg', 'https://paypal.me/yasirarism'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

36
.github/workflows/h3r0ku.yml vendored Normal file
View file

@ -0,0 +1,36 @@
name: H3r0ku Deployer
on: workflow_dispatch
env:
IMAGE_NAME: h3r0ku
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
HEROKU_APP: ${{ secrets.HEROKU_APP }}
jobs:
build_and_push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build the image
run: docker build . --file Dockerfile --tag "${IMAGE_NAME}"
- name: Login into Heroku Container registry
run: heroku container:login
- name: Push the image to Heroku
run: heroku container:push "${IMAGE_NAME}" -a "${HEROKU_APP}"
- name: Release image to Heroku
run: heroku container:release "${IMAGE_NAME}" -a "${HEROKU_APP}"
- name: Check ENV
run: |
API_KEY="$(heroku config:get HEROKU_API_KEY -a ${HEROKU_APP})"
APP_NAME="$(heroku config:get HEROKU_APP -a ${HEROKU_APP})"
if [[ -z "${API_KEY}" && -z "${APP_NAME}" ]]; then
heroku config:set HEROKU_API_KEY="${HEROKU_API_KEY}" \
HEROKU_APP="${HEROKU_APP}"
fi

26
.github/workflows/notify.yml vendored Normal file
View file

@ -0,0 +1,26 @@
name: Notify on Telegram
on:
fork:
push:
release:
issue_comment:
types: created
watch:
types: started
pull_request_review_comment:
types: created
pull_request:
types: [opened, closed, reopened]
issues:
types: [opened, pinned, closed, reopened]
jobs:
notify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Notify the commit on Telegram.
uses: EverythingSuckz/github-telegram-notify@main
with:
bot_token: '${{ secrets.BOT_TOKEN }}'
chat_id: '${{ secrets.CHAT_ID }}'

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
.vscode
__pycache__

19
Dockerfile Normal file
View file

@ -0,0 +1,19 @@
# * @author Yasir Aris M <yasiramunandar@gmail.com>
# * @date 2022-12-01 09:12:27
# * @projectName MissKatyPyro
# * Copyright ©YasirPedia All rights reserved
# Base Docker Using Debian 12 (Bookworm), Python 3.11.4 and Built In Pip
## With Built in Pip Package
FROM yasirarism/misskaty-docker:latest
## Without Built in Pip Package
# FROM yasirarism/misskaty-docker:free
# Set Hostname
ENV HOSTNAME yasir-server
# Copy Files
COPY . .
# Instal pip package
# RUN pip3 install --no-cache-dir -r requirements.txt
# Set CMD Bot
CMD ["bash", "start.sh"]

339
LICENSE Normal file
View file

@ -0,0 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

194
README.id.md Normal file
View file

@ -0,0 +1,194 @@
# MissKatyPyro
<!--Badges-->
![MIT License][license-shield] ![Repository Size][repository-size-shield] ![Issue Closed][issue-closed-shield]
<!--Project Title Image-->
<p align="center">
<img src="https://repository-images.githubusercontent.com/433350689/26cb713b-43c3-4dec-94cb-6c80599547e8" width="200" height="200"/>
</p>
<!--Project Buttons-->
[![Readme in Indonesian][readme-ko-shield]][readme-ko-url] [![View Demo][view-demo-shield]][view-demo-url] [![Report bug][report-bug-shield]][report-bug-url] [![Request feature][request-feature-shield]][request-feature-url]
<!--Table of Contents-->
# Table of Contents
- [[1] About MissKaty](#1-about-misskaty)
- [[2] Framework Tools And Server That Used To Build This Bot](#2-framework-tools-and-server-that-used-to-build-this-bot)
- [[3] Donation](#3-donation)
- [[4] Notes](#4-notes)
- [[5] Features](#5-features)
- [[6] Variables](#6-variables)
- [[7] Deploying Tutorial](#7-deploy-recommended-using-dockerdocker-compose)
- [Build And Run Using Legacy Method](#build-and-run-using-legacy-method)
- [Build And Run Using Docker](#build-and-run-using-docker)
- [Build And Run The Docker Image Using docker-compose](#build-and-run-the-docker-image-using-docker-compose)
- [[8] Credits](#8-thanks-to)
- [[9] Disclaimer](#8-disclaimer)
# [1] About MissKaty
*MissKaty* adalah Bot Telegram yang dibuat menggunakan Python dan library Pyrogram. Banyak fitur yang berguna untuk kita gunakan. Saya berharap suatu saat jika project ini dihentikan, ada yang melanjutkan atau mengembangkannya lagi. Saya memberi nama MissKaty karena saya suka kucing, hewan lucu yang suka bermain dan bersahabat dengan manusia.
## [2] Framework Tools And Server That Used To Build This Bot
🌱 PyroFork v2.x.x (Fork Pyrogram dengan Dukungan Topik dan Beberapa Patch)<br>
🌱 Dukungan Python 3.11<br>
🌱 MongoDB sebagai Database<br>
🌱 PyKeyboard for Building Pagination<br>
🌱 VS Code<br>
🌱 VPS/Server With Docker Support (Recommended)<br>
## [3] Donation
*Khusus Indonesia Saja:*<br>
🌱 [QRIS][qris-url]<br>
*Untuk Semua Negara:*<br>
🌱 [Paypal][paypal-url]<br>
## [4] Notes
Jika Anda ingin membantu saya memperbaiki beberapa kesalahan di bot saya, Anda dapat membuat PR ke repo ini. Saya sangat senang jika Anda dapat membantu saya. Anda juga dapat memberikan dukungan kepada saya untuk membeli server.
## [5] Features
| FEATURE MY BOT |🌱|
| ------------- | ------------- |
| Basic Admin Feature |✔️|
| AFK Feature |✔️|
| Downloader FB, TikTok and YT-DLP Support |✔️|
| MultiLanguage Support (Still Beta) |⚠️|
| NightMode |✔️|
| ChatBot based on OpenAI |✔️|
| MissKaty Mata |✔️|
| Inline Search |✔️|
| Sticker Tools |✔️|
| PasteBin Tools |✔️|
| WebScraper (Pahe, MelongMovie, LK21, Terbit21, Kusonime, etc) |✔️|
| IMDB Search With Multi Language Per User |✔️|
| GenSS From Media and MediaInfo Generator |✔️|
| And Many More.. |✔️|
## [6] Variables
### Variabel yang Diperlukan
* `BOT_TOKEN`: Buat bot menggunakan [@BotFather](https://t.me/BotFather), dan dapatkan token Telegram API.
* `API_ID`: Dapatkan value ini dari [telegram.org](https://my.telegram.org/apps)
* `API_HASH`: Dapatkan value ini dari [telegram.org](https://my.telegram.org/apps)
* `DATABASE_URI`: [mongoDB](https://www.mongodb.com) URI. Dapatkan value ini dari [mongoDB](https://www.mongodb.com). Untuk bantuan lebih lanjut, tonton [video] ini(https://youtu.be/1G1XwEOnxxo)
* `LOG_CHANNEL` : Channel untuk mencatat aktivitas bot. Pastikan bot adalah admin di channel.
### Variabel Opsional
* `USER_SESSION` : String session untuk Userbot.
* `DATABASE_NAME`: Nama database di MongoDB
* `COMMAND_HANDLER`: Daftar perintah handler bot dipisahkan dengan spasi. Contoh: `. !` > jadi bot akan merespon dengan `.cmd` atau `!cmd`
* `SUDO`: User ID yang memiliki akses ke bot, dipisahkan dengan spasi
* `OPENAI_API`: Dapatkan dari Web OpenAI
* `CURRENCY_API`: Dapatkan API Key di https://app.exchangerate-api.com/sign-up
## [7] Tutorial Deploy (Recommended using Docker/Docker Compose)
#### Bangun Dan Jalankan Menggunakan Metode Lama
- Pastikan versi python minimum adalah 3.8 untuk mencegah beberapa error. Periksa dengan perintah ini:
```
python3 --version
```
- Instal semua dependensi yang membutuhkan bot untuk dijalankan. *(memerlukan akses root, Anda dapat melewati ini jika server Anda tidak memiliki akses root tetapi beberapa plugin tidak berfungsi)*
```
apt update -y & apt install libjpeg-dev zlib1g-dev libwebp-dev python3-pip python3-lxml git wget curl lokal ffmpeg tzdata neofetch mediainfo speedtest-cli -y
```
- Instal requirements.txt, jika menggunakan python 3.11, Anda harus menggunakan opsi venv saat menginstal.<br/>
*Python < 3.10*
```
pip3 install -r requirements.txt
```
*Python 3.11*
```
Install venv dari terminal server kamu
pip3 install -r requirements.txt
```
- Atur config environment saat menjalankan bot dan jangan lupa isi semua value yang wajib di isi.
- Jalankan Bot
```
bash start.sh
```
#### Build And Run Using Docker
- Mulai daemon Docker (Lewati jika sudah berjalan):
```
sudo dockerd
```
- Build Docker image:
```
sudo docker build . -t misskaty
```
- Jalankan Docker image:
```
sudo docker run misskaty
```
- Untuk Menghentikan image:
```
sudo docker ps
sudo docker stop <pid>
```
#### Build And Run The Docker Image Using docker-compose
- Install docker-compose
```
sudo apt install docker-compose
```
- Build and run Docker image or to view current running image:
```
sudo docker-compose up
```
- After editing files with nano for example (nano start.sh):
```
sudo docker-compose up --build
```
- To stop the running image:
```
sudo docker ps
```
```
sudo docker-compose stop <pid>
```
----
## [8] Thanks to
- Terima kasih Kepada Allah Swt.
- Terima kasih Kepada Dan [Pyrogram Library](https://github.com/pyrogram/pyrogram).
- Terima kasih Kepada [The Hamker Cat](https://github.com/TheHamkerCat) Untuk Kode WilliamButcher.
- Terima kasih Kepada [Team Yukki](https://github.com/TeamYukki) Untuk Kode AFK Bot.
- Terima kasih Kepada [Wrench](https://github.com/EverythingSuckz) Untuk Beberapa Kode.
- Terima kasih Kepada [AmanoTeam](https://github.com/AmanoTeam) Untuk Template MultiBahasa.
- Dan Semua Orang Yang Membantuku Dalam Hidupku...
Jika kode Anda digunakan dalam repo ini dan ingin memberikan kredit, silakan buka masalah..
## [9] Disclaimer
[![GNU Affero General Public License 2.0](https://www.gnu.org/graphics/agplv3-155x51.png)](https://www.gnu.org/licenses/agpl-3.0.en.html#header)
Dilisensikan di bawah [GNU AGPL 2.0.](https://github.com/yasirarism/MissKatyPyro/blob/master/LICENSE)
PERINGATAN: Menjual Kode Kepada Orang Lain Demi Uang *Dilarang Keras*. Tuhan selalu melihatmu dimanapun kamu berada.
<!--Url for Badges-->
[license-shield]: https://img.shields.io/github/license/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=04B4AE
[repository-size-shield]: https://img.shields.io/github/repo-size/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=BE81F7
[issue-closed-shield]: https://img.shields.io/github/issues-closed/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=FE9A2E
<!--Url for Buttons-->
[readme-ko-shield]: https://img.shields.io/badge/-readme%20in%20Indonesian-2E2E2E?style=for-the-badge
[view-demo-shield]: https://img.shields.io/badge/-%F0%9F%98%8E%20view%20demo-F3F781?style=for-the-badge
[view-demo-url]: https://t.me/MissKatyPyro
[report-bug-shield]: https://img.shields.io/badge/-%F0%9F%90%9E%20report%20bug-F5A9A9?style=for-the-badge
[report-bug-url]: https://github.com/yasirarism/MissKatyPyro/issues
[request-feature-shield]: https://img.shields.io/badge/-%E2%9C%A8%20request%20feature-A9D0F5?style=for-the-badge
[request-feature-url]: https://github.com/yasirarism/MissKatyPyro/issues
<!--URLS-->
[readme-ko-url]: README.md
[kofi-url]: https://ko-fi.com/yasirarism
[paypal-url]: https://paypal.me/yasirarism
[qris-url]: https://telegra.ph/file/2acf7698f300ef3d9138f.jpg
[sociabuzz-url]: https://sociabuzz.com/yasirarism/tribe
[saweria-url]: https://saweria.co/yasirarism
[trakteer-url]: https://trakteer.id/yasir-aris-sp7cn

194
README.md Normal file
View file

@ -0,0 +1,194 @@
# MissKatyPyro
<!--Badges-->
![MIT License][license-shield] ![Repository Size][repository-size-shield] ![Issue Closed][issue-closed-shield]
<!--Project Title Image-->
<p align="center">
<img src="https://repository-images.githubusercontent.com/433350689/26cb713b-43c3-4dec-94cb-6c80599547e8" width="200" height="200"/>
</p>
<!--Project Buttons-->
[![Readme in Indonesian][readme-ko-shield]][readme-ko-url] [![View Demo][view-demo-shield]][view-demo-url] [![Report bug][report-bug-shield]][report-bug-url] [![Request feature][request-feature-shield]][request-feature-url]
<!--Table of Contents-->
# Table of Contents
- [[1] About MissKaty](#1-about-misskaty)
- [[2] Framework Tools And Server That Used To Build This Bot](#2-framework-tools-and-server-that-used-to-build-this-bot)
- [[3] Donation](#3-donation)
- [[4] Notes](#4-notes)
- [[5] Features](#5-features)
- [[6] Variables](#6-variables)
- [[7] Deploying Tutorial](#7-deploy-recommended-using-dockerdocker-compose)
- [Build And Run Using Legacy Method](#build-and-run-using-legacy-method)
- [Build And Run Using Docker](#build-and-run-using-docker)
- [Build And Run The Docker Image Using docker-compose](#build-and-run-the-docker-image-using-docker-compose)
- [[8] Credits](#8-thanks-to)
- [[9] Disclaimer](#8-disclaimer)
# [1] About MissKaty
*MissKaty* is a Telegram Bot built using Python and the Pyrogram library. Many useful features for us to use. I hope that one day this project will be discontinued, someone will continue or develop it again. I gave the name MissKaty because I like cats, a cute animal that likes to be played with and friendly with humans.
## [2] Framework Tools And Server That Used To Build This Bot
🌱 PyroFork v2.x.x (Fork of Pyrogram with Topics Support and Some Patch)<br>
🌱 Python 3.11 Support<br>
🌱 MongoDB as Database<br>
🌱 PyKeyboard for Building Pagination<br>
🌱 VS Code<br>
🌱 VPS/Server With Docker Support (Recommended)<br>
## [3] Donation and Support
*For Indonesian Only and some supported country:*<br>
🌱 [QRIS][qris-url]<br>
*For International Payment:*<br>
🌱 [Paypal][paypal-url]<br>
## [4] Notes
If you want help me fixing some error in my bot, you can make pull request to this repo. I'm very glad if you can help me. You can also give support to me for buying server.
## [5] Features
| FEATURE MY BOT |🌱|
| ------------- | ------------- |
| Basic Admin Feature |✔️|
| AFK Feature |✔️|
| Downloader FB, TikTok and YT-DLP Support |✔️|
| MultiLanguage Support (Unfinished) |⚠️|
| NightMode |✔️|
| ChatBot based on OpenAI |✔️|
| MissKaty Mata |✔️|
| Inline Search |✔️|
| Sticker Tools |✔️|
| PasteBin Tools |✔️|
| WebScraper (Pahe, MelongMovie, LK21, Terbit21, Kusonime, etc) |✔️|
| IMDB Search With Multi Language Per User |✔️|
| GenSS From Media and MediaInfo Generator |✔️|
| And Many More.. |✔️|
## [6] Variables
### Required Variables
* `BOT_TOKEN`: Create a bot using [@BotFather](https://t.me/BotFather), and get the Telegram API token.
* `API_ID`: Get this value from [telegram.org](https://my.telegram.org/apps)
* `API_HASH`: Get this value from [telegram.org](https://my.telegram.org/apps)
* `DATABASE_URI`: [mongoDB](https://www.mongodb.com) URI. Get this value from [mongoDB](https://www.mongodb.com). For more help watch this [video](https://youtu.be/1G1XwEOnxxo)
* `LOG_CHANNEL` : A channel to log the activities of bot. Make sure bot is an admin in the channel.
### Optional Variables
* `USER_SESSION` : Session string for Userbot.
* `DATABASE_NAME`: Name of the database in MongoDB
* `COMMAND_HANDLER`: List of handler bot command splitted by space. Ex: `. !` > so bot will respond with `.cmd` or `!cmd`
* `SUDO`: User ID that have access to bot, split by space
* `OPENAI_API`: Get it from OpenAI Web
* `CURRENCY_API`: Get API Key from https://app.exchangerate-api.com/sign-up
## [7] Tutorial Deploy (Recommended using Docker/Docker Compose)
#### Build And Run Using Legacy Method
- Make sure minimum python version is 3.8 to prevent some errors. Check it with this command:
```
python3 --version
```
- Install all dependency that needed bot to run. *(need root access, you can skip this if your server didn't have root access but some plugins will not work)*
```
apt update -y & apt install libjpeg-dev zlib1g-dev libwebp-dev python3-pip python3-lxml git wget curl ffmpeg locales tzdata neofetch mediainfo speedtest-cli -y
```
- Install requirements.txt, if using python 3.11, you need use venv when install pip package.<br/>
*Python < 3.10*
```
pip3 install -r requirements.txt
```
*Python 3.11*
```
Install venv from your terminal and activate it
pip3 install -r requirements.txt
```
- Setting your config.env or via environment and dont forget fill all required value.
- Run Bot
```
bash start.sh
```
#### Build And Run Using Docker
- Start Docker daemon (Skip if already running):
```
sudo dockerd
```
- Build Docker image:
```
sudo docker build . -t misskaty
```
- Run the image:
```
sudo docker run misskaty
```
- To stop the image:
```
sudo docker ps
sudo docker stop <pid>
```
#### Build And Run The Docker Image Using docker-compose
- Install docker-compose
```
sudo apt install docker-compose
```
- Build and run Docker image or to view current running image:
```
sudo docker-compose up
```
- After editing files with nano for example (nano start.sh):
```
sudo docker-compose up --build
```
- To stop the running image:
```
sudo docker ps
```
```
sudo docker-compose stop <pid>
```
----
## [8] Thanks to
- Thanks To Allah Swt.
- Thanks To Dan For His Awesome [Library](https://github.com/pyrogram/pyrogram).
- Thanks To [The Hamker Cat](https://github.com/TheHamkerCat) For WilliamButcher Code.
- Thanks To [Team Yukki](https://github.com/TeamYukki) For AFK Bot Code.
- Thanks To [Wrench](https://github.com/EverythingSuckz) For Some Code.
- Thanks To [AmanoTeam](https://github.com/AmanoTeam) For MultiLanguage Template.
- And All People Who Help Me In My Life...
If your code used in this repo and want to give credit please open issue..
## [9] Disclaimer
[![GNU Affero General Public License 2.0](https://www.gnu.org/graphics/agplv3-155x51.png)](https://www.gnu.org/licenses/agpl-3.0.en.html#header)
Licensed under [GNU AGPL 2.0.](https://github.com/yasirarism/MissKatyPyro/blob/master/LICENSE)
WARNING: Selling The Codes To Other People For Money Is *Strictly Prohibited*. God always sees you.
<!--Url for Badges-->
[license-shield]: https://img.shields.io/github/license/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=04B4AE
[repository-size-shield]: https://img.shields.io/github/repo-size/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=BE81F7
[issue-closed-shield]: https://img.shields.io/github/issues-closed/yasirarism/MissKatyPyro?labelColor=D8D8D8&color=FE9A2E
<!--Url for Buttons-->
[readme-ko-shield]: https://img.shields.io/badge/-readme%20in%20Indonesian-2E2E2E?style=for-the-badge
[view-demo-shield]: https://img.shields.io/badge/-%F0%9F%98%8E%20view%20demo-F3F781?style=for-the-badge
[view-demo-url]: https://t.me/MissKatyPyro
[report-bug-shield]: https://img.shields.io/badge/-%F0%9F%90%9E%20report%20bug-F5A9A9?style=for-the-badge
[report-bug-url]: https://github.com/yasirarism/MissKatyPyro/issues
[request-feature-shield]: https://img.shields.io/badge/-%E2%9C%A8%20request%20feature-A9D0F5?style=for-the-badge
[request-feature-url]: https://github.com/yasirarism/MissKatyPyro/issues
<!--URLS-->
[readme-ko-url]: README.id.md
[kofi-url]: https://ko-fi.com/yasirarism
[paypal-url]: https://paypal.me/yasirarism
[qris-url]: https://telegra.ph/file/9427d61d6968b8ee4fb2f.jpg
[sociabuzz-url]: https://sociabuzz.com/yasirarism/tribe
[saweria-url]: https://saweria.co/yasirarism
[trakteer-url]: https://trakteer.id/yasir-aris-sp7cn

Binary file not shown.

BIN
assets/DejaVuSans-Bold.ttf Normal file

Binary file not shown.

BIN
assets/DejaVuSans.ttf Normal file

Binary file not shown.

BIN
assets/IronFont.otf Normal file

Binary file not shown.

Binary file not shown.

BIN
assets/assfont.ttf Normal file

Binary file not shown.

BIN
assets/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
assets/kertas.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
assets/profilepic.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
assets/statsbg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
assets/thumb.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

15
config.env.sample Normal file
View file

@ -0,0 +1,15 @@
# Required Vars
API_HASH=
API_ID=
BOT_TOKEN=
DATABASE_URI=mongodb+srv://
LOG_CHANNEL=
# Optional Vars
SUDO=617426792
DATABASE_NAME=MissKatyDB
SUPPORT_CHAT=YasirPediaChannel
COMMAND_HANDLER=
USER_SESSION=
OPENAI_API=
CURRENCY_API=

12
database/__init__.py Normal file
View file

@ -0,0 +1,12 @@
"""
* @author yasir <yasiramunandar@gmail.com>
* @date 2022-09-06 10:12:09
* @projectName MissKatyPyro
* Copyright @YasirPedia All rights reserved
"""
from async_pymongo import AsyncClient
from misskaty.vars import DATABASE_NAME, DATABASE_URI
mongo = AsyncClient(DATABASE_URI)
dbname = mongo[DATABASE_NAME]

63
database/afk_db.py Normal file
View file

@ -0,0 +1,63 @@
#
# Copyright (C) 2021-2022 by TeamYukki@Github, < https://github.com/TeamYukki >.
#
# This file is part of < https://github.com/TeamYukki/YukkiAFKBot > project,
# and is released under the "GNU v3.0 License Agreement".
# Please see < https://github.com/TeamYukki/YukkiAFKBot/blob/master/LICENSE >
#
# All rights reserved.
#
from database import dbname
usersdb = dbname["users"]
cleandb = dbname["cleanmode"]
cleanmode = {}
async def is_cleanmode_on(chat_id: int) -> bool:
mode = cleanmode.get(chat_id)
if not mode:
user = await cleandb.find_one({"chat_id": chat_id})
if not user:
cleanmode[chat_id] = True
return True
cleanmode[chat_id] = False
return False
return mode
async def cleanmode_on(chat_id: int):
cleanmode[chat_id] = True
user = await cleandb.find_one({"chat_id": chat_id})
if user:
return await cleandb.delete_one({"chat_id": chat_id})
async def cleanmode_off(chat_id: int):
cleanmode[chat_id] = False
user = await cleandb.find_one({"chat_id": chat_id})
if not user:
return await cleandb.insert_one({"chat_id": chat_id})
async def is_afk(user_id: int) -> bool:
user = await usersdb.find_one({"user_id": user_id})
return (True, user["reason"]) if user else (False, {})
async def add_afk(user_id: int, mode):
await usersdb.update_one(
{"user_id": user_id}, {"$set": {"reason": mode}}, upsert=True
)
async def remove_afk(user_id: int):
user = await usersdb.find_one({"user_id": user_id})
if user:
return await usersdb.delete_one({"user_id": user_id})
async def get_afk_users() -> list:
users = usersdb.find({"user_id": {"$gt": 0}})
return list(await users.to_list(length=1000000000)) if users else []

37
database/blacklist_db.py Normal file
View file

@ -0,0 +1,37 @@
from typing import List
from database import dbname
blacklist_filtersdb = dbname["blacklistFilters"]
async def get_blacklisted_words(chat_id: int) -> List[str]:
_filters = await blacklist_filtersdb.find_one({"chat_id": chat_id})
if not _filters:
return []
return _filters["filters"]
async def save_blacklist_filter(chat_id: int, word: str):
word = word.lower().strip()
_filters = await get_blacklisted_words(chat_id)
_filters.append(word)
await blacklist_filtersdb.update_one(
{"chat_id": chat_id},
{"$set": {"filters": _filters}},
upsert=True,
)
async def delete_blacklist_filter(chat_id: int, word: str) -> bool:
filtersd = await get_blacklisted_words(chat_id)
word = word.lower().strip()
if word in filtersd:
filtersd.remove(word)
await blacklist_filtersdb.update_one(
{"chat_id": chat_id},
{"$set": {"filters": filtersd}},
upsert=True,
)
return True
return False

45
database/filters_db.py Normal file
View file

@ -0,0 +1,45 @@
from typing import Dict, List, Union
from database import dbname
filtersdb = dbname["filters"]
async def _get_filters(chat_id: int) -> Dict[str, int]:
_filters = await filtersdb.find_one({"chat_id": chat_id})
return _filters["filters"] if _filters else {}
async def delete_filter(chat_id: int, name: str) -> bool:
filtersd = await _get_filters(chat_id)
name = name.lower().strip()
if name in filtersd:
del filtersd[name]
await filtersdb.update_one(
{"chat_id": chat_id},
{"$set": {"filters": filtersd}},
upsert=True,
)
return True
return False
async def get_filter(chat_id: int, name: str) -> Union[bool, dict]:
name = name.lower().strip()
_filters = await _get_filters(chat_id)
return _filters[name] if name in _filters else False
async def get_filters_names(chat_id: int) -> List[str]:
return list(await _get_filters(chat_id))
async def save_filter(chat_id: int, name: str, _filter: dict):
name = name.lower().strip()
_filters = await _get_filters(chat_id)
_filters[name] = _filter
await filtersdb.update_one(
{"chat_id": chat_id},
{"$set": {"filters": _filters}},
upsert=True,
)

22
database/gban_db.py Normal file
View file

@ -0,0 +1,22 @@
from database import dbname
gbansdb = dbname["gban"]
async def is_gbanned_user(user_id: int) -> bool:
user = await gbansdb.find_one({"user_id": user_id})
return bool(user)
async def add_gban_user(user_id: int):
is_gbanned = await is_gbanned_user(user_id)
if is_gbanned:
return
return await gbansdb.insert_one({"user_id": user_id})
async def remove_gban_user(user_id: int):
is_gbanned = await is_gbanned_user(user_id)
if not is_gbanned:
return
return await gbansdb.delete_one({"user_id": user_id})

20
database/imdb_db.py Normal file
View file

@ -0,0 +1,20 @@
from database import dbname
imbd_db = dbname["imdb"]
async def is_imdbset(user_id: int) -> bool:
user = await imbd_db.find_one({"user_id": user_id})
return (True, user["lang"]) if user else (False, {})
async def add_imdbset(user_id: int, lang):
await imbd_db.update_one(
{"user_id": user_id}, {"$set": {"lang": lang}}, upsert=True
)
async def remove_imdbset(user_id: int):
user = await imbd_db.find_one({"user_id": user_id})
if user:
return await imbd_db.delete_one({"user_id": user_id})

67
database/karma_db.py Normal file
View file

@ -0,0 +1,67 @@
from typing import Dict, Union
from database import dbname
from misskaty.helper.functions import int_to_alpha
karmadb = dbname["karma"]
async def get_karmas_count() -> dict:
chats_count = 0
karmas_count = 0
async for chat in karmadb.find({"chat_id": {"$lt": 0}}):
for i in chat["karma"]:
karma_ = chat["karma"][i]["karma"]
if karma_ > 0:
karmas_count += karma_
chats_count += 1
return {"chats_count": chats_count, "karmas_count": karmas_count}
async def user_global_karma(user_id) -> int:
total_karma = 0
async for chat in karmadb.find({"chat_id": {"$lt": 0}}):
karma = await get_karma(chat["chat_id"], await int_to_alpha(user_id))
if karma and (int(karma["karma"]) > 0):
total_karma += int(karma["karma"])
return total_karma
async def get_karmas(chat_id: int) -> Dict[str, int]:
karma = await karmadb.find_one({"chat_id": chat_id})
return karma["karma"] if karma else {}
async def get_karma(chat_id: int, name: str) -> Union[bool, dict]:
name = name.lower().strip()
karmas = await get_karmas(chat_id)
if name in karmas:
return karmas[name]
async def update_karma(chat_id: int, name: str, karma: dict):
name = name.lower().strip()
karmas = await get_karmas(chat_id)
karmas[name] = karma
await karmadb.update_one(
{"chat_id": chat_id}, {"$set": {"karma": karmas}}, upsert=True
)
async def is_karma_on(chat_id: int) -> bool:
chat = await karmadb.find_one({"chat_id_toggle": chat_id})
return not chat
async def karma_on(chat_id: int):
is_karma = await is_karma_on(chat_id)
if is_karma:
return
return await karmadb.delete_one({"chat_id_toggle": chat_id})
async def karma_off(chat_id: int):
is_karma = await is_karma_on(chat_id)
if not is_karma:
return
return await karmadb.insert_one({"chat_id_toggle": chat_id})

22
database/locale_db.py Normal file
View file

@ -0,0 +1,22 @@
from typing import Iterable
from pyrogram.enums import ChatType
from database import dbname
localesdb = dbname["locale"] # DB for localization
group_types: Iterable[ChatType] = (ChatType.GROUP, ChatType.SUPERGROUP)
async def set_db_lang(chat_id: int, chat_type: str, lang_code: str):
await localesdb.update_one(
{"chat_id": chat_id},
{"$set": {"lang": lang_code, "chat_type": chat_type.value}},
upsert=True,
)
async def get_db_lang(chat_id: int) -> str:
ul = await localesdb.find_one({"chat_id": chat_id})
return ul["lang"] if ul else {}

44
database/notes_db.py Normal file
View file

@ -0,0 +1,44 @@
from typing import Dict, List, Union
from database import dbname
notesdb = dbname["notes"]
async def _get_notes(chat_id: int) -> Dict[str, int]:
_notes = await notesdb.find_one({"chat_id": chat_id})
return _notes["notes"] if _notes else {}
async def delete_note(chat_id: int, name: str) -> bool:
notesd = await _get_notes(chat_id)
name = name.lower().strip()
if name in notesd:
del notesd[name]
await notesdb.update_one(
{"chat_id": chat_id},
{"$set": {"notes": notesd}},
upsert=True,
)
return True
return False
async def get_note(chat_id: int, name: str) -> Union[bool, dict]:
name = name.lower().strip()
_notes = await _get_notes(chat_id)
return _notes[name] if name in _notes else False
async def get_note_names(chat_id: int) -> List[str]:
return list(await _get_notes(chat_id))
async def save_note(chat_id: int, name: str, note: dict):
name = name.lower().strip()
_notes = await _get_notes(chat_id)
_notes[name] = note
await notesdb.update_one(
{"chat_id": chat_id}, {"$set": {"notes": _notes}}, upsert=True
)

42
database/sangmata_db.py Normal file
View file

@ -0,0 +1,42 @@
from database import dbname
matadb = dbname["sangmata"]
# Get Data User
async def cek_userdata(user_id: int) -> bool:
user = await matadb.find_one({"user_id": user_id})
return bool(user)
async def get_userdata(user_id: int) -> bool:
user = await matadb.find_one({"user_id": user_id})
return user["username"], user["first_name"], user["last_name"]
async def add_userdata(user_id: int, username, first_name, last_name):
await matadb.update_one(
{"user_id": user_id},
{
"$set": {
"username": username,
"first_name": first_name,
"last_name": last_name,
}
},
upsert=True,
)
# Enable Mata MissKaty in Selected Chat
async def is_sangmata_on(chat_id: int) -> bool:
chat = await matadb.find_one({"chat_id_toggle": chat_id})
return bool(chat)
async def sangmata_on(chat_id: int) -> bool:
await matadb.insert_one({"chat_id_toggle": chat_id})
async def sangmata_off(chat_id: int):
await matadb.delete_one({"chat_id_toggle": chat_id})

112
database/users_chats_db.py Normal file
View file

@ -0,0 +1,112 @@
from async_pymongo import AsyncClient
from misskaty.vars import DATABASE_NAME, DATABASE_URI
class UsersData:
def __init__(self, uri, database_name):
self._client = AsyncClient(uri)
self.db = self._client[database_name]
self.col = self.db["users"]
self.grp = self.db["groups"]
@staticmethod
def new_user(id, name):
return dict(
id=id,
name=name,
ban_status=dict(
is_banned=False,
ban_reason="",
),
)
@staticmethod
def new_group(id, title):
return dict(
id=id,
title=title,
chat_status=dict(
is_disabled=False,
reason="",
),
)
async def add_user(self, id, name):
user = self.new_user(id, name)
await self.col.insert_one(user)
async def is_user_exist(self, id):
user = await self.col.find_one({"id": int(id)})
return bool(user)
async def total_users_count(self):
return await self.col.count_documents({})
async def remove_ban(self, id):
ban_status = dict(is_banned=False, ban_reason="")
await self.col.update_one({"id": id}, {"$set": {"ban_status": ban_status}})
async def ban_user(self, user_id, ban_reason="No Reason"):
ban_status = dict(is_banned=True, ban_reason=ban_reason)
await self.col.update_one({"id": user_id}, {"$set": {"ban_status": ban_status}})
async def get_ban_status(self, id):
default = dict(is_banned=False, ban_reason="")
user = await self.col.find_one({"id": int(id)})
return user.get("ban_status", default) if user else default
async def get_all_users(self):
return self.col.find({})
async def delete_user(self, user_id):
await self.col.delete_many({"id": int(user_id)})
async def is_chat_exist(self, id):
user = await self.grp.find_one({"id": int(id)})
return bool(user)
async def get_banned(self):
users = self.col.find({"ban_status.is_banned": True})
chats = self.grp.find({"chat_status.is_disabled": True})
b_chats = [chat["id"] async for chat in chats]
b_users = [user["id"] async for user in users]
return b_users, b_chats
async def add_chat(self, chat, title):
chat = self.new_group(chat, title)
await self.grp.insert_one(chat)
async def get_chat(self, chat):
chat = await self.grp.find_one({"id": int(chat)})
return chat.get("chat_status") if chat else False
async def re_enable_chat(self, id):
chat_status = dict(
is_disabled=False,
reason="",
)
await self.grp.update_one(
{"id": int(id)}, {"$set": {"chat_status": chat_status}}
)
async def disable_chat(self, chat, reason="No Reason"):
chat_status = dict(
is_disabled=True,
reason=reason,
)
await self.grp.update_one(
{"id": int(chat)}, {"$set": {"chat_status": chat_status}}
)
async def total_chat_count(self):
return await self.grp.count_documents({})
async def get_all_chats(self):
return self.grp.find({})
async def get_db_size(self):
return (await self.db.command("dbstats"))["dataSize"]
db = UsersData(DATABASE_URI, DATABASE_NAME)

51
database/warn_db.py Normal file
View file

@ -0,0 +1,51 @@
from typing import Dict, Union
from database import dbname
warnsdb = dbname["warn"]
async def get_warns_count() -> dict:
chats_count = 0
warns_count = 0
async for chat in warnsdb.find({"chat_id": {"$lt": 0}}):
for user in chat["warns"]:
warns_count += chat["warns"][user]["warns"]
chats_count += 1
return {"chats_count": chats_count, "warns_count": warns_count}
async def get_warns(chat_id: int) -> Dict[str, int]:
warns = await warnsdb.find_one({"chat_id": chat_id})
return warns["warns"] if warns else {}
async def get_warn(chat_id: int, name: str) -> Union[bool, dict]:
name = name.lower().strip()
warns = await get_warns(chat_id)
if name in warns:
return warns[name]
async def add_warn(chat_id: int, name: str, warn: dict):
name = name.lower().strip()
warns = await get_warns(chat_id)
warns[name] = warn
await warnsdb.update_one(
{"chat_id": chat_id}, {"$set": {"warns": warns}}, upsert=True
)
async def remove_warns(chat_id: int, name: str) -> bool:
warnsd = await get_warns(chat_id)
name = name.lower().strip()
if name in warnsd:
del warnsd[name]
await warnsdb.update_one(
{"chat_id": chat_id},
{"$set": {"warns": warnsd}},
upsert=True,
)
return True
return False

9
docker-compose.yml Normal file
View file

@ -0,0 +1,9 @@
version: "3.3"
services:
app:
build:
context: .
dockerfile: Dockerfile
command: bash start.sh
restart: on-failure

3
heroku.yml Normal file
View file

@ -0,0 +1,3 @@
build:
docker:
worker: Dockerfile

0
locales/__init__.py Normal file
View file

68
locales/en-US/admin.json Normal file
View file

@ -0,0 +1,68 @@
{
"no_admin_error": "You must be an administrator to use this command.",
"no_permission_error": "I'm sorry but you don't have the required permissions to run this command. Missing permissions: {permissions}",
"private_not_allowed": "This command can't be used in a private chat. If you need any help, please use the /help command.",
"purge_no_reply": "Reply to a message to purge from.",
"delete_no_reply": "Reply To A Message To Delete It",
"pin_no_reply": "Reply to a message to pin/unpin it.",
"report_no_reply": "Reply To A Message To Report That User.",
"no_delete_perm": "Please give me delete message permission.",
"purge_success": "Successfully deleted {del_total} messages..",
"user_not_found": "I can't find that user.",
"invalid_id_uname": "⚠️ Invalid userid/username",
"kick_self_err": "I can't kick myself, i can leave if you want.",
"ban_self_err": "I can't ban myself, i can leave if you want.",
"report_self_err": "Why are you reporting yourself ?",
"demote_self_err": "I can't demote myself.",
"warn_self_err": "I can't warn myself.",
"mute_self_err": "I can't mute myself.",
"kick_sudo_err": "Wow, you wanna kick my owner?",
"ban_sudo_err": "Wow, you wanna try ban my owner?",
"demote_sudo_err": "Wow, you wanna try demote my owner?",
"warn_sudo_err": "Wow, you wanna try give warning to my owner?",
"mute_sudo_err": "Wow, you wanna try give mute to my owner?",
"kick_admin_err": "Lol, it's crazy if i can kick an admin.",
"ban_admin_err": "Lol, it's crazy if i can banned an admin.",
"mute_admin_err": "Lol, it's crazy if i can mute an admin.",
"warn_admin_err": "Lol, it's crazy if i can warn an admin.",
"kick_msg": "**Kicked User:** {mention} [`{id}`]\n**Kicked By:** {kicker}\n**Reason:** {reasonmsg}",
"ban_msg": "**Banned User:** {mention} [`{id}`]\n**Banned By:** {banner}\n",
"unban_msg": "__Banned removed by {mention}__",
"no_ban_permission": "Please give me ban permission to ban user in this group.",
"no_more_99": "You can't use more than 99",
"banned_time": "**Banned For:** {val}\n",
"muted_time": "**Muted For:** {val}\n",
"banned_reason": "**Reason:** {reas}",
"unban_channel_err": "You cannot unban a channel",
"give_unban_user": "Provide a username or reply to a user's message to unban.",
"unban_success": "Successfully unbanned {umention}!",
"give_idban_with_msg_link": "Provide a userid/username along with message link and reason to list-ban",
"give_idunban_with_msg_link": "Provide a userid/username along with message link and reason to list-unban",
"give_reason_list_ban": "You must provide a reason to list-ban",
"Invalid_tg_link": "Invalid message link provided",
"multiple_ban_progress": "`Banning User from multiple groups. This may take some time`",
"multiple_unban_progress": "`Unbanning User from multiple groups. This may take some time`",
"failed_get_uname": "Could not get group usernames",
"listban_msg": "**List-Banned User:** {mention}\n**Banned User ID:** `{uid}`\n**Admin:** {frus}\n**Affected chats:** `{ct}`\n**Reason:** {reas}",
"listunban_msg": "**List-Unbanned User:** {mention}\n**Unbanned User ID:** `{uid}`\n**Admin:** {frus}\n**Affected chats:** `{ct}`\n**Reason:** {reas}",
"promote_self_err": "I can't promote myself.",
"no_promote_perm": "Sadly, I don't permission to promote users.",
"full_promote": "Fully Promoted {umention}!",
"normal_promote": "Promoted {umention}!",
"pin_success": "**Pinned [this]({link}) message.**",
"unpin_success": "**UnPinned [this]({link}) message.**",
"pin_no_perm": "Please give me pin permission to use this command!.",
"report_msg": "Reported {user_mention} to admins!",
"reported_is_admin": "Do you know that the user you are replying is an admin ?",
"user_no_warn": "User {mention} has no warnings.",
"ch_warn_msg": "User {mention} has {warns}/3 warnings.",
"warn_msg": "**Warned User:** {mention}\n**Warned By:** {warner}\n**Reason:** {reas}\n**Warns:** {twarn}/3",
"rmwarn_msg": "Removed warnings of {mention}.",
"unwarn_msg": "Removed warnings by {mention}.",
"rmmute_msg": "__Mute removed by {mention}__",
"unmute_msg": "Unmuted! {umention}",
"reply_to_rm_warn": "Reply to a message to remove a user's warnings.",
"exceed_warn_msg": "Number of warns of {mention} exceeded, BANNED!",
"mute_msg": "**Muted User:** {mention}\n**Muted By:** {muter}\n",
"rm_warn_btn": "🚨 Remove Warn 🚨"
}

13
locales/en-US/afk.json Normal file
View file

@ -0,0 +1,13 @@
{
"no_channel": "This feature not supported for channel.",
"on_afk_msg_no_r": "**{usr}** [<code>{id}</code>] is back online and was away for {tm}\n\n",
"on_afk_msg_with_r": "**{usr}** [<code>{id}</code>] is back online and was away for {tm}\n\n**Reason:** `{reas}`\n\n",
"is_afk_msg_no_r": "**{usr}** [<code>{id}</code>] is AFK since {tm} ago.\n\n",
"is_afk_msg_with_r": "**{usr}** [<code>{id}</code>] is AFK since {tm} ago.\n\n**Reason:** {reas}\n\n",
"is_online": "**{usr}** [<code>{id}</code>] is back online",
"now_afk": "{usr} [<code>{id}</code>] is now AFK!.",
"afkdel_help": "**Usage:**\n/{cmd} [ENABLE|DISABLE] to enable or disable auto delete message.",
"afkdel_disable": "Disabled auto delete AFK message.",
"afkdel_enable": "Enabled auto delete AFK message in this chat.",
"is_afk": "{usr} [<code>{id}</code>] is AFK!."
}

View file

@ -0,0 +1,6 @@
{
"no_question": "Please use command <code>/{cmd} [question]</code> to ask your question with AI.",
"find_answers_str": "Wait a moment looking for your answer..",
"dont_spam": "Don't spam please, please wait {tm} second or i will ban you from this bot.",
"answers_too_long": "Question for your answer has exceeded TG text limit, check this link to view.\n\n{answerlink}"
}

11
locales/en-US/dev.json Normal file
View file

@ -0,0 +1,11 @@
{
"already_up": "Its already up-to date!",
"up_and_rest": "<b>Updated with default branch, restarting now.</b>",
"cl_btn": "❌ Close",
"no_eval": "__No evaluate message!__",
"run_eval": "<i>Processing eval pyrogram..</i>",
"run_exec": "<i>Processing exec pyrogram..</i>",
"no_cmd": "No command to execute was given.",
"success": "Success",
"no_reply": "No Reply"
}

3
locales/en-US/fun.json Normal file
View file

@ -0,0 +1,3 @@
{
"result": "🎲 The dice stopped at the number: {number}"
}

View file

@ -0,0 +1,6 @@
{
"back_btn": "« Go back",
"no_results": "No Results.",
"unknown_id": "Sorry I can't recognize this user. Maybe I've never met him.",
"exp_task": "😶‍🌫️ Timeout. Task has been cancelled!"
}

13
locales/en-US/genss.json Normal file
View file

@ -0,0 +1,13 @@
{
"wait_msg": "Give me some time to process your request!! 😴",
"wait_dl": "<code>Processing, please wait..</code>",
"dl_progress": "Trying to download, please wait..",
"up_progress": "Trying to upload...",
"success_dl_msg": "File has been downloaded to <code>{path}</code>.",
"fail_open": "😟 Sorry! I cannot open the file.",
"limit_dl": "Sorry, download limited to 2GB to reduce flood. You can convert your files to link.",
"err_ssgen": "Failed screenshoot generation.\n\n{exc}",
"up_msg": "☑️ Generation screenshot successfully.\n\n{namma} (<code>{id}</code>)\n#️⃣ #ssgen #id{id}\n\nSS Generate by @{bot_uname}",
"no_reply": "Reply to a Telegram video or document or use direct link after command to generate screenshoot from media!",
"choose_no_ss": "Now choose how many result for screenshot? 🥳.\n\nTotal duration: `{td}` (`{dur} second`)"
}

View file

@ -0,0 +1,13 @@
{
"sudo_join_msg": "Wow, my cool owner just joined the group!",
"log_bot_added": "#New Group\nGroup = {ttl}(<code>{cid}</code>)\nNumber of Members = <code>{tot}</code>\nAdded by - {r_j}",
"support_btn": "Support",
"help_btn": " Help",
"update_btn": "📢 Updates",
"chat_not_allowed": "<b>CHAT NOT ALLOWED 🐞\n\nMy owner has banned me from working here! You can contact the owner of this bot..</b>",
"welcome_thanks": "<b>Thank you for adding me to {ttl} ❣️\n\nIf you have any problems or suggestions, you can contact me.</b>",
"capt_welc": "Hi {umention} [<code>{uid}</code>], Welcome to the {ttl} group.",
"combot_msg": "<b>#CAS Federation Ban</b>\nUser {umention} [<code>{uid}</code>] has been detected as a spambot and has been banned. Powered by <a href='https://api.cas.chat/check?user_id={u.id}'>Combot AntiSpam.</a>",
"spamwatch_msg": "<b>#SpamWatch Federation Ban</b>\nUser {umention} [<code>{uid}</code>] has been banned for <code>{reas}</code>.\n" ,
"welcpic_msg": "Welcome {userr} [{id}]"
}

View file

@ -0,0 +1 @@
{}

View file

@ -0,0 +1,5 @@
{
"language_changed_successfully": "The language has been changed successfully.",
"language_changer_chat": "Here you can change the language used for the bot throughout the chat.\nIf your language is not listed here and you would like to contribute, you can open issue in my github repo.",
"language_changer_private": "Here you can change the language used for the bot in this private chat.\n\nIf you want to change the language of your group, please run the command <code>/setchatlang</code> on it.\nIf your language is not listed here and you would like to contribute, you can open issue in my github repo."
}

4
locales/en-US/main.json Normal file
View file

@ -0,0 +1,4 @@
{
"language_name": "English",
"language_flag": "🇬🇧"
}

View file

@ -0,0 +1,15 @@
{
"sub_extr_help": "Please use command /{cmd} [link] to check subtitles or audio in video file.",
"conv_sub_help": "Use command /{cmd} by reply to .ass or .vtt file, to convert subtitle from .ass or .vtt to srt.",
"progress_str": "⏳ Processing your request..",
"convert_str": "⏳ Converting...",
"unauth_cb": "⚠️ Access Denied!",
"cancel_btn": "❌ Cancel",
"invalid_cb": "⚠️ DONT DELETE YOUR MESSAGE!",
"up_str": "Uploading files..",
"press_btn_msg": "Press the button below to extract subtitles/audio. Only support direct link at this time.\nProcessed in {timelog}",
"fail_extr_media": "Failed extract media, make sure your link is not protected by WAF or maybe inaccessible for bot.",
"fail_extr_sub": "Failed extract sub, Maybe unsupported format..\n\nLink: {link}\nERR: {e}",
"capt_extr_sub": "<b>Filename:</b> <code>{nf}</code>\n\nExtracted by @{bot} in {timelog}",
"capt_conv_sub": "<code>{nf}.srt</code>\n\nConverted by @{bot}"
}

View file

@ -0,0 +1,11 @@
{
"processing_text": "`Processing, total time is based on the size of your files...`",
"wait_msg": "`Please wait a moment...`",
"err_link": "It looks like the link you sent is invalid, make sure it's a direct link and can be downloaded.",
"media_invalid": "Please reply to valid media.",
"dl_limit_exceeded": "Sorry, download limited to 2GB to reduce flood. You can convert your files to link.",
"dl_args_text": "Trying to download..",
"mediainfo_help": "Use the command /{cmd} [link], or reply to telegram media with /{cmd}.",
"capt_media": " Your mediainfo results..\n\n**Request By:** {ment}",
"viweb": "💬 Open on Web"
}

View file

@ -0,0 +1,17 @@
{
"nmd_disabled": "Nightmode disabled.",
"nmd_not_enabled": "Nightmode isn't enabled in this chat.",
"invalid_time_format": "Invalid time format. Use HH:MM format.",
"invalid_lockdur": "Invalid time duration. Use proper format.\nExample: 6h (for 6 hours), 10m for 10 minutes.",
"schedule_already_on": "Already a schedule is running in this chat. Disable it using `-d` flag.",
"nmd_enable_success": "Successfully enabled nightmode in this chat.\nGroup will be locked at {st} and will be opened after {lockdur} everyday.",
"nmd_cb": "🔖 Hai, Aku {bname} dibuat menggunakan Framework Pyrogram v{ver} dan Python v{pyver}.\n\nMau buat bot seperti ini? Yuuk belajar di @botindonesia\nOwner: @YasirArisM",
"nmd_off_not_admin": "#NIGHTMODE_FAIL\nFailed to turn off nightmode at `{chat_id}`, since {bname} is not an admin in chat `{chat_id}`",
"nmd_off_not_present": "#NIGHTMODE_FAIL\nFailed to turn off nightmode at `{chat_id}`, since {bname} is not present in chat `{chat_id}`. Removed group from list.",
"nmd_off_err": "#NIGHTMODE_FAIL\nFailed to turn off nightmode at `{chat_id}`\nERROR: `{e}`",
"nmd_off_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n☀ Group is Opening.\nWill be closed at {close_at}",
"nmd_on_not_admin": "#NIGHTMODE_FAIL\nFailed to enable nightmode at `{chat_id}`, since {bname} is not an admin in chat `{chat_id}`",
"nmd_on_not_present": "#NIGHTMODE_FAIL\nFailed to enable nightmode at `{chat_id}`, since {bname} is not present in chat `{chat_id}`. Removed group from list.",
"nmd_on_err": "#NIGHTMODE_FAIL\nFailed to enable nightmode at `{chat_id}`\nERROR: `{e}`",
"nmd_on_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n🌗 Group is closing.\nWill be opened at {open_at}"
}

6
locales/en-US/ocr.json Normal file
View file

@ -0,0 +1,6 @@
{
"no_photo": "Reply photo with /{cmd} command to scan text from images.",
"read_ocr": "Scanning your images..",
"result_ocr": "Hasil OCR:\n<code>{result}</code>",
"ocr_helper": "/ocr [reply to photo] - Read Text From Image"
}

View file

@ -0,0 +1,13 @@
{
"no_uname": "<code>No Username</code>",
"no_last_name": "<code>No Last Name</code>",
"uname_change_msg": "✨ Changed username from {bef} ➡️ {aft}.\n",
"lastname_change_msg": "✨ Changed last name from {bef} ➡️ {aft}.\n",
"firstname_change_msg": "✨ Changed first name from {bef} ➡️ {aft}.\n",
"set_sangmata_help": "Use <code>/{cmd} on</code>, to enable sangmata. If you want disable, you can use off parameter.",
"sangmata_already_on": "SangMata already enabled in your groups.",
"sangmata_enabled": "Sangmata enabled in your groups.",
"sangmata_already_off": "SangMata already disabled in your groups.",
"sangmata_disabled": "Sangmata disabled in your groups.",
"wrong_param": "Unknown parameter, use only on/off parameter."
}

View file

@ -0,0 +1,11 @@
{
"newgroup_log": "#NewGroup\nGroup = {jdl}(<code>{id}</code>)\nMembers Count = <code>{c}</code>",
"newuser_log": "#NewUser\nID - <code>{id}</code>\nName - {nm}",
"help_name": "Here is the help for **{mod}**:\n",
"help_txt": "Hello {kamuh}, My name is {bot}.\nI'm a pyrogram bot that developed by kind owner with some useful features.\nYou can look by clicking a button below.\n\nGeneral command are:\n - /start: Start the bot\n - /help: Give this message\n - /setlang: Change bot language [BETA]",
"click_me": "Click Me",
"back_btn": "Back",
"click_btn": "Click on the below button to get help about {nm}",
"pm_detail": "PM Me For More Details.",
"start_msg": "Hi {kamuh}, PM me to know about all my features. You can change bot language in bot using /setlang command but it's still in beta stage."
}

View file

@ -0,0 +1,19 @@
{
"no_anim_stick": "Animated sticker is not supported!",
"not_sticker": "This is not a sticker!",
"unkang_msg": "Trying to remove from pack..",
"unkang_success": "Sticker has been removed from your pack",
"unkang_error": "Failed remove sticker from your pack.\n\nERR: {e}",
"unkang_help": "Please reply sticker that created by {c} to remove sticker from your pack.",
"anon_warn": "You are anon admin, kang stickers in my pm.",
"kang_msg": "Trying to steal your sticker...",
"stick_no_name": "The sticker has no name.",
"kang_help": "Want me to guess the sticker? Please tag a sticker.",
"exist_pack": "<code>Using existing sticker pack...</code>",
"new_packs": "<b>Creating a new sticker pack...</b>",
"please_start_msg": "It looks like you've never interacted with me in private chat, you need to do that first..",
"click_me": "Click Me",
"pack_full": "Your Sticker Pack is full if your pack is not in v1 Type /kang 1, if it is not in v2 Type /kang 2 and so on.",
"viewpack": "👀 View Your Pack",
"kang_success": "<b>Sticker successfully stolen!</b>\n<b>Emoji:</b> {emot}"
}

View file

@ -0,0 +1,20 @@
{
"no_result": "Sorry, i couldn't find any results!",
"no_result_w_query": "Sorry, i could not find query: {kueri}",
"get_data": "⏳ Please wait, getting data from web..",
"cl_btn": "❌ Close",
"back_btn": "↩️ Back",
"dl_text": "⬇️ Download",
"cat_text": "Category",
"quality": "Quality",
"ex_data": "👇 Extract Data ",
"unauth": "This button is not for you..",
"invalid_cb": "Invalid callback data, please send command again..",
"res_scrape": "<b>Scrape result from</b> <code>{link}</code>:\n\n{kl}",
"header_with_query": "<b>#{web} Results For:</b> <code>{kueri}</code>\n\n",
"header_no_query": "<b>#{web} Latest:</b>\n🌀 Use /{cmd} [title] to start search with title.\n\n",
"invalid_cmd_scrape": "Use command /{cmd} <b>[link]</b> to scrape download link.",
"err_getweb": "ERROR: Failed getting data from web because {err}.",
"err_getapi": "ERROR: Failed getting data from API",
"unsupport_dl_btn": "Some result will not appear in extract button because unsupported link."
}

6
locales/en-US/webss.json Normal file
View file

@ -0,0 +1,6 @@
{
"no_url": "Give A Url To Fetch Screenshot.",
"wait_str": "Capturing screenshot...",
"str_credit": "🌞 Screenshot generated using Puppeteer",
"ss_failed_str": "Failed To Take Screenshot. {err}"
}

View file

@ -0,0 +1,14 @@
{
"no_channel": "This feature not supported for channel or anonymous user.",
"no_query": "Please input a query..!",
"no_res": "No result found for `{kweri}`",
"dl_btn": "Download",
"back": "Back",
"yts_msg": "Published {pub}\n\n<b> Duration:</b> {dur}\n<b> Views:</b> {vi}\n<b> Uploader:</b> <a href='{clink}'>{cname}</a>\n\n",
"invalid_link": "Please input a valid YT-DLP Supported URL",
"err_parse": "Failed parse URL, check logs..",
"wait": "Please wait..",
"unauth": "Not Your Task..",
"endlist": "That's the end of list",
"vip-btn": "Because some user abuse and my server cannot handle it, best video now only for bot owner."
}

68
locales/id-ID/admin.json Normal file
View file

@ -0,0 +1,68 @@
{
"no_admin_error": "Anda harus menjadi administrator untuk menggunakan perintah ini.",
"no_permission_error": "Maaf, tapi anda tidak memiliki izin yang diperlukan untuk menjalankan perintah ini. Izin yang hilang: {permissions}",
"private_not_allowed": "Perintah ini tidak dapat digunakan dalam obrolan pribadi, Jika anda membutuhkan bantuan, mohon gunakan perintah /help.",
"purge_no_reply": "Balas ke pesan yang ingin dihapus.",
"delete_no_reply": "Balas Pesan Untuk Menghapusnya",
"pin_no_reply": "Balas pesan untuk menyematkan/melepas pin.",
"report_no_reply": "Balas Pesan Untuk Melaporkan Pengguna Itu.",
"no_delete_perm": "Tolong beri saya izin untuk menghapus pesan.",
"purge_success": "Berhasil menghapus {del_total} pesan..",
"user_not_found": "Saya tidak dapat menemukan pengguna itu.",
"invalid_id_uname": "⚠️ ID pengguna/nama pengguna salah",
"kick_self_err": "Saya tidak dapat menendang diri sendiri, saya dapat pergi jika Anda mau.",
"ban_self_err": "Saya tidak dapat melarang diri saya sendiri, saya dapat pergi jika Anda mau.",
"report_self_err": "Mengapa Anda melaporkan diri sendiri?",
"demote_self_err": "Saya tidak dapat menurunkan keanggotaan diri saya sendiri.",
"warn_self_err": "Saya tidak dapat memperingatkan diri sendiri.",
"mute_self_err": "Saya tidak dapat membisukan diri sendiri.",
"kick_sudo_err": "Wow, Anda ingin menendang pemilik saya yang spesial?",
"ban_sudo_err": "Wow, Anda ingin mencoba membanned pemilik saya?",
"demote_sudo_err": "Wow, Anda ingin mencoba mendemote pemilik saya?",
"warn_sudo_err": "Wow, Anda ingin mencoba memberi peringatan kepada pemilik saya?",
"mute_sudo_err": "Wow, Anda ingin mencoba membisukan pemilik saya?",
"kick_admin_err": "Hah, sungguh gila jika saya bisa menendang seorang admin.",
"ban_admin_err": "Hah, sungguh gila jika saya bisa melarang seorang admin.",
"mute_admin_err": "Hah, sungguh gila jika saya bisa membisukan admin.",
"warn_admin_err": "Hah, sungguh gila jika saya bisa memperingatkan seorang admin.",
"kick_msg": "**Pengguna yang Ditendang:** {mention} [`{id}`]\n**Ditendang Oleh:** {kicker}\n**Alasan:** {reasonmsg}",
"ban_msg": "**Pengguna yang Dibanned:** {mention} [`{id}`]\n**Dibanned Oleh:** {banner}\n",
"unban_msg": "__Banned dihapus oleh {mention}__",
"no_ban_permission": "Tolong beri saya izin banned untuk membanned pengguna di grup ini.",
"no_more_99": "Anda tidak dapat menggunakan lebih dari 99",
"banned_time": "**Dilarang Untuk:** {val}\n",
"muted_time": "**Dimute Untuk:** {val}\n",
"banned_reason": "**Alasan:** {reas}",
"unban_channel_err": "Anda tidak dapat membatalkan pemblokiran saluran",
"give_unban_user": "Berikan nama pengguna atau balas pesan pengguna untuk membatalkan banned.",
"unban_success": "Berhasil membatalkan pemblokiran {umention}!",
"give_idban_with_msg_link": "Berikan userid/nama pengguna beserta tautan pesan dan alasan pelarangan daftar",
"give_idunban_with_msg_link": "Berikan userid/nama pengguna beserta tautan pesan dan alasan untuk membatalkan larangan",
"give_reason_list_ban": "Anda harus memberikan alasan untuk melarang daftar",
"Invalid_tg_link": "Tautan pesan yang diberikan tidak valid",
"multiple_ban_progress": "`Melarang Pengguna dari banyak grup. Ini mungkin membutuhkan waktu`",
"multiple_unban_progress": "`Membatalkan pencekalan Pengguna dari banyak grup. Ini mungkin membutuhkan waktu`",
"failed_get_uname": "Tidak dapat memperoleh nama pengguna grup",
"listban_msg": "**Pengguna yang Dilarang Daftar:** {mention}\n**ID Pengguna yang Dilarang:** `{uid}`\n**Admin:** {frus}\n**Obrolan yang terpengaruh: ** `{ct}`\n**Alasan:** {reas}",
"listunban_msg": "**Pengguna yang Tidak Dilarang Daftar:** {mention}\n**ID Pengguna yang Tidak Dilarang:** `{uid}`\n**Admin:** {frus}\n**Obrolan yang terpengaruh: ** `{ct}`\n**Alasan:** {reas}",
"promote_self_err": "Saya tidak dapat mempromosikan diri saya sendiri.",
"no_promote_perm": "Sayangnya, saya tidak mengizinkan untuk mempromosikan pengguna.",
"full_promote": "Dipromosikan Sepenuhnya {umention}!",
"normal_promote": "Dipromosikan {umention}!",
"pin_success": "**Pesan [ini]({link}) berhasil disematkan.**",
"unpin_success": "**Pesan sematan [ini]({link}) berhasil dilepas.**",
"pin_no_perm": "Tolong beri saya izin pin untuk menggunakan perintah ini!.",
"report_msg": "Melaporkan {user_mention} ke admin!",
"reported_is_admin": "Apakah Anda tahu bahwa pengguna yang Anda balas adalah seorang admin?",
"user_no_warn": "Pengguna {mention} tidak memiliki peringatan.",
"ch_warn_msg": "Pengguna {mention} memiliki {warns}/3 peringatan.",
"warn_msg": "**Pengguna yang Diperingatkan:** {mention}\n**Diperingatkan Oleh:** {warner}\n**Alasan:** {reas}\n**Peringatan:** {twarn}/ 3",
"rmwarn_msg": "Peringatan {mention} telah dihapus.",
"unwarn_msg": "Peringatan dihapus oleh {mention}.",
"rmmute_msg": "__Bisukan dihapus oleh {mention}__",
"unmute_msg": "Disuarakan! {umention}",
"reply_to_rm_warn": "Balas pesan untuk menghapus peringatan pengguna.",
"exceed_warn_msg": "Jumlah peringatan dari {mention} terlampaui, DILARANG!",
"mute_msg": "**Pengguna yang Dimute:** {mention}\n**Dimute Oleh:** {muter}\n",
"rm_warn_btn": "🚨 Hapus Peringatan 🚨"
}

13
locales/id-ID/afk.json Normal file
View file

@ -0,0 +1,13 @@
{
"no_channel": "Fitur ini tidak didukung untuk channel.",
"on_afk_msg_no_r": "**{usr}** [<code>{id}</code>] kembali online dan telah AFK selama {tm}\n\n",
"on_afk_msg_with_r": "**{usr}** [<code>{id}</code>] kembali online dan telah AFK selama {tm}\n\n**Alasan:** `{reas}`\n\n",
"is_afk_msg_no_r": "**{usr}** [<code>{id}</code>] telah AFK sejak {tm} yang lalu.\n\n",
"is_afk_msg_with_r": "**{usr}** [<code>{id}</code>] telah AFK sejak {tm} yang lalu.\n\n**Alasan:** {reas}\n\n" ,
"is_online": "**{usr}** [<code>{id}</code>] kembali online",
"now_afk": "{usr} [<code>{id}</code>] sekarang AFK!.",
"afkdel_help": "**Penggunaan:**\n/{cmd} [ENABLE|DISABLE] untuk mengaktifkan atau menonaktifkan hapus pesan AFK secara otomatis.",
"afkdel_disable": "Penghapusan otomatis pesan AFK dinonaktifkan.",
"afkdel_enable": "Penghapusan otomatis pesan AFK di obrolan ini diaktifkan.",
"is_afk": "{usr} [<code>{id}</code>] sedang AFK!."
}

View file

@ -0,0 +1,6 @@
{
"no_question": "Harap gunakan perintah <code>/{cmd} [question]</code> untuk mengajukan pertanyaan Anda menggunakan AI.",
"find_answers_str": "Sedang mencari jawaban terbaik buat Anda..",
"dont_spam": "Tolong jangan melakukan spam, harap tunggu {tm} detik atau saya akan membanned Anda dari bot ini.",
"answers_too_long": "Pertanyaan untuk jawaban Anda telah melampaui batas teks TG, periksa tautan ini untuk melihatnya.\n\n{answerlink}"
}

11
locales/id-ID/dev.json Normal file
View file

@ -0,0 +1,11 @@
{
"already_up": "Sudah paling update!",
"up_and_rest": "<b>Diperbarui dengan branch default, dimulai ulang sekarang.</b>",
"cl_btn": "❌ Tutup",
"no_eval": "__Tidak ada pesan eval!__",
"run_eval": "<i>Memproses pyrogram eval..</i>",
"run_exec": "<i>Memproses pyrogram eksekutif..</i>",
"no_cmd": "Tidak ada perintah untuk dieksekusi.",
"sukses": "Sukses",
"no_reply": "Tidak ada balasan"
}

3
locales/id-ID/fun.json Normal file
View file

@ -0,0 +1,3 @@
{
"result": "🎲 Dadu berhenti di angka: {number}"
}

View file

@ -0,0 +1,6 @@
{
"back_btn": "« Kembali",
"unknown_id": "Maaf saya tidak bisa mengenali pengguna ini. Mungkin saya belum pernah bertemu dengannya.",
"no_results": "Tidak ada hasil yang ditemukan.",
"exp_task": "😶‍🌫️ Waktu Habis. Tugas Telah Dibatalkan!"
}

13
locales/id-ID/genss.json Normal file
View file

@ -0,0 +1,13 @@
{
"wait_msg": "Beri saya waktu untuk memproses permintaan Anda!! 😴",
"wait_dl": "<code>Sedang diproses, harap tunggu..</code>",
"dl_progress": "Mencoba mengunduh, harap tunggu..",
"up_progress": "Mencoba mengunggah...",
"success_dl_msg": "Berkas telah diunduh ke <code>{path}</code>.",
"fail_open": "😟 Maaf! Saya tidak dapat membuka file.",
"limit_dl": "Maaf, unduh terbatas hingga 2GB untuk mengurangi flood. Anda dapat mengkonversi file Anda menjadi tautan.",
"err_ssgen": "Pembuatan screenshot gagal.\n\n{exc}",
"up_msg": "☑️ Pembuatan screenshot berhasil.\n\n{namma} (<code>{id}</code>)\n#️⃣ #ssgen #id{id}\n\nSS Dibuat oleh @{bot_uname} ",
"no_reply": "Balas video atau dokumen Telegram atau gunakan tautan langsung setelah perintah untuk membuat screenshot dari media!",
"choose_no_ss": "Sekarang pilih berapa hasil screenshot? 🥳.\n\nTotal durasi: `{td}` (`{dur} detik`)"
}

View file

@ -0,0 +1,13 @@
{
"sudo_join_msg": "Waw, Pemilikku yang keren baru saja bergabung ke grup!",
"log_bot_added": "#GrupBaru\nGrup = {ttl}(<code>{cid}</code>)\nJumlah Anggota = <code>{tot}</code>\nDitambahkan oleh - {r_j}",
"support_btn": "Dukungan",
"help_btn": " Bantuan",
"update_btn": "📢 Updates",
"chat_not_allowed": "<b>CHAT TIDAK DIIJINKAN 🐞\n\nPemilik saya sudah melarang saya untuk bekerja disini! Kamu bisa menghubungi pemilik bot ini..</b>",
"welcome_thanks": "<b>Terimakasih sudah menambahkan saya di {ttl} ❣️\n\nJika ada kendala atau saran bisa kontak ke saya.</b>",
"capt_welc": "Hai {umention} [<code>{uid}</code>], Selamat datang digrup {ttl}.",
"combot_msg": "<b>#CAS Federation Ban</b>\nPengguna {umention} [<code>{uid}</code>] terdeteksi sebagai spambot dan telah dikeluarkan. Powered by <a href='https://api.cas.chat/check?user_id={u.id}'>Combot AntiSpam.</a>",
"spamwatch_msg": "<b>#SpamWatch Federation Ban</b>\nPengguna {umention} [<code>{uid}</code>] telah dikeluarkan karena <code>{reas}</code>.\n",
"welcpic_msg": "Selamat Datang {userr} [{id}]"
}

View file

@ -0,0 +1 @@
{}

View file

@ -0,0 +1,5 @@
{
"language_changed_successfully": "Bahasa telah berhasil diubah.",
"language_changer_chat": "Di sini Anda dapat mengubah bahasa yang digunakan bot selama obrolan.\nJika bahasa Anda tidak ada di sini dan Anda ingin berkontribusi, Anda dapat membuka masalah di github saya. .",
"language_changer_private": "Di sini Anda dapat mengubah bahasa yang digunakan oleh bot dalam obrolan pribadi ini.\n\nJika Anda ingin mengubah bahasa grup Anda, buka perintah <code>/setchatlang</code>. \nJika bahasa Anda tidak ada di sini dan Anda ingin berkontribusi, buka repo misskaty di github."
}

4
locales/id-ID/main.json Normal file
View file

@ -0,0 +1,4 @@
{
"language_name": "Indonesia",
"language_flag": "🇮🇩"
}

View file

@ -0,0 +1,15 @@
{
"sub_extr_help": "Harap gunakan perintah /{cmd} [tautan] untuk memeriksa teks film atau audio dalam berkas video.",
"conv_sub_help": "Gunakan perintah /{cmd} dengan membalas berkas .ass atau .vtt, untuk mengonversi teks film dari .ass atau .vtt ke srt.",
"progress_str": "⏳ Memproses permintaan Anda..",
"convert_str": "⏳ Mengkonversi...",
"unauth_cb": "⚠️ Akses Ditolak!",
"batal_btn": "❌ Batal",
"invalid_cb": "⚠️ JANGAN HAPUS PESAN ANDA!",
"up_str": "Mengunggah berkas..",
"press_btn_msg": "Tekan tombol di bawah untuk mengekstrak teks/audio. Saat ini hanya mendukung tautan langsung.\nDiproses dalam {timelog}",
"fail_extr_media": "Gagal mengekstrak media, pastikan tautan Anda tidak dilindungi oleh WAF atau mungkin tidak dapat diakses oleh bot.",
"fail_extr_sub": "Sub ekstrak gagal, Mungkin formatnya tidak didukung..\n\nTautan: {link}\nERR: {e}",
"capt_extr_sub": "<b>Nama file:</b> <kode>{nf}</code>\n\nDiekstrak oleh @{bot} dalam {timelog}",
"capt_conv_sub": "<code>{nf}.srt</code>\n\nDikonversi oleh @{bot}"
}

View file

@ -0,0 +1,11 @@
{
"processing_text": "`Memproses, total waktu didasarkan pada ukuran file Anda...`",
"wait_msg": "`Mohon tunggu sementara...`",
"err_link": "Sepertinya tautan yang Anda kirim tidak valid, pastikan tautan langsung dan bisa di unduh.",
"media_invalid": "Silakan balas ke media yang valid.",
"dl_limit_exceeded": "Maaf, unduh dibatasi hingga 2GB untuk mengurangi flood. Anda dapat mengonversi berkas Anda menjadi tautan.",
"dl_args_text": "Mencoba mengunduh..",
"mediainfo_help": "Gunakan perintah /{cmd} [tautan], atau balas telegram media dengan /{cmd}.",
"capt_media": " Hasil mediainfo anda..\n\n**Diminta Oleh:** {ment}",
"viweb": "💬 Buka di Web"
}

View file

@ -0,0 +1,17 @@
{
"nmd_disabled": "Mode malam dinonaktifkan.",
"nmd_not_enabled": "Mode malam tidak diaktifkan di obrolan ini.",
"invalid_time_format": "Format waktu tidak sah. Gunakan format HH:MM.",
"invalid_lockdur": "Durasi waktu tidak valid. Gunakan format yang tepat.\nContoh: 6j (selama 6 jam), 10m selama 10 menit.",
"schedule_already_on": "Sudah ada jadwal yang berjalan di obrolan ini. Nonaktifkan menggunakan tanda `-d`.",
"nmd_enable_success": "Berhasil mengaktifkan mode malam dalam obrolan ini.\nGrup akan dikunci pada {st} dan akan dibuka setelah {lockdur} setiap hari.",
"nmd_cb": "🔖 Hai, Saya {bname} dibuat menggunakan Framework Pyrogram v{ver} dan Python v{pyver}.\n\nMau buat bot seperti ini? Yuuk belajar di @botindonesia\nOwner: @YasirArisM",
"nmd_off_not_admin": "#NIGHTMODE_FAIL\nGagal mematikan mode malam di `{chat_id}`, karena {bname} bukan admin di obrolan `{chat_id}`",
"nmd_off_not_present": "#NIGHTMODE_FAIL\nGagal mematikan mode malam di `{chat_id}`, karena {bname} tidak ada di obrolan `{chat_id}`. Menghapus grup dari daftar.",
"nmd_off_err": "#NIGHTMODE_FAIL\nGagal mematikan mode malam di `{chat_id}`\nERROR: `{e}`",
"nmd_off_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n☀ Grup sedang dibuka.\nAkan ditutup pada {close_at}",
"nmd_on_not_admin": "#NIGHTMODE_FAIL\nGagal mengaktifkan mode malam di `{chat_id}`, karena {bname} bukan admin di obrolan `{chat_id}`",
"nmd_on_not_present": "#NIGHTMODE_FAIL\nGagal mengaktifkan mode malam di `{chat_id}`, karena {bname} tidak ada di obrolan `{chat_id}`. Grup dihapus dari daftar.",
"nmd_on_err": "#NIGHTMODE_FAIL\nGagal mengaktifkan mode malam di `{chat_id}`\nERROR: `{e}`",
"nmd_on_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n🌗 Grup ditutup.\nAkan dibuka pada {open_at}"
}

6
locales/id-ID/ocr.json Normal file
View file

@ -0,0 +1,6 @@
{
"no_photo": "Balas foto dengan perintah /{cmd} untuk memindai teks dari gambar.",
"read_ocr": "Memindai gambar Anda..",
"result_ocr": "Hasil OCR:\n<code>{result}</code>",
"ocr_helper": "/ocr [balas ke foto] - Baca Teks Dari Gambar"
}

View file

@ -0,0 +1,13 @@
{
"no_uname": "<code>Tanpa Username</code>",
"no_last_name": "<code>Tanpa Nama Belakang</code>",
"uname_change_msg": "✨ Mengubah username dari {bef} ➡️ {aft}.\n",
"lastname_change_msg": "✨ Mengubah nama belakang dari {bef} ➡️ {aft}.\n",
"firstname_change_msg": "✨ Mengubah nama depan dari {bef} ➡️ {aft}.\n",
"set_sangmata_help": "Gunakan <code>/{cmd} on</code>, untuk mengaktifkan sangmata. Jika Anda ingin menonaktifkan, Anda dapat menggunakan parameter off.",
"sangmata_already_on": "SangMata telah diaktifkan di grup Anda.",
"sangmata_enabled": "Sangmata diaktifkan di grup Anda.",
"sangmata_already_off": "SangMata telah dinonaktifkan di grup Anda.",
"sangmata_disabled": "Sangmata dinonaktifkan di grup Anda.",
"wrong_param": "Parameter tidak diketahui, gunakan hanya parameter hidup/mati."
}

View file

@ -0,0 +1,11 @@
{
"newgroup_log": "#NewGroup\nGroup = {jdl}(<code>{id}</code>)\nJumlah Anggota = <code>{c}</code>",
"newuser_log": "#PenggunaBaru\nID - <code>{id}</code>\nNama - {nm}",
"help_name": "Ini bantuan untuk **{mod}**:\n",
"help_txt": "Halo {kamuh}, Nama saya {bot}.\nSaya adalah bot pyrogram yang dikembangkan oleh pemilik yang baik hati dengan beberapa fitur berguna.\nAnda dapat melihat dengan mengeklik tombol di bawah.\n\nPerintah umum adalah :\n - /start: Mulai bot\n - /help: Berikan pesan ini\n - /setlang: Ubah bahasa bot [BETA]",
"click_me": "Klik Saya",
"back_btn": "Kembali",
"click_btn": "Klik tombol di bawah untuk mendapatkan bantuan tentang {nm}",
"pm_detail": "PM Saya Untuk Detail Lebih Lanjut.",
"start_msg": "Hai {kamuh}, PM saya untuk mengetahui semua fitur saya. Anda dapat mengubah bahasa bot di bot menggunakan perintah /setlang tetapi ini masih dalam tahap beta."
}

View file

@ -0,0 +1,19 @@
{
"no_anim_stick": "Stiker animasi tidak didukung!",
"not_sticker": "Ini bukan stiker!",
"unkang_msg": "Mencoba menghapus dari paket..",
"unkang_success": "Stiker telah dihapus dari paket Anda",
"unkang_error": "Gagal menghapus stiker dari paket Anda.\n\nERR: {e}",
"unkang_help": "Tolong balas stiker yang dibuat oleh {c} untuk menghapus stiker dari paket Anda.",
"anon_warn": "Anda adalah admin anon, stiker kang ada di pm saya.",
"kang_msg": "Mencoba mencuri stiker Anda...",
"stick_no_name": "Stiker tidak memiliki nama.",
"kang_help": "Ingin saya menebak stikernya? Harap tandai stiker.",
"exist_pack": "<code>Menggunakan paket stiker yang ada...</code>",
"new_packs": "<b>Membuat paket stiker baru...</b>",
"please_start_msg": "Tampaknya Anda belum pernah berinteraksi dengan saya dalam obrolan pribadi, Anda harus melakukannya dulu..",
"click_me": "Klik Saya",
"pack_full": "Paket Stiker Anda penuh jika paket Anda tidak dalam Tipe v1 /kang 1, jika tidak dalam Tipe v2 /kang 2 dan seterusnya.",
"viewpack": "👀 Lihat Paket",
"kang_success": "<b>Stiker berhasil dicuri!</b>\n<b>Emoji:</b> {emot}"
}

View file

@ -0,0 +1,20 @@
{
"no_result": "Maaf, saya tidak dapat menemukan hasil apa pun!",
"no_result_w_query": "Maaf, saya tidak dapat menemukan kueri: {kueri}",
"get_data": "⏳ Mohon tunggu, mengambil data dari web..",
"cl_btn": "❌ Tutup",
"back_btn": "↩️ Kembali",
"dl_text": "⬇️ Unduh",
"cat_text": "Kategori",
"kualitas": "Kualitas",
"ex_data": "👇 Ekstrak Data",
"unauth": "Tombol ini bukan untuk Anda..",
"invalid_cb": "Data callback tidak valid, silakan kirim perintah lagi..",
"res_scrape": "<b>Hasil Scrape dari</b> <code>{link}</code>:\n\n{kl}",
"header_with_query": "<b>Hasil Pencarian #{web} Untuk:</b> <code>{kueri}</code>\n\n",
"header_no_query": "<b>#{web} Terbaru:</b>\n🌀 Gunakan /{cmd} [judul] untuk memulai pencarian dengan judul.\n\n",
"invalid_cmd_scrape": "Gunakan perintah /{cmd} <b>[link]</b> untuk mengambil link unduhan.",
"err_getweb": "ERROR: Failed getting data from web because {err}.",
"err_getapi": "ERROR: Failed getting data from API",
"unsupport_dl_btn": "Beberapa hasil tidak akan muncul di tombol ekstrak karena tautan tidak didukung."
}

6
locales/id-ID/webss.json Normal file
View file

@ -0,0 +1,6 @@
{
"no_url": "Berikan url untuk mengambil tangkapan layar.",
"wait_str": "Mengambil tangkapan layar...",
"str_credit": "🌞 Screenshot dibuat dengan Puppeteer",
"ss_failed_str": "Gagal Mengambil Tangkapan Layar. ERROR: {err}"
}

View file

@ -0,0 +1,14 @@
{
"no_channel": "Fitur ini tidak didukung untuk channel atau pengguna anonim.",
"no_query": "Silakan kirim link yang mau diunduh..!",
"no_res": "Tidak ada hasil yang ditemukan untuk `{kweri}`",
"dl_btn": "Unduh",
"kembali": "kembali",
"yts_msg": "Dipublikasikan {pub}\n\n<b> Durasi:</b> {dur}\n<b> Penayangan:</b> {vi}\n<b> Pengunggah:</b> <a href='{clink}'>{cname}</a>\n\n",
"invalid_link": "Masukkan URL yang Didukung YT-DLP yang valid",
"err_parse": "Gagal menguraikan URL, periksa log..",
"tunggu": "Harap tunggu..",
"unauth": "Bukan Tugas Anda..",
"endlist": "Itu adalah akhir dari daftar",
"vip-btn": "Karena beberapa penyalahgunaan pengguna, video terbaik sekarang hanya untuk pemilik bot."
}

68
locales/id-JW/admin.json Normal file
View file

@ -0,0 +1,68 @@
{
"no_admin_error": "Sampeyan kudu dadi administrator kanggo nggunakake perintah iki.",
"no_permission_error": "Ngapunten, nanging sampeyan ora duwe izin sing dibutuhake kanggo nindakake perintah iki. Izin sing ilang: {permissions}",
"private_not_allowed": "Perintah iki ora bisa digunakake ing obrolan pribadi, Yen sampeyan butuh bantuan, mohon nggunakake perintah /help.",
"purge_no_reply": "Bales pesen sing arep dibusak.",
"delete_no_reply": "Bales Pesen Kanggo Mbusak",
"pin_no_reply": "Bales pesen sing arep disematke/copot.",
"report_no_reply": "Bales Pesen Kanggo Nglaporake Panganggo.",
"no_delete_perm": "Tulung aku kei izin mbusak pesen.",
"purge_success": "Kasil mbusak {del_total} pesen..",
"user_not_found": "Aku ora bisa nemokake panganggo kuwi.",
"invalid_id_uname": "⚠️ panganggo/jeneng panganggo ora sah",
"kick_self_err": "Aku ora bisa nyepak awakku dhewe, aku bisa lunga yen sampeyan pengin.",
"ban_self_err": "Aku ora bisa nglarang aku, aku bisa lunga yen sampeyan pengin.",
"report_self_err": "Kenging menapa panjenengan lapor piyambak?",
"demote_self_err": "Aku ora bisa mudhun dhewe.",
"warn_self_err": "Aku ora bisa ngelekake awakku dhewe.",
"mute_self_err": "Aku ora bisa bisu awakku dhewe.",
"kick_sudo_err": "Wah, kowe arep nyepak juraganku?",
"ban_sudo_err": "Wah, sampeyan pengin nyoba nglarang pemilikku?",
"demote_sudo_err": "Wah, sampeyan pengin nyoba nurunake pemilikku?",
"warn_sudo_err": "Wah, sampeyan pengin nyoba menehi peringatan marang pemilikku?",
"mute_sudo_err": "Wah, sampeyan pengin nyoba menehi bisu marang pemilikku?",
"kick_admin_err": "Lol, edan yen aku bisa nyepak admin.",
"ban_admin_err": "Lol, edan yen aku bisa nglarang admin.",
"mute_admin_err": "Lol, edan yen aku bisa bisu admin.",
"warn_admin_err": "Lol, edan yen aku bisa ngelingake admin.",
"kick_msg": "**Panganggo Ditendhang:** {mention} [`{id}`]\n**Ditendhang dening:** {kicker}\n**Alasan:** {reasonmsg}",
"ban_msg": "**Panganggo sing Dicekal:** {mention} [`{id}`]\n**Dicekal Dening:** {banner}\n",
"unban_msg": "__Dicekal dibusak kanthi {mention}__",
"no_ban_permission": "Mangga kula nyuwun idin nglarang panganggo ing grup punika.",
"no_more_99": "Sampeyan ora bisa nggunakake luwih saka 99",
"banned_time": "**Dicekal Kanggo:** {val}\n",
"muted_time": "**Diam Kanggo:** {val}\n",
"banned_reason": "**Alesan:** {reas}",
"unban_channel_err": "Sampeyan ora bisa mbatalake saluran",
"give_unban_user": "Nyedhiyani jeneng panganggo utawa mbales pesen panganggo kanggo mbatalake larangan.",
"unban_success": "Kasil mbatalake {umention}!",
"give_idban_with_msg_link": "Nyedhiyakake id panganggo/jeneng panganggo bebarengan karo pranala pesen lan alasan kanggo larangan daftar",
"give_idunban_with_msg_link": "Nyedhiyani id panganggo/jeneng panganggo bebarengan karo pranala pesen lan alasan kanggo daftar-unban",
"give_reason_list_ban": "Sampeyan kudu menehi alesan kanggo nglarang daftar",
"Invalid_tg_link": "Link pesen ora sah diwenehake",
"multiple_ban_progress": "`Nglarang Panganggo saka macem-macem grup. Iki mbutuhake sawetara wektu`",
"multiple_unban_progress": "`Mbusak Larangan Panganggo saka pirang-pirang grup. Iki mbutuhake sawetara wektu`",
"failed_get_uname": "Ora bisa njupuk jeneng panganggo grup",
"listban_msg": "**Panganggo sing Dilarang Dhaptar:** {mention}\n**ID Panganggo sing Dicekal:** `{uid}`\n**Admin:** {frus}\n**Obrolan sing kena pengaruh: ** `{ct}`\n**Alasan:** {reas}",
"listunban_msg": "**Daftar Panganggo sing Ora Dilarang:** {mention}\n**ID Panganggo sing Ora Dilarang:** `{uid}`\n**Admin:** {frus}\n**Obrolan sing kena pengaruh: ** `{ct}`\n**Alasan:** {reas}",
"promote_self_err": "Aku ora bisa promosi dhewe.",
"no_promote_perm": "Sedhih, aku ora ijin kanggo promosi pangguna.",
"full_promote": "{umention} dipromosekake kanthi lengkap!",
"normal_promote": "Dipromosikke {umention}!",
"pin_success": "**Sukses semat pesen iki [iki]({link}).**",
"unpin_success": "**Pesen sematan [iki]({link}) kasil dicopot.**",
"pin_no_perm": "Tulung wenehi pin izin kanggo nggunakake printah iki!.",
"report_msg": "Kacarita {user_mention} menyang admin!",
"reported_is_admin": "Apa sampeyan ngerti yen pangguna sing sampeyan bales iku admin?",
"user_no_warn": "Panganggo {mention} ora ana bebaya.",
"ch_warn_msg": "{mention} duwe {warning}/3 bebaya.",
"warn_msg": "**Panganggo sing Dielingake:** {mention}\n**Dielingake Dening:** {warner}\n**Alesan:** {reas}\n**Ngelingake:** {twarn}/ 3",
"rmwarn_msg": "Pènget saka {mention} wis dibusak.",
"unwarn_msg": "Pènget sing dibusak kanthi {mention}.",
"rmmute_msg": "__Bisu dibusak kanthi {mention}__",
"unmute_msg": "Ora bisu! {umention}",
"reply_to_rm_warn": "Bales pesen kanggo mbusak bebaya pangguna.",
"exceed_warn_msg": "Jumlah peringatan babagan {mention} ngluwihi, DIBRANG!",
"mute_msg": "**Panganggo Bisu:** {mention}\n**Dibunyikan Dening:** {muter}\n",
"rm_warn_btn": "🚨 Copot Warn 🚨"
}

13
locales/id-JW/afk.json Normal file
View file

@ -0,0 +1,13 @@
{
"no_channel": "Fitur iki ora didhukung kanggo channel.",
"on_afk_msg_no_r": "**{usr}** [<code>{id}</code>] wis online maneh lan ora ana suwene {tm}\n\n",
"on_afk_msg_with_r": "**{usr}** [<code>{id}</code>] wis online maneh lan ora ana suwene {tm}\n\n**Alesan:** `{reas}`\n\n",
"is_afk_msg_no_r": "**{usr}** [<code>{id}</code>] iku AFK wiwit {tm} kepungkur.\n\n",
"is_afk_msg_with_r": "**{usr}** [<code>{id}</code>] iku AFK wiwit {tm} kepungkur.\n\n**Alesan:** {reas}\n\n" ,
"is_online": "**{usr}** [<code>{id}</code>] wis online maneh",
"now_afk": "{usr} [<code>{id}</code>] saiki dadi AFK!.",
"afkdel_help": "**Panganggone:**\n/{cmd} [ENABLE|DISABLE] kanggo ngaktifake utawa mateni pesen otomatis mbusak.",
"afkdel_disable": "Mbusak pesen AFK otomatis dipateni.",
"afkdel_enable": "Mbusak pesen AFK otomatis ing obrolan iki diaktifake.",
"is_afk": "{usr} [<code>{id}</code>] iku AFK!."
}

View file

@ -0,0 +1,6 @@
{
"no_question": "Tulung gunakake printah <code>/{cmd} [pitakon]</code> kanggo takon nganggo fitur AI.",
"find_answers_str": "Lagi goleki jawaban paling apik kanggo sampeyan..",
"dont_spam": "Aja spam, mangga ngenteni {tm} detik utawa aku bakal nglarang sampeyan saka bot iki.",
"answers_too_long": "Pitakonan kanggo jawaban sampeyan wis ngluwihi wates teks TG, priksa pranala iki kanggo ndeleng.\n\n{answerlink}"
}

11
locales/id-JW/dev.json Normal file
View file

@ -0,0 +1,11 @@
{
"already_up": "Wis up-to-date!",
"up_and_rest": "<b>Dianyari nganggo branch standar, diwiwiti maneh saiki.</b>",
"cl_btn": "❌ Tutup",
"no_eval": "__Ora ana pesen eval!__",
"run_eval": "<i>Ngolah pyrogram eval..</i>",
"run_exec": "<i>Ngolah pyrogram exec..</i>",
"no_cmd": "Ora ana prentah kanggo nglakokaké.",
"success": "Sukses",
"no_reply": "Ora Wangsulan"
}

3
locales/id-JW/fun.json Normal file
View file

@ -0,0 +1,3 @@
{
"result": "🎲 Dadu mandheg ing nomer: {number}"
}

View file

@ -0,0 +1,6 @@
{
"back_btn": "« Balik Maneh",
"unknown_id": "Nganpunten, aku ora ngerti pengguna iki. Mungkin aku durung pernah ketemu mbi dek'e.",
"no_results": "Ora ana asil sing ditemokake.",
"exp_task": "😶‍🌫️ Wektu wis entek. Tugas wis dibatalake!"
}

13
locales/id-JW/genss.json Normal file
View file

@ -0,0 +1,13 @@
{
"wait_msg": "Wenehi wektu kanggo ngolah panjalukmu!! 😴",
"wait_dl": "<code>Lagi diproses, mangga ngenteni..</code>",
"dl_progress": "Nyoba ngundhuh, mangga ngenteni..",
"up_progress": "Nyoba ngunggah...",
"success_dl_msg": "Berkas wis diundhuh menyang <code>{path}</code>.",
"fail_open": "😟 Nuwun sewu! Aku ora bisa mbukak file.",
"limit_dl": "Nuwun sewu, download dibatesi nganti 2GB kanggo nyuda flood. Sampeyan bisa ngowahi file dadi link luwih dhisik.",
"err_ssgen": "Gagal nggawe screenshoot.\n\n{exc}",
"up_msg": "☑️ Screenshot generasi kasil.\n\n{namma} (<code>{id}</code>)\n#️⃣ #ssgen #id{id}\n\nSS Digawe dening @{bot_uname} ",
"no_reply": "Bales menyang video utawa dokumen Telegram utawa gunakake link langsung sawise printah kanggo ngasilake screenshot saka media!",
"choose_no_ss": "Saiki pilih pira asil kanggo screenshot? 🥳.\n\nTotal durasi: `{td}` (`{dur} detik`)"
}

View file

@ -0,0 +1,13 @@
{
"sudo_join_msg": "Waw, Pemilikku sing ganteng gabung menyang grup!",
"log_bot_added": "#GrupBaru\nGrup = {ttl}(<code>{cid}</code>)\nJumlah Anggota = <code>{tot}</code>\nDitambahake dening - {r_j}",
"support_btn": "Dukungan",
"help_btn": " Pitulungan",
"update_btn": "📢 Nganyari",
"chat_not_allowed": "<b>CHAT ORA DIIJINKE 🐞\n\nPemilik ku wes nglarang aku kerja neng kene! Sampeyan bisa hubungi pemilik bot iki..</b>",
"welcome_thanks": "<b>Terimakasih wis nambahi saya ing {ttl} ❣️\n\nYen ana kendal utawa saran bisa hubungi saya.</b>",
"capt_welc": "Hai {umention} [<code>{uid}</code>], sugeng rawuh ing grup {ttl}.",
"combot_msg": "<b>Larangan Federasi #CAS</b>\nPengguna {umention} [<kode>{uid}</code>] dideteksi minangka spambot lan wis dibusak. Powered by <a href='https://api.cas.chat/check?user_id={u.id}'>Combot AntiSpam.</a>",
"spamwatch_msg": "<b>Larangan Federasi #SpamWatch</b>\nPengguna {umention} [<code>{uid}</code>] wis dibusak amarga <code>{reas}</code>.\n" ,
"welcpic_msg": "Sugeng Rawuh {userr} [{id}]"
}

View file

@ -0,0 +1 @@
{}

View file

@ -0,0 +1,5 @@
{
"language_changed_successfully": "Basa wis kasil diganti.",
"language_changer_chat": "Ing kene sampeyan bisa ngganti basa sing digunakake kanggo bot sajrone obrolan.\nYen basa sampeyan ora ana ing kene lan sampeyan pengin nyumbang, sampeyan bisa mbukak masalah ing githubku. .",
"language_changer_private": "Ing kene sampeyan bisa ngganti basa sing digunakake kanggo bot ing obrolan pribadi iki.\n\nYen sampeyan pengin ngganti basa grup sampeyan, bukak printah <code>/setchatlang</code>. \nYen basa sampeyan ora ana ing kene lan sampeyan pengin nyumbang, bukak repo misskaty."
}

4
locales/id-JW/main.json Normal file
View file

@ -0,0 +1,4 @@
{
"language_name": "Jawa",
"language_flag": "💫​"
}

View file

@ -0,0 +1,15 @@
{
"sub_extr_help": "Gunakake printah /{cmd} [link] kanggo mriksa subtitle utawa audio ing file video.",
"conv_sub_help": "Gunakake printah /{cmd} kanthi mbales berkas .ass utawa .vtt, kanggo ngowahi subtitle saka .ass utawa .vtt dadi srt.",
"progress_str": "⏳ Ngolah panjalukmu..",
"convert_str": "⏳ Ngonversi...",
"unauth_cb": "⚠️ Akses Ditolak!",
"cancel_btn": "❌ Rasido",
"invalid_cb": "⚠️ AJA Mbusak PESAN!",
"up_str": "Ngunggahaké berkas..",
"press_btn_msg": "Pencet tombol ing ngisor iki kanggo ngekstrak subtitle/audio. Mung ndhukung link langsung saiki.\nDiproses ing {timelog}",
"fail_extr_media": "Media ekstrak sing gagal, priksa manawa pranala sampeyan ora direksa WAF utawa ora bisa diakses kanggo bot.",
"fail_extr_sub": "Gagal ekstrak sub, Mungkin format ora didhukung..\n\nLink: {link}\nERR: {e}",
"capt_extr_sub": "<b>Jeneng berkas:</b> <kode>{nf}</code>\n\nDiekstrak saka @{bot} ing {timelog}",
"capt_conv_sub": "<kode>{nf}.srt</code>\n\nDiowahi dening @{bot}"
}

View file

@ -0,0 +1,11 @@
{
"processing_text": "`Pengolahan, wektu total adhedhasar ukuran berkas panjenengan...`",
"wait_msg": "`Tulung enteni sedhela...`",
"err_link": "Kayak'e pranala sing dikirim ora valid, priksa link langsung lan bisa diundhuh.",
"media_invalid": "Mangga mbales media sing bener.",
"dl_limit_exceeded": "Nuwun sewu, download diwatesi 2GB kanggo nyuda flood. Sampeyan bisa ngowahi file dadi link.",
"dl_args_text": "Nyoba ngundhuh..",
"mediainfo_help": "Gunakake printah /{cmd} [link], utawa bales media telegram nganggo /{cmd}.",
"capt_media": " Hasil mediainfo sampeyan..\n\n**Panjalukan Saka:** {ment}",
"viweb": "💬 Bukak Web"
}

View file

@ -0,0 +1,17 @@
{
"nmd_disabled": "Mode wengi dipateni.",
"nmd_not_enabled": "Mode wengi ora diaktifake ing obrolan iki.",
"invalid_time_format": "Format wektu ora valid. Gunakake format HH:MM.",
"invalid_lockdur": "Suwene wektu ora bener. Gunakake format sing bener.\nConto: 6h (6 jam), 10m kanggo 10 menit.",
"schedule_already_on": "Wis ana jadwal ing obrolan iki. Pateni nganggo gendéra `-d`.",
"nmd_enable_success": "Kasil ngaktifake mode wengi ing obrolan iki.\nGrup bakal dikunci ing {st} lan bakal dibukak sawise {lockdur} saben dina.",
"nmd_cb": "🔖 Hai, Aku {bname} digawe nganggo Framework Pyrogram v{ver} lan Python v{pyver}.\n\nMau gawe bot kaya iki? Yuuk belajar di @botindonesia\nOwner: @YasirArisM",
"nmd_off_not_admin": "#NIGHTMODE_FAIL\nGagal mateni nightmode ing `{chat_id}`, amarga {bname} dudu admin ing chat `{chat_id}`",
"nmd_off_not_present": "#NIGHTMODE_FAIL\nGagal mateni nightmode ing `{chat_id}`, amarga {bname} ora ana ing chat `{chat_id}`. Dibusak grup saka dhaptar.",
"nmd_off_err": "#NIGHTMODE_FAIL\nGagal mateni nightmode ing `{chat_id}`\nERROR: `{e}`",
"nmd_off_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n☀ Grup dibukak.\nBakal ditutup jam {close_at}",
"nmd_on_not_admin": "#NIGHTMODE_FAIL\nGagal ngaktifake mode wengi ing `{chat_id}`, amarga {bname} dudu admin ing chat `{chat_id}`",
"nmd_on_not_present": "#NIGHTMODE_FAIL\nGagal ngaktifake mode wengi ing `{chat_id}`, amarga {bname} ora ana ing obrolan `{chat_id}`. Grup dibusak saka dhaptar.",
"nmd_on_err": "#NIGHTMODE_FAIL\nGagal ngaktifake mode wengi ing `{chat_id}`\nERROR: `{e}`",
"nmd_on_success": "#NIGHTMODE_HANDLER\n📆 {dt}\n\n🌗 Grup ditutup.\nBakal dibukak ing {open_at}"
}

6
locales/id-JW/ocr.json Normal file
View file

@ -0,0 +1,6 @@
{
"no_photo": "Bales foto nganggo printah /{cmd} kanggo mindhai teks saka gambar.",
"read_ocr": "Mindai gambar sampeyan..",
"result_ocr": "Hasil OCR:\n<kode>{result}</code>",
"ocr_helper": "/ocr [reply to photo] - Waca Teks Saka Gambar"
}

View file

@ -0,0 +1,13 @@
{
"no_uname": "<code>Ora Username</code>",
"no_last_name": "<kode>Ora Ana Jeneng mburi</code>",
"uname_change_msg": "✨ Username diganti saka {bef} ➡️ {aft}.\n",
"lastname_change_msg": "✨ Ganti jeneng mburi saka {bef} ➡️ {aft}.\n",
"firstname_change_msg": "✨ Ganti jeneng ngarep saka {bef} ➡️ {aft}.\n",
"set_sangmata_help": "Gunakake <code>/{cmd} on</code>, kanggo ngaktifake sangmata. Yen sampeyan pengin mateni, sampeyan bisa nggunakake parameter mati.",
"sangmata_already_on": "SangMata wis diaktifake ing grup sampeyan.",
"sangmata_enabled": "Sangmata diaktifake ing grup sampeyan.",
"sangmata_already_off": "SangMata wis dipateni ing grup sampeyan.",
"sangmata_disabled": "Sangmata dipateni ing grup sampeyan.",
"wrong_param": "Parameter sing ora dingerteni, gunakake mung parameter aktif/mati."
}

View file

@ -0,0 +1,11 @@
{
"newgroup_log": "#NewGroup\nGroup = {jdl}(<code>{id}</code>)\nJumlah Anggota = <code>{c}</code>",
"newuser_log": "#NewUser\nID - <code>{id}</code>\nJeneng - {nm}",
"help_name": "Iki bantuan kanggo **{mod}**:\n",
"help_txt": "Halo {kamuh}, jenengku {bot}.\nAku bot pyrogram sing dikembangake dening pemilik apik karo sawetara fitur migunani.\nSampeyan bisa ndeleng kanthi ngeklik tombol ing ngisor iki.\n\nPrentah umum yaiku :\n - /start: Miwiti bot\n - /help: Wenehi pesen iki\n - /setlang: Ganti basa bot [BETA]",
"click_me": "Klik Aku",
"back_btn": "Mbalik",
"click_btn": "Klik tombol ing ngisor iki kanggo njaluk bantuan babagan {nm}",
"pm_detail": "PM Aku Kanggo Rincian Liyane.",
"start_msg": "Halo {kamuh}, PM aku kanggo ngerti kabeh fiturku. Sampeyan bisa ngganti basa bot ing bot nggunakake perintah /setlang nanging isih ing tahap beta."
}

View file

@ -0,0 +1,19 @@
{
"no_anim_stick": "Stiker animasi ora didhukung!",
"not_sticker": "Iki dudu stiker!",
"unkang_msg": "Nyoba nyopot saka pack..",
"unkang_success": "Stiker wis dibusak saka pack panjenengan",
"unkang_error": "Gagal mbusak stiker saka paket sampeyan.\n\nERR: {e}",
"unkang_help": "Mangga wangsulana stiker sing digawe {c} kanggo mbusak stiker saka paket sampeyan.",
"anon_warn": "Sampeyan anon admin, kang stiker ing pmku.",
"kang_msg": "Nyolong stiker sampeyan...",
"stick_no_name": "Stiker ora ana jeneng.",
"kang_help": "Arep tak tebak stikere? Mangga tag stiker.",
"exist_pack": "<code>Nganggo paket stiker sing ana...</code>",
"new_packs": "<b>Nggawe pak stiker anyar...</b>",
"please_start_msg": "Koyone sampeyan ora tau sesambungan karo aku ing obrolan pribadi, sampeyan kudu nglakoni dhisik..",
"click_me": "Klik Aku",
"pack_full": "Paket Stiker sampeyan kebak yen paket sampeyan ora ana ing tipe v1 /kang 1, yen ora ana ing Tipe v2 /kang 2 lan sapiturute.",
"viewpack": "👀 Deleng Paket",
"kang_success": "<b>Stiker kasil dicolong!</b>\n<b>Emoji:</b> {emot}"
}

View file

@ -0,0 +1,20 @@
{
"no_result": "Nuwun sewu, kula mboten nemu kasil!",
"no_result_w_query": "Nuwun sewu, kula mboten saged manggihaken pitakon: {kueri}",
"get_data": "⏳ Mangga dienteni, lagi njupuk data saka web..",
"cl_btn": "❌ Tutup",
"back_btn": "↩️ Mbalik",
"dl_text": "⬇️ Unduh",
"cat_text": "💠 Kategori",
"kualitas": "Kwalitas",
"ex_data": "👇 Ekstrak Data ",
"unauth": "Tombol iki dudu kanggo sampeyan..",
"invalid_cb": "Data callback ora valid, kirim printah maneh..",
"res_scrape": "<b>Asil scrape saka</b> <kode>{link}</code>:\n\n{kl}",
"header_with_query": "<b>Asil Nggoleki #{web} Kanggo:</b> <code>{kueri}</code>\n\n",
"header_no_query": "<b>#{web} Paling anyar:</b>\n🌀 Gunakake /{cmd} [judhul] kanggo miwiti nggoleki kanthi judhul.\n\n",
"invalid_cmd_scrape": "Gunakake prentah /{cmd} <b>[link]</b> kanggo ngunduh pranala kethokan",
"err_getweb": "ERROR: Gagal njupuk data saka web amarga {err}.",
"err_getapi": "ERROR: Gagal njupuk data saka API",
"unsupport_dl_btn": "Sawetara asil ora bakal katon ing tombol ekstrak amarga pranala ora didhukung."
}

6
locales/id-JW/webss.json Normal file
View file

@ -0,0 +1,6 @@
{
"no_url": "Wenehana url kanggo njupuk screenshot.",
"wait_str": "Lagi njupuk gambar layar...",
"str_credit": "🌞 Screenshot digawe nganggo Puppeteer",
"ss_failed_str": "Gagal njupuk gambar. ERROR: {err}"
}

View file

@ -0,0 +1,14 @@
{
"no_channel": "Fitur iki ora didhukung kanggo channel utawa pangguna anonim.",
"no_query": "Mangga lebokna url sing kepengen mbok unduh..!",
"no_res": "Ora ana asil kanggo `{kweri}`",
"dl_btn": "Ngunduh",
"back": "Mbalik",
"yts_msg": "Diterbitake {pub}\n\n<b> Duration:</b> {dur}\n<b> Ndeleng:</b> {vi}\n<b> Uploader:</b> <a href='{clink}'>{cname}</a>\n\n",
"invalid_link": "Mangga lebokna URL Dhukungan YT-DLP sing valid",
"err_parse": "Gagal ngurai URL, mriksa log..",
"ngenteni": "Tulung ngenteni..",
"unauth": "Ora Tugasmu..",
"endlist": "Iku pungkasan dhaptar",
"vip-btn": "Amarga sawetara pangguna penyalahgunaan, video paling apik saiki mung sing nduwe bot iki."
}

79
misskaty/__init__.py Normal file
View file

@ -0,0 +1,79 @@
# * @author Yasir Aris M <yasiramunandar@gmail.com>
# * @date 2023-06-21 22:12:27
# * @projectName MissKatyPyro
# * Copyright ©YasirPedia All rights reserved
import time
from logging import ERROR, INFO, StreamHandler, basicConfig, getLogger, handlers
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from async_pymongo import AsyncClient
from pymongo import MongoClient
from pyrogram import Client
from misskaty.core import misskaty_patch
from misskaty.vars import (
API_HASH,
API_ID,
BOT_TOKEN,
DATABASE_NAME,
DATABASE_URI,
TZ,
USER_SESSION,
)
basicConfig(
level=INFO,
format="[%(asctime)s - %(levelname)s] - %(name)s.%(funcName)s - %(message)s",
datefmt="%d-%b-%y %H:%M:%S",
handlers=[
handlers.RotatingFileHandler("MissKatyLogs.txt", mode="w+", maxBytes=1000000),
StreamHandler(),
],
)
getLogger("pyrogram").setLevel(ERROR)
getLogger("openai").setLevel(ERROR)
getLogger("httpx").setLevel(ERROR)
MOD_LOAD = []
MOD_NOLOAD = ["subscene_dl"]
HELPABLE = {}
cleanmode = {}
botStartTime = time.time()
misskaty_version = "v2.10.13 - Stable"
# Pyrogram Bot Client
app = Client(
"MissKatyBot",
api_id=API_ID,
api_hash=API_HASH,
bot_token=BOT_TOKEN,
mongodb=dict(connection=AsyncClient(DATABASE_URI), remove_peers=False),
)
# Pyrogram UserBot Client
user = Client(
"YasirUBot",
session_string=USER_SESSION,
)
jobstores = {
"default": MongoDBJobStore(
client=MongoClient(DATABASE_URI), database=DATABASE_NAME, collection="nightmode"
)
}
scheduler = AsyncIOScheduler(jobstores=jobstores, timezone=TZ)
app.start()
BOT_ID = app.me.id
BOT_NAME = app.me.first_name
BOT_USERNAME = app.me.username
if USER_SESSION:
user.start()
UBOT_ID = user.me.id
UBOT_NAME = user.me.first_name
UBOT_USERNAME = user.me.username
else:
UBOT_ID = None
UBOT_NAME = None
UBOT_USERNAME = None

Some files were not shown because too many files have changed in this diff Show more