Skip to content
This repository was archived by the owner on Dec 2, 2024. It is now read-only.

Commit eb2bae6

Browse files
New docs (also 2.5.0 release)
- added subcommands - upgraded docs.
1 parent 2fe4ea5 commit eb2bae6

39 files changed

+914
-96
lines changed

MeowerBot/API.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
class MeowerAPI:
66
base_uri = "https://api.meower.org/"
77

8-
def __init__(self, token, username):
8+
def __init__(self, username):
99

1010
self.session = requests.session()
11-
self.session.headers.update({"token": token, "usename": username})
11+
self.session.headers.update({"usename": username})
12+
13+
def login(self, token):
14+
self.session.headers.update({"token": token})
1215

1316
def get_page(self, page=1, chatid="home"):
1417
if chatid == "home":

MeowerBot/Bot.py

Lines changed: 73 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
import time
1919
import logging
2020

21-
from websocket._exceptions import WebSocketConnectionClosedException
21+
from .API import MeowerAPI
22+
23+
from websocket._exceptions import WebSocketConnectionClosedException, WebSocketException
2224

2325

2426
class Bot:
@@ -53,6 +55,7 @@ def _t_ping(self):
5355
def __init__(self, prefix=None, autoreload: int or None = None): #type: ignore
5456
self.wss = CloudLink()
5557
self.callbacks = {}
58+
self._last_to = "Home"
5659

5760
self.wss.callback(
5861
"on_packet", self._debug_fix
@@ -70,8 +73,8 @@ def __init__(self, prefix=None, autoreload: int or None = None): #type: ignore
7073

7174
if autoreload:
7275
self.autoreload = True
73-
self.autoreload_time = autoreload + 1
74-
self.autoreload_original = autoreload + 1
76+
self.autoreload_time = min(autoreload, 1)
77+
self.autoreload_original = min(autoreload, 1)
7578
else:
7679
self.autoreload = False
7780
self.autoreload_time = 0
@@ -209,7 +212,7 @@ def _handle_status(self, status, listener):
209212
"https://webhooks.meower.org/post/home",
210213
json={
211214
"post": "ERROR: MeowerBot.py Webhooks Logging\n\n Account Softlocked.",
212-
"username": self.username,
215+
"username": self.username,
213216
},
214217
)
215218
print("CRITICAL ERROR! ACCOUNT SOFTLOCKED!!!!.", file=sys.__stdout__)
@@ -225,10 +228,13 @@ def _handle_status(self, status, listener):
225228

226229
elif listener == "__meowerbot__send_message":
227230
if status == "I:100 | OK":
231+
self.autoreload_time = self.autoreload_original
228232
return # This is just checking if a post went OK
229-
230-
self.autoreload_time = self.autoreload_original #autoreload time should reset if
233+
#autoreload time should reset if
234+
235+
231236
raise RuntimeError("Post Failed to send")
237+
232238

233239
def callback(self, callback, cbid=None):
234240
"""Connects a callback ID to a callback"""
@@ -243,10 +249,7 @@ def __handle_close__(self, *args, **kwargs):
243249
if self.autoreload:
244250
self.autoreload = False #to stop race condisons
245251
self.logger_in = True
246-
if not self.autoreload_time >= 100: self.autoreload_time *= 1.2
247-
248-
else:
249-
self.autoreload_time = 100
252+
self.autoreload_time *= 1.2
250253

251254

252255
time.sleep(self.autoreload_time)
@@ -294,8 +297,15 @@ def __handle_packet__(self, packet):
294297

295298
elif packet["cmd"] == "direct":
296299
listener = packet.get("listener")
300+
301+
if listener == "mb_get_chat_list":
302+
self.run_cb("chat_list", args=(packet["val"]["payload"], listener))
303+
elif listener == "__meowerbot__login":
304+
self.api.login(packet['val']['payload']['token'])
297305
self.run_cb("direct", args=(packet["val"], listener))
298306

