Skip to content
This repository has been archived by the owner on Mar 13, 2023. It is now read-only.

Commit

Permalink
Workflow (#17)
Browse files Browse the repository at this point in the history
* workflow initial


* workflow logic without api response used

* response api endpoint with video file ability (todo)
need to write to "text" endpoint by design

* black

* end course initial

* workflow

* workflow

* workflow mvp
  • Loading branch information
mixx3 authored Nov 21, 2022
1 parent 42f9e74 commit 4915d0a
Show file tree
Hide file tree
Showing 10 changed files with 259 additions and 91 deletions.
2 changes: 1 addition & 1 deletion bot/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@
for event in longpoll.check():
process_event(vk, event)
except Exception as e:
logger.critical(repr(e))
logger.critical(e)
4 changes: 2 additions & 2 deletions bot/event_scenarios/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

settings = get_settings()
beaver = requests.post(
f"{settings.BACKEND_URL}/token",
{"username": settings.BACKEND_USER, "password": settings.BACKEND_PASSWORD},
f"{settings.BACKEND_URL}/token",
{"username": settings.BACKEND_USER, "password": settings.BACKEND_PASSWORD},
)
auth_data = json.loads(beaver.content)
auth_headers = {"Authorization": f"Bearer {auth_data.get('access_token')}"}
85 changes: 55 additions & 30 deletions bot/event_scenarios/event_processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,12 @@ def process_registry(vk: VkApiMethod, event: Event):
registry.on_start_button(vk, event)
if event.text == settings.REGISTRY_MODE:
registry.on_mode_change(vk)
elif (len(event.text.split()) >= 2 and
event.text.split()[0] == settings.REGISTRY_MODE and
event.text.split()[1] == 'spam_message'
elif (
len(event.text.split()) >= 2
and event.text.split()[0] == settings.REGISTRY_MODE
and event.text.split()[1] == "spam_message"
):
message = event.text.split(' spam_message ')[-1]
message = event.text.split(" spam_message ")[-1]
if settings.REGISTRY_MODE not in message:
registry.on_spam_message(vk, message)
elif event.text == reactions.Registry.START_BUTTON:
Expand Down Expand Up @@ -63,48 +64,72 @@ def process_registry(vk: VkApiMethod, event: Event):
registry.on_approve(vk, event)

elif redis_db.hget(event.user_id, "approved") and not redis_db.hexists(
event.user_id, "registrated"
event.user_id, "registrated"
):
# user cv received
registry.on_about(vk, event)
elif event.text != "Начать" and redis_db.hexists(event.user_id, "registrated"):
registry.on_random_end(vk, event)
elif (
event.text != "Начать"
and not redis_db.hexists(event.user_id, "registrated")
and not redis_db.hexists(event.user_id, "start_button")
event.text != "Начать"
and not redis_db.hexists(event.user_id, "registrated")
and not redis_db.hexists(event.user_id, "start_button")
):
registry.on_random_begin(vk, event)


def process_workflow(vk: VkApiMethod, event: Event):
redis_db = redis.Redis.from_url(settings.REDIS_DSN)
if event.text == "Начать" or event.text == reactions.Registry.START_BUTTON:
workflow.on_registry_expiry(vk, event)
elif event.text == settings.WORKFLOW_MODE:
if event.text == settings.WORKFLOW_MODE:
return None
elif event.text == f"{settings.WORKFLOW_MODE} send_message":
workflow.on_mode_change(vk)
elif event.text == reactions.Workflow.CONFIRM_BUTTON:
workflow.on_start_button(vk, event)
elif event.text and \
redis_db.hexists(event.user_id, "workflow") and \
redis_db.hexists(event.user_id, "workflow_type") and \
redis_db.hget(event.user_id, "workflow_type").decode('utf-8') == 'none':
workflow.on_none_request_ans(vk, event)
elif event.text and \
redis_db.hexists(event.user_id, "workflow") and \
redis_db.hexists(event.user_id, "workflow_type") and \
redis_db.hget(event.user_id, "workflow_type").decode('utf-8') == 'text':
workflow.on_text_request_ans(vk, event)
elif event.text and \
redis_db.hexists(event.user_id, "workflow") and \
redis_db.hexists(event.user_id, "workflow_type") and \
redis_db.hget(event.user_id, "workflow_type").decode('utf-8') == 'file':
workflow.on_none_request_ans(vk, event)
elif event.text and \
redis_db.hexists(event.user_id, "workflow") and \
redis_db.hexists(event.user_id, "workflow_type") and \
redis_db.hget(event.user_id, "workflow_type").decode('utf-8') == 'video':
elif (
event.text
and redis_db.hexists(event.user_id, "workflow_type")
and redis_db.hget(event.user_id, "workflow_type").decode("utf-8") == "end"
):
workflow.on_random_message(vk, event)
elif event.text == "Начать" or event.text == reactions.Registry.START_BUTTON:
workflow.on_registry_expiry(vk, event)


elif (
redis_db.hexists(event.user_id, "workflow")
and redis_db.hexists(event.user_id, "workflow_type")
and redis_db.hget(event.user_id, "workflow_type").decode("utf-8") == "none"
and event.text == reactions.Workflow.NEXT_VIDEO_BUTTON
):
workflow.on_none_request_ans(vk, event)
elif (
redis_db.hexists(event.user_id, "workflow")
and redis_db.hexists(event.user_id, "workflow_type")
and redis_db.hget(event.user_id, "workflow_type").decode("utf-8")
== "end_course"
and event.text == reactions.Workflow.COOL_BUTTON
):
workflow.on_end_course(vk, event)
elif (
event.text != f"{settings.WORKFLOW_MODE} send_message"
and redis_db.hexists(event.user_id, "workflow")
and redis_db.hget(event.user_id, "workflow").decode("utf-8") == "on workflow"
):
workflow.on_solution_received(vk, event)
elif (
event.text
and event.text != reactions.Workflow.NEXT_VIDEO_BUTTON
and redis_db.hexists(event.user_id, "workflow")
and redis_db.hget(event.user_id, "workflow").decode("utf-8") == "solved"
):
workflow.on_approve(vk, event)
elif (
event.text == reactions.Workflow.NEXT_VIDEO_BUTTON
and redis_db.hexists(event.user_id, "workflow")
and redis_db.hget(event.user_id, "workflow").decode("utf-8") == "approved"
):
workflow.on_start_button(vk, event)


def process_summary(vk: VkApiMethod, event: Event):
Expand Down
19 changes: 18 additions & 1 deletion bot/event_scenarios/msg_reactions.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,25 @@ class Registry:
class Workflow:
@classmethod
def start_message(cls, direction_id: int):
return f"""ARE YOU READYYYY?? Мы уже держим палец над кнопкой, которая откроет тебе доступ к курсу '{get_directions()[direction_id].name}'. Тебе осталось только прочитать небольшую инструкцию и нажать кнопку «Всё понятно». После нажатия кнопки бот пришлет тебе первое видео. Когда посмотришь его, нажимай кнопку “К следующему уроку”. После некоторых уроков тебя будут ждать проверочные задания — делать их или нет, решать тебе. А иногда будут встречаться контрольные задания — они обязательные, их нужно сделать и прислать боту, чтобы открыть доступ к следующим урокам. Внимательно читай, что тебе нужно прислать боту — ссылку на гугл-диск, файл или просто текст. Если у тебя возникнут вопросы по курсу, установке или интерфейсу программ, организационным моментам или чему-то ещё, просто напиши в чат курса, и кураторы помогут тебе. Вот и всё, теперь погнали!” """
return f"""
ARE YOU READYYYY?? Мы уже держим палец над кнопкой, которая откроет тебе доступ к курсу '{get_directions()[direction_id].name}'.
Тебе осталось только прочитать небольшую инструкцию и нажать кнопку «Всё понятно».
После нажатия кнопки бот пришлет тебе первое видео. Когда посмотришь его, нажимай кнопку “К следующему уроку”. После некоторых уроков тебя будут ждать проверочные задания — делать их или нет, решать тебе. А иногда будут встречаться контрольные задания — они обязательные, их нужно сделать и прислать боту, чтобы открыть доступ к следующим урокам. Внимательно читай, что тебе нужно прислать боту — ссылку на гугл-диск или просто текст. Если у тебя возникнут вопросы по курсу, установке или интерфейсу программ, организационным моментам или чему-то ещё, просто напиши в чат курса, и кураторы помогут тебе.
Вот и всё, теперь погнали!
Ссылка на чат: {get_directions()[direction_id].chat_ref}
"""

REGISTRY_EXPIRED = """Ой, кажется уже слишком поздно. Регистрация на ШЭ ЭМ уже закончилась, и мы не можем тебя добавить. Но есть и хорошая новость — скоро здесь будет что-то супер-пупер-дупер интересное! Подпишись на уведомления группы, чтобы не пропустить."""
CONFIRM_BUTTON = """Всё понятно"""
NEXT_VIDEO_BUTTON = """К следующему уроку"""
APPROVE_QUESTION = (
"Посмотри, есть ли ошбки. Если всё нормально, переходи к следующему уроку!"
)
APPROVE_TRUE = "Отправить"
APPROVE_FALSE = "Ввести снова"
ON_APPROVE_FALSE_ANS = "Окей, жду ответа):"
ON_APPROVE_TRUE_ANS = "Нажимай на кнопку и переходи к следующему уроку!"
COOL_BUTTON = """Круто!!!"""
COURSE_ENDED = """Вот это да, ты прошёл весь курс, который мы для тебя подготовили! Это классно! А ещё класснее то, что впереди у тебя — больше и круче (как минимум — ДЖЕМ, как максимум — вся жизнь!)."""
ON_END_COURSE = """Мы тоже хотим стать больше и круче, и нам будет очень приятно, если ты дашь небольшой фидбек по ссылке: ссылка"""
ON_ENDED_RANDOM = """Курс закончился. По всем вопросам можешь писать кураторам)"""
14 changes: 0 additions & 14 deletions bot/event_scenarios/registry/event_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,20 +107,6 @@ def on_discard_direction(vk: VkApiMethod, event: Event):
)


def on_discard_direction(vk: VkApiMethod, event: Event):
kb = VkKeyboard(one_time=False, inline=True)

for i in range(len(directions)):
kb.add_button(directions[i].name)
if i + 1 < len(directions):
kb.add_line()
utils.send_message(
vk,
event.user_id,
message=dedent(reactions.Registry.DIRECTION_QUESTION),
keyboard=kb.get_keyboard(),
)

def on_direction_ans(vk: VkApiMethod, event: Event):
db_id = 1
for d in directions:
Expand Down
31 changes: 26 additions & 5 deletions bot/event_scenarios/registry/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,37 @@ def is_valid(self):


class Direction:
def __init__(self, db_id: int, name: str, ref: str):
def __init__(self, db_id: int, name: str, ref: str, chat_ref=""):
self.db_id = db_id
self.name = name
self.ref = ref
self.chat_ref = chat_ref


def get_directions() -> list[Direction]:
return [
Direction(1, "Фото: графия", "https://vk.com/@she_em-fotografiya"),
Direction(2, "Контент: менеджмент", "https://vk.com/@she_em-kontent"),
Direction(3, "Дизайн: айдентика", "https://vk.com/@she_em-aidentika"),
Direction(4, "Дизайн: соцсети", "https://vk.com/@she_em-dizain-socseti"),
Direction(
1,
"Фото: графия",
"https://vk.com/@she_em-fotografiya",
chat_ref="https://vk.me/join/qafLjvPhU7rLk/yJ5gY2y4qjxtui8cI5OTQ=",
),
Direction(
2,
"Контент: менеджмент",
"https://vk.com/@she_em-kontent",
chat_ref="https://vk.me/join/enw/324naMhGhn5IVXA0q9ST54PQDq0mneI=",
),
Direction(
3,
"Дизайн: айдентика",
"https://vk.com/@she_em-aidentika",
chat_ref="https://vk.me/join/jdKuxztKMJ1C0JYiPbgbsHDE2_me_A9WbRM=",
),
Direction(
4,
"Дизайн: соцсети",
"https://vk.com/@she_em-dizain-socseti",
chat_ref="https://vk.me/join/Son4hsUH76DeK6Bg/ti0Dqz4UPo91Vl/Z90=",
),
]
1 change: 0 additions & 1 deletion bot/event_scenarios/summary/event_handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,3 @@
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
from bot.event_scenarios.auth import auth_headers
from textwrap import dedent

11 changes: 8 additions & 3 deletions bot/event_scenarios/workflow/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@
on_start_button,
on_mode_change,
on_none_request_ans,
on_text_request_ans,
on_text_request_ans,
on_solution_received,
on_approve,
on_end_course,
on_random_message,
)

__all__ = [
"on_registry_expiry",
"on_start_button",
"on_mode_change",
"on_text_request_ans",
"on_approve",
"on_solution_received",
"on_end_course",
"on_none_request_ans",
"on_random_message",
]
Loading

0 comments on commit 4915d0a

Please sign in to comment.