Skip to content
This repository was archived by the owner on Sep 1, 2022. It is now read-only.

Commit 5ddbf6d

Browse files
committed
v2.3
Made bot poll from user Added VK attachment bug workaround --- I promised not to deploy on friday But I'm tired and I hate VK
1 parent b8378a9 commit 5ddbf6d

File tree

9 files changed

+49
-32
lines changed

9 files changed

+49
-32
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ The syntax for config is the following:
9595
```ini
9696
[forwarding-bot]
9797
BOT_TOKEN =
98-
GROUP_TOKEN =
98+
USER_TOKEN =
9999
SOURCE_ID =
100100
DESTINATION_ID =
101101
```

forwarding_bot/arguments/_parser.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from forwarding_bot.__version__ import __version__
44
from .models import ArgsModel
55
from typing import Union
6+
from distutils.util import strtobool
67

78

89
class ArgParser:
@@ -15,12 +16,15 @@ def __init__(self):
1516
version=f"forwarding-bot {__version__}")
1617
self.parser.add_argument("-b", "--bot-token", help="TG bot token",
1718
type=str)
18-
self.parser.add_argument("-g", "--group-token", help="VK group token",
19+
self.parser.add_argument("-u", "--user-token", help="VK user token",
1920
type=str)
2021
self.parser.add_argument("-s", "--source-id", help="VK source conversation id",
2122
type=int)
2223
self.parser.add_argument("-d", "--destination-id", help="TG destination conversation id",
2324
type=int)
25+
self.parser.add_argument('--limited-attachments', help="Limited attachments mode, re-asks for the message "
26+
"attachments to ensure attachment parsing",
27+
type=lambda x: bool(strtobool(x)), nargs='?', const=True, default=None)
2428

2529
def get_args(self) -> Union[argparse.Namespace, ArgsModel]:
2630
"""Using namespace because it is in fact a Namespace, but linting should be according to ArgsModel"""

forwarding_bot/arguments/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class ArgsModel:
22
"""Argparse output namespace schema to make linters work"""
33
bot_token: str
4-
group_token: str
4+
user_token: str
55
destination_id: str
66
source_id: str
7+
limited_attachments: bool

forwarding_bot/config/_data.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from os import environ
44
from os.path import join
55
from pathlib import Path
6-
from typing import Union
6+
from typing import Optional
77

88
from forwarding_bot.arguments import ArgsModel, ArgParser
99

@@ -17,10 +17,11 @@ class DataConfig:
1717
"""Class that provides loading of all of the config sources by priority"""
1818

1919
def __init__(self):
20-
self.bot_token: Union[None, str] = None
21-
self.group_token: Union[None, str] = None
22-
self.destination_id: Union[None, int] = None
23-
self.source_id: Union[None, int] = None
20+
self.bot_token: Optional[str] = None
21+
self.user_token: Optional[int] = None
22+
self.destination_id: Optional[int] = None
23+
self.source_id: Optional[int] = None
24+
self.limited_attachments: Optional[bool] = None
2425

2526
def load(
2627
self,
@@ -41,9 +42,10 @@ def load_cli(self, arguments: ArgsModel):
4142
logger.debug("Loading CLI args")
4243

4344
self.bot_token = arguments.bot_token
44-
self.group_token = arguments.group_token
45+
self.user_token = arguments.user_token
4546
self.destination_id = arguments.destination_id
4647
self.source_id = arguments.source_id
48+
self.limited_attachments = arguments.limited_attachments
4749

4850
def load_ini(self, config_: ConfigParser):
4951
logger.debug("Loading ini config")
@@ -55,23 +57,26 @@ def load_ini(self, config_: ConfigParser):
5557
if not self.bot_token and config.get("BOT_TOKEN"):
5658
self.bot_token = config["BOT_TOKEN"]
5759

58-
if not self.group_token and config.get("GROUP_TOKEN"):
59-
self.group_token = config["GROUP_TOKEN"]
60+
if not self.user_token and config.get("USER_TOKEN"):
61+
self.user_token = config["USER_TOKEN"]
6062

6163
if not self.destination_id and config.get("DESTINATION_ID"):
6264
self.destination_id = config.getint("DESTINATION_ID")
6365

6466
if not self.source_id and config.get("SOURCE_ID"):
6567
self.source_id = config.getint("SOURCE_ID")
6668

69+
if not self.limited_attachments and "LIMITED_ATTACHMENTS" in config:
70+
self.limited_attachments = config.getboolean("LIMITED_ATTACHMENTS")
71+
6772
def load_environ(self, environment):
6873
logger.debug("Loading environ")
6974

7075
if self.bot_token is None:
7176
self.bot_token = environment.get("FORWARDING_BOT_BOT_TOKEN")
7277

73-
if self.group_token is None:
74-
self.group_token = environment.get("FORWARDING_BOT_GROUP_TOKEN")
78+
if self.user_token is None:
79+
self.user_token = environment.get("FORWARDING_BOT_USER_TOKEN")
7580

7681
if self.destination_id is None:
7782
self.destination_id = int(environment.get("FORWARDING_BOT_DESTINATION_ID", 0))

forwarding_bot/vk/_blueprint/blueprint.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from asyncio import sleep
33

44
import aiohttp
5-
from vkbottle.bot import Blueprint, Message
65
from vkbottle.api import API
6+
from vkbottle.user import Blueprint, Message
77

88
from forwarding_bot.config import data_config
99
from . import attachment_handlers, fwd_handlers
@@ -17,16 +17,18 @@
1717
@bot_bp.on.chat_message()
1818
async def handler(message: Message) -> None:
1919
"""Default handler that handles every message"""
20-
api = API(data_config.group_token)
21-
# Workaround to avoid VK event ignoring attachments
22-
message_data = (await api.messages.get_by_id(message_ids=message.id)).items[0]
23-
message.attachments = message_data.attachments
24-
#
25-
request_params = RequestHelper.get_params(bot=bot_bp)
20+
api = API(data_config.user_token)
21+
if data_config.limited_attachments:
22+
# VK attachment limit workaround
23+
message_id = message.id
24+
message_data = (await api.messages.get_by_id(message_ids=[message_id])).items[0]
25+
message.attachments = message_data.attachments
26+
27+
request_params = RequestHelper.get_params()
2628

2729
session = aiohttp.ClientSession()
2830
if not message.fwd_messages:
29-
sender = await MessageHelper.get_sender(data_config.group_token, message)
31+
sender = await MessageHelper.get_sender(data_config.user_token, message)
3032
formatted_message = "{}:\n{}".format(MessageHelper.get_name(
3133
sender), MessageHelper.get_text(message.text))
3234
attachments = MessageHelper.get_valid_attachments(message)

forwarding_bot/vk/_blueprint/fwd_handlers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ async def walk_message_tree(node: Message, depth: int = 0):
4242
if message.from_id in sender_cache:
4343
sender = sender_cache[message.from_id]
4444
else:
45-
sender = await MessageHelper.get_sender(data_config.group_token, message)
45+
sender = await MessageHelper.get_sender(data_config.user_token, message)
4646
sender_cache[message.from_id] = sender
4747

4848
result.append(ParsedMessage(

forwarding_bot/vk/_blueprint/helpers/request.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
import logging
2-
from typing import Union, List
2+
from random import randint
3+
from typing import List
34

45
from aiohttp import ClientSession, FormData
5-
from vkbottle.bot import Blueprint
6-
from vkbottle.bot import Bot
76
from vkbottle.types.objects.docs import Doc
8-
from vkbottle.types.objects.photos import Photo
97
from vkbottle.types.objects.messages import AudioMessage, MessageAttachment
8+
from vkbottle.types.objects.photos import Photo
109

1110
from forwarding_bot.config import data_config
1211
from ..settings import parse_mode, api_url
1312

1413
logger = logging.getLogger("forwarding-bot")
14+
RANGE_MAX = int(2e9)
15+
16+
17+
def get_random_id() -> int:
18+
"""Random id generator"""
19+
return randint(1, RANGE_MAX)
1520

1621

1722
class BadDoctypeError(Exception):
@@ -23,9 +28,9 @@ def __str__(self):
2328

2429
class RequestHelper:
2530
@staticmethod
26-
def get_params(bot: Union[Bot, Blueprint]) -> dict:
31+
def get_params() -> dict:
2732
return {
28-
"random_id": bot.extension.random_id(),
33+
"random_id": get_random_id(),
2934
"chat_id": data_config.destination_id,
3035
"parse_mode": parse_mode
3136
}

forwarding_bot/vk/_bot.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import logging
22

3-
from vkbottle import Bot
3+
from vkbottle import User
44

55
from forwarding_bot.config import data_config
66
from forwarding_bot.vk._middleware import middleware_bp
@@ -11,12 +11,12 @@
1111

1212
class VKBot:
1313
def __init__(self):
14-
self.bot = Bot(data_config.group_token, debug="DEBUG")
14+
self.bot = User(data_config.user_token, debug="DEBUG")
1515
self.bot.set_blueprints(middleware_bp, bot_bp)
1616

1717
def start(self) -> None:
1818
logger.info("Starting VKBot")
1919
try:
20-
self.bot.run_polling(skip_updates=True)
20+
self.bot.run_polling()
2121
except Exception as e:
2222
logger.exception(f"VK bot crashed. {e}")

forwarding_bot/vk/_middleware.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from vkbottle.bot import Blueprint, Message
21
from vkbottle.ext import Middleware
2+
from vkbottle.user import Blueprint, Message
33

44
from forwarding_bot.config import data_config
55

0 commit comments

Comments
 (0)