307+
308+
299309
else:
300310
listener = packet.get("listener")
301311
self.run_cb(packet["cmd"], args=(packet["val"], listener))
@@ -317,22 +327,29 @@ def run_command(self, message):
317327
self.run_cb("error", args=(e,))
318328

319329
def send_msg(self, msg, to="home"):
320-
if to == "home":
321-
self.wss.sendPacket(
322-
{
323-
"cmd": "direct",
324-
"val": {"cmd": "post_home", "val": msg},
325-
"listener": "__meowerbot__send_message",
326-
}
327-
)
328-
else:
329-
self.wss.sendPacket(
330-
{
331-
"cmd": "direct",
332-
"val": {"cmd": "post_chat", "val": {"chatid": to, "p": msg}},
333-
"listener": "__meowerbot__send_message",
334-
}
335-
)
330+
self._last_to = to
331+
self._last_sent = msg
332+
try:
333+
if to == "home":
334+
self.wss.sendPacket(
335+
{
336+
"cmd": "direct",
337+
"val": {"cmd": "post_home", "val": msg},
338+
"listener": "__meowerbot__send_message",
339+
}
340+
)
341+
else:
342+
self.wss.sendPacket(
343+
{
344+
"cmd": "direct",
345+
"val": {"cmd": "post_chat", "val": {"chatid": to, "p": msg}},
346+
"listener": "__meowerbot__send_message",
347+
}
348+
)
349+
#socket is closed, use webhooks
350+
except WebSocketException as e:
351+
self.run_cb(cbid="error", args=(e,))
352+
336353

337354
def send_typing(self, to="home"):
338355
if to == "home":
@@ -361,7 +378,7 @@ def send_typing(self, to="home"):
361378
},
362379
}
363380
)
364-
381+
365382
def enter_chat(self, chatid="livechat"):
366383
self.wss.sendPacket(
367384
{
@@ -376,6 +393,34 @@ def enter_chat(self, chatid="livechat"):
376393
}
377394
)
378395

396+
def create_chat(self, name):
397+
"""
398+
Unstable, use at your own risk
399+
400+
comes with callbacks: chat_list
401+
"""
402+
self.wss.sendPacket({
403+
"cmd": "direct",
404+
"val": {
405+
"cmd": "create_chat",
406+
"val": name
407+
},
408+
"listener": "mb_create_chat"
409+
})
410+
411+
time.sleep(secs=0.5)
412+
413+
self.wss.sendPacket({
414+
"cmd": "direct",
415+
"val": {
416+
"cmd": "get_chat_list",
417+
"val": {
418+
"page": 1
419+
}
420+
},
421+
"listener": "mb_get_chat_list"
422+
})
423+
379424

380425
def run(self, username, password, server="wss://server.meower.org"):
381426
"""
@@ -391,6 +436,7 @@ def run(self, username, password, server="wss://server.meower.org"):
391436
self.logger = logging.getLogger(f"MeowerBot {self.username}")
392437
self.server = server
393438
self.wss.client(server)
439+
self.api = API(self)
394440

395441
if self.bad_exit:
396442
raise BaseException("Bot Account Softlocked")

MeowerBot/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
66
"""
77

8-
__version__ = "2.4.6"
8+
__version__ = "2.5.0"
99

1010

1111
# Public library imports

MeowerBot/cog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .command import AppCommand
1+
from .command import AppCommand, command
22
import weakref
33

44

MeowerBot/command.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,33 @@ def __init__(self, func, name=None, args=0):
1515

1616
self.arg_names = inspect.getfullargspec(func)[0]
1717
self.arg_types = func.__annotations__
18+
self.subcommands = {}
1819

1920
def __call__(self, *args):
2021
raise RuntimeError("AppCommand is not callable")
2122

2223
def register_class(self, con):
2324
self.connected = con
2425

26+
def subcommand(self, name=None, args=0):
27+
def inner(func):
28+
29+
cmd = AppCommand(func, name=name, args=args)
30+
cmd.register_class(self.connected)
31+
32+
self.subcommands[name] = cmd.info()
33+
34+
35+
return func #dont want mb to register this as a root command
36+
37+
return inner
38+
2539
def run_cmd(self, ctx, *args):
40+
41+
if self.subcommands and (args[0] if len(args) >= 1 else None) in self.subcommands:
42+
self.subcommands[args[0]]["command"].run_cmd(ctx, *args[1:])
43+
return
44+
2645
if not self.args == 0:
2746
args = args[: self.args]
2847

@@ -39,6 +58,7 @@ def info(self):
3958
"arg_types": self.arg_types,
4059
"command": self,
4160
"func": self.func,
61+
4262
}
4363
}
4464

MeowerBot/context.py

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,22 @@
77
from .Bot import Bot
88

99
import weakref
10+
import requests
1011

1112

1213
class User:
1314
def __init__(self, bot, username):
1415
self.username = username
15-
self._raw = None
16-
16+
1717
self.bot = bot
18-
self.bot.wss.sendPacket(
19-
{
20-
"cmd": "direct",
21-
"val": {"cmd": "get_profile", "val": self.username},
22-
"listener": f"get_user_{self.username}",
23-
}
24-
)
25-
26-
self.level = 0
27-
self.pfp = 0
28-
self.quote = ""
29-
30-
def _handle_usr_data(self, val, listener):
31-
if listener is None:
32-
return
33-
if listener is not f"get_user_{self.username}":
34-
return
35-
if "mode" not in val or not val["mode"] == "profile":
36-
return
37-
38-
# checks are finaly over lmao
39-
self._raw = val["payload"]
18+
self._raw = self.bot.api.get_user(self.username)
19+
4020
self.level = self._raw["lvl"]
4121
self.pfp = self._raw["pfp_data"]
4222
self.quote = self._raw["quote"]
4323

24+
25+
4426
def ping(self, msg, to="home"):
4527
self.bot.send_msg(f"@{self.username} {msg}", to=to)
4628

docs/index.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,17 @@
11
# MeowerBot.py Docs
22

3+
<!-- warning -->
4+
<table><td>:warning: These docs assume you actualy are fairly competent in python. Or have atleast learned OOP. </td></table>
5+
6+
This guide is for MeowerBot.py v2.5.0
7+
38
- [refrence](./refrence/)
9+
- [methods](./refrence/methods/) (only including cuz important)
410
- [tutorial](./tutorial/)
11+
12+
## What is MeowerBot.py?
13+
14+
MeowerBot.py is a Bot library for https://meower.org (open source at https://github.com/meower-media-co/)
15+
16+
MeowerBot.py itself is located at https://github.com/meower-community/MeowerBot.py
17+

docs/refrence/callbacks/close.md

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@
55
This callback gets called when the bot`s wss closes
66

77
## args
8-
9-
### bot
10-
11-
A required keyword argument
12-
13-
The bot object
8+
- bot: MeowerBot.Bot
149

1510
## example
1611

docs/refrence/callbacks/error.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ This callback gets called when an exception gets raised.
55

66
## args
77

8-
### error
8+
- error: Exception
9+
The error that caused this callback to get called
910

10-
The error that caused this callback to get called
1111

12-
### bot
13-
14-
A required keyword argument
12+
- bot: MeowerBot.Bot
1513

1614
## example
1715

docs/refrence/callbacks/login.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ bot = Bot()
2727
def login(bot=bot):
2828
print(f"logged in as {bot.username} with prefix {bot.prefix}")
2929

30-
bot.callback(login)
30+
bot.callback(login, cbid="login") # when cbid is not specified it defaults to the function name (in this case "login")
3131
```
3232

0 commit comments

Comments
 (0)