File size: 6,480 Bytes
5abd42f
 
 
fb60f49
5abd42f
fb60f49
b645845
ae9ab93
52594e7
68f5cf5
 
 
86c8341
 
68f5cf5
 
 
 
86c8341
b89a231
ae9ab93
b89a231
fbcfeb4
ae9ab93
f473aea
 
 
 
 
 
0fe45ac
f473aea
 
 
 
0fe45ac
 
 
 
f473aea
 
0fe45ac
 
 
f473aea
 
 
 
b89a231
86c8341
b89a231
ae9ab93
b89a231
fbcfeb4
ae9ab93
f473aea
e4435ed
f473aea
 
 
e4435ed
0fe45ac
e4435ed
 
 
 
0fe45ac
 
 
 
e4435ed
 
0fe45ac
 
 
f473aea
 
 
 
86c8341
 
52594e7
ae9ab93
52594e7
 
6eccd26
52594e7
 
 
 
573cab7
52594e7
 
3a385ce
52594e7
573cab7
52594e7
 
 
3a385ce
 
 
 
 
 
 
 
 
 
 
6eccd26
52594e7
 
 
6eccd26
52594e7
 
 
 
6eccd26
52594e7
 
 
6eccd26
52594e7
 
 
573cab7
52594e7
86c8341
ae9ab93
 
 
 
52594e7
 
ae9ab93
52594e7
 
 
 
 
 
 
6eccd26
a4c4228
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import sqlite3
import json
import requests
import logging

logging.basicConfig(level=logging.DEBUG)


def handle_webhook(data, key_callback_vk, db_name, vk_st_alone):
    # Преобразуем строку key_callback_vk в JSON
    key_callback_dict = json.loads(key_callback_vk)

    # Проверяем тип события
    if data['type'] == 'confirmation':
        # Получаем номер сообщества из данных
        group_id = str(data['group_id'])
        # Возвращаем соответствующий пароль
        return key_callback_dict.get(group_id, 'unknown')

    # Обработка события подписки на рассылку
    elif data['type'] == 'message_allow':
        user_id = data['object']['user_id']
        group_id = data['group_id']
        logging.info(f"User {user_id} subscribed to the mailing list of group {group_id}")

        # Записываем информацию о подписке в базу данных
        conn = sqlite3.connect(db_name)
        cursor = conn.cursor()

        # Проверяем, существует ли запись для данного пользователя
        cursor.execute("SELECT canal FROM contacts WHERE vk_id = ?", (user_id,))
        result = cursor.fetchone()

        if result:
            # Обновляем запись, если пользователь уже существует
            canal_data = json.loads(result[0]) if result[0] else {}
            canal_data[str(group_id)] = '1'
            canal_json = json.dumps(canal_data)
            cursor.execute("UPDATE contacts SET canal = ? WHERE vk_id = ?", (canal_json, user_id))
        else:
            # Создаем новую запись, если пользователь не существует
            canal_data = {str(group_id): '1'}
            canal_json = json.dumps(canal_data)
            cursor.execute("INSERT INTO contacts (vk_id, canal) VALUES (?, ?)", (user_id, canal_json))

        conn.commit()
        conn.close()

        return 'ok'

    # Обработка события отписки от рассылки
    elif data['type'] == 'message_deny':
        user_id = data['object']['user_id']
        group_id = data['group_id']
        logging.info(f"User {user_id} unsubscribed from the mailing list of group {group_id}")

        # Записываем информацию об отписке в базу данных
        conn = sqlite3.connect(db_name)
        cursor = conn.cursor()

        # Проверяем, существует ли запись для данного пользователя
        cursor.execute("SELECT canal FROM contacts WHERE vk_id = ?", (user_id,))
        result = cursor.fetchone()

        if result:
            # Обновляем запись, если пользователь уже существует
            canal_data = json.loads(result[0]) if result[0] else {}
            canal_data[str(group_id)] = '0'
            canal_json = json.dumps(canal_data)
            cursor.execute("UPDATE contacts SET canal = ? WHERE vk_id = ?", (canal_json, user_id))
        else:
            # Создаем новую запись, если пользователь не существует
            canal_data = {str(group_id): '0'}
            canal_json = json.dumps(canal_data)
            cursor.execute("INSERT INTO contacts (vk_id, canal) VALUES (?, ?)", (user_id, canal_json))

        conn.commit()
        conn.close()

        return 'ok'

    # Обработка события вступления в закрытую группу
    elif data['type'] == 'group_join':
        user_id = data['object']['user_id']
        group_id = data['group_id']
        logging.info(f"User {user_id} requested to join group {group_id}")

        # Читаем информацию из базы данных
        conn = sqlite3.connect(db_name)
        cursor = conn.cursor()
        logging.debug(f"Connected to database: {db_name}")

        # Проверяем, существует ли запись для данного пользователя
        cursor.execute("SELECT * FROM contacts WHERE vk_id = ?", (user_id,))
        result = cursor.fetchone()
        logging.debug(f"Query result for user {user_id}: {result}")

        if result:
            # Получаем данные о группе
            orders_data = result[17] if result[17] else '{}'
            logging.debug(f"Raw orders data for user {user_id}: {orders_data}")

            try:
                orders_data_json = json.loads(orders_data)
                logging.debug(f"Parsed orders data for user {user_id}: {orders_data_json}")
            except json.JSONDecodeError as e:
                logging.error(f"Failed to parse JSON for user {user_id}: {e}")
                orders_data_json = {}

            group_status = orders_data_json.get(str(group_id), 'not')
            logging.info(f"Group status for user {user_id} in group {group_id}: {group_status}")

            if group_status == 'yes':
                # Одобряем запрос на вступление
                logging.info(f"Approving join request for user {user_id} in group {group_id}")
                approve_join_request(group_id, user_id, vk_st_alone)
                return 'ok'
            else:
                # Отклоняем запрос на вступление
                logging.info(f"Denying join request for user {user_id} in group {group_id}")
                return 'not'
        else:
            # Если запись не найдена, отклоняем запрос
            logging.info(f"No record found for user {user_id}. Denying join request.")
            return 'not'

        conn.close()
        logging.debug("Database connection closed")

    # Если тип события неизвестен, возвращаем ошибку
    else:
        logging.error(f"Unknown event type: {data['type']}")
        return 'unknown event', 400


def approve_join_request(group_id, user_id, vk_st_alone):
    url = 'https://api.vk.com/method/groups.approveRequest'
    params = {
        'group_id': group_id,
        'user_id': user_id,
        'access_token': vk_st_alone,
        'v': '5.131'
    }
    response = requests.get(url, params=params).json()
    logging.info(f"Approve request response: {response}")
    return response