forked from kate/uniborg
This commit is contained in:
commit
699ac98b05
|
@ -2,4 +2,5 @@ venv
|
||||||
__pycache__
|
__pycache__
|
||||||
|
|
||||||
*.session
|
*.session
|
||||||
|
*.session-journal
|
||||||
data/
|
data/
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
# uniborg
|
||||||
|
|
||||||
|
Pluggable [``asyncio``](https://docs.python.org/3/library/asyncio.html)
|
||||||
|
[Telegram](https://telegram.org) userbot based on
|
||||||
|
[Telethon](https://github.com/LonamiWebs/Telethon).
|
||||||
|
|
||||||
|
## installing
|
||||||
|
|
||||||
|
Simply clone the repository and run the main file:
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/uniborg/uniborg.git
|
||||||
|
cd uniborg
|
||||||
|
python stdborg.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## design
|
||||||
|
|
||||||
|
The modular design of the project enhances your Telegram experience
|
||||||
|
through [plugins](https://github.com/uniborg/uniborg/tree/master/stdplugins)
|
||||||
|
which you can enable or disable on demand.
|
||||||
|
|
||||||
|
Each plugin gets the `borg`, `logger` and `storage` magical
|
||||||
|
[variables](https://github.com/uniborg/uniborg/blob/4805f2f6de7d734c341bb978318f44323ad525f1/uniborg/uniborg.py#L66-L68)
|
||||||
|
to ease their use. Thus creating a plugin as easy as adding
|
||||||
|
a new file under the plugin directory to do the job:
|
||||||
|
|
||||||
|
```python
|
||||||
|
# stdplugins/myplugin.py
|
||||||
|
from telethon import events
|
||||||
|
|
||||||
|
@borg.on(events.NewMessage(pattern='hi'))
|
||||||
|
async def handler(event):
|
||||||
|
await event.reply('hey')
|
||||||
|
```
|
||||||
|
|
||||||
|
## internals
|
||||||
|
|
||||||
|
The core features offered by the custom `TelegramClient` live under the
|
||||||
|
[`uniborg/`](https://github.com/uniborg/uniborg/tree/master/uniborg)
|
||||||
|
directory, with some utilities, enhancements and the core plugin.
|
||||||
|
|
||||||
|
## learning
|
||||||
|
|
||||||
|
Check out the already-mentioned
|
||||||
|
[plugins](https://github.com/uniborg/uniborg/tree/master/stdplugins)
|
||||||
|
directory to learn how to write your own, and consider reading
|
||||||
|
[Telethon's documentation](http://telethon.readthedocs.io/).
|
|
@ -1 +1 @@
|
||||||
telethon-aio
|
telethon
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
||||||
import re
|
|
||||||
import random
|
|
||||||
import json
|
|
||||||
import urllib.request
|
|
||||||
import urllib.parse
|
|
||||||
|
|
||||||
from telethon import events
|
|
||||||
|
|
||||||
pats = []
|
|
||||||
oops = "OOPSIE WOOPSIE!! Uwu We madea fucky wucky!! A wittle fucko boingo! " \
|
|
||||||
"The code monkeys at our headquarters are working VEWY HAWD to fix " \
|
|
||||||
"this!"
|
|
||||||
|
|
||||||
|
|
||||||
@borg.on(events.NewMessage)
|
|
||||||
async def on_pat(event):
|
|
||||||
if event.fwd_from:
|
|
||||||
return
|
|
||||||
|
|
||||||
user = borg.me.username
|
|
||||||
|
|
||||||
if not user or not re.match(fr"(?i)/headpat@{user}", event.raw_text):
|
|
||||||
return
|
|
||||||
|
|
||||||
global pats
|
|
||||||
if not pats:
|
|
||||||
try:
|
|
||||||
pats = json.loads(urllib.request.urlopen(urllib.request.Request(
|
|
||||||
"http://headp.at/js/pats.json",
|
|
||||||
headers={"User-Agent": "Mozilla/5.0 (X11; U; Linux i686) "
|
|
||||||
"Gecko/20071127 Firefox/2.0.0.11"}
|
|
||||||
)).read().decode("utf-8"))
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
await event.reply(oops)
|
|
||||||
return
|
|
||||||
|
|
||||||
choice = urllib.parse.quote(random.choice(pats))
|
|
||||||
await event.reply(f"[Pat!](https://headp.at/pats/{choice})")
|
|
|
@ -6,9 +6,8 @@ from functools import partial
|
||||||
|
|
||||||
from telethon import events
|
from telethon import events
|
||||||
from telethon.tl.functions.messages import EditMessageRequest
|
from telethon.tl.functions.messages import EditMessageRequest
|
||||||
from telethon.extensions.markdown import (
|
from telethon.extensions.markdown import DEFAULT_URL_RE
|
||||||
DEFAULT_URL_RE, _add_surrogate, _del_surrogate
|
from telethon.utils import add_surrogate, del_surrogate
|
||||||
)
|
|
||||||
from telethon.tl.types import (
|
from telethon.tl.types import (
|
||||||
MessageEntityBold, MessageEntityItalic, MessageEntityCode,
|
MessageEntityBold, MessageEntityItalic, MessageEntityCode,
|
||||||
MessageEntityPre, MessageEntityTextUrl
|
MessageEntityPre, MessageEntityTextUrl
|
||||||
|
@ -19,7 +18,7 @@ def parse_url_match(m):
|
||||||
entity = MessageEntityTextUrl(
|
entity = MessageEntityTextUrl(
|
||||||
offset=m.start(),
|
offset=m.start(),
|
||||||
length=len(m.group(1)),
|
length=len(m.group(1)),
|
||||||
url=_del_surrogate(m.group(2))
|
url=del_surrogate(m.group(2))
|
||||||
)
|
)
|
||||||
return m.group(1), entity
|
return m.group(1), entity
|
||||||
|
|
||||||
|
@ -90,7 +89,7 @@ def parse(message, old_entities=None):
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
after = 0
|
after = 0
|
||||||
message = _add_surrogate(message)
|
message = add_surrogate(message)
|
||||||
while i < len(message):
|
while i < len(message):
|
||||||
for after, e in enumerate(old_entities[after:], start=after):
|
for after, e in enumerate(old_entities[after:], start=after):
|
||||||
# If the next entity is strictly to our right, we're done here
|
# If the next entity is strictly to our right, we're done here
|
||||||
|
@ -131,7 +130,7 @@ def parse(message, old_entities=None):
|
||||||
# Skip past the match
|
# Skip past the match
|
||||||
i += len(text)
|
i += len(text)
|
||||||
|
|
||||||
return _del_surrogate(message), entities + old_entities
|
return del_surrogate(message), entities + old_entities
|
||||||
|
|
||||||
|
|
||||||
@borg.on(events.MessageEdited(outgoing=True))
|
@borg.on(events.MessageEdited(outgoing=True))
|
||||||
|
|
|
@ -36,7 +36,9 @@ async def remove(event):
|
||||||
await event.delete()
|
await event.delete()
|
||||||
shortname = event.pattern_match["shortname"]
|
shortname = event.pattern_match["shortname"]
|
||||||
|
|
||||||
if shortname in borg._plugins:
|
if shortname == "_core":
|
||||||
|
msg = await event.respond(f"Not removing {shortname}")
|
||||||
|
elif shortname in borg._plugins:
|
||||||
borg.remove_plugin(shortname)
|
borg.remove_plugin(shortname)
|
||||||
msg = await event.respond(f"Removed plugin {shortname}")
|
msg = await event.respond(f"Removed plugin {shortname}")
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue