Skip to content

Commit

Permalink
Add claimable cashback
Browse files Browse the repository at this point in the history
Signed-off-by: alfred richardsn <rchrdsn@protonmail.ch>
  • Loading branch information
r4rdsn committed Aug 25, 2020
1 parent 291dda1 commit 6002e76
Show file tree
Hide file tree
Showing 15 changed files with 497 additions and 38 deletions.
52 changes: 51 additions & 1 deletion locale/en/LC_MESSAGES/bot.po
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: TellerBot\n"
"Report-Msgid-Bugs-To: rchrdsn@protonmail.ch\n"
"POT-Creation-Date: 2020-08-02 04:57+0300\n"
"POT-Creation-Date: 2020-08-25 07:27+0300\n"
"PO-Revision-Date: 2020-06-17 12:41+0000\n"
"Last-Translator: alfred richardsn <rchrdsn@protonmail.ch>\n"
"Language: en\n"
Expand Down Expand Up @@ -101,6 +101,10 @@ msgstr "Order book"
msgid "referral_link"
msgstr "Referral link"

#: src/handlers/base.py
msgid "claim_cashback"
msgstr "Claim cashback"

#: src/handlers/base.py
msgid "language"
msgstr "Language"
Expand Down Expand Up @@ -218,6 +222,36 @@ msgstr "Hide"
msgid "unset"
msgstr "Unset"

#: src/handlers/cashback.py
msgid "confirm_cashback_address"
msgstr "Yes"

#: src/handlers/cashback.py
msgid "custom_cashback_address"
msgstr "No, use other address"

#: src/handlers/cashback.py
msgid "use_cashback_address {address}"
msgstr "Should cashback be sent on address {address}?"

#: src/handlers/cashback.py
msgid "send_cashback_address"
msgstr "Send address where cashback will be sent."

#: src/handlers/cashback.py
msgid "claim_transfer_wait"
msgstr "Transferring cashback..."

#: src/handlers/cashback.py
msgid "cashback_transfer_error"
msgstr ""
"Couldn't transfer cashback. Make sure that you're claiming a cashback "
"with a transferable amount."

#: src/handlers/cashback.py
msgid "cashback_transferred"
msgstr "Cashback transferred!"

#: src/handlers/creation.py
msgid "wrong_button"
msgstr "You're using the wrong button."
Expand Down Expand Up @@ -563,6 +597,10 @@ msgstr "There are no previous orders."
msgid "escrow_unavailable"
msgstr "Escrow is temporarily unavailable. Sorry for the inconvenience."

#: src/handlers/order.py
msgid "escrow_starting_error"
msgstr "Couldn't start escrow."

#: src/handlers/order.py
msgid "change_to {currency}"
msgstr "Change to {currency}"
Expand Down Expand Up @@ -661,6 +699,18 @@ msgstr "Choose your language."
msgid "request_question"
msgstr "What's your question?"

#: src/handlers/start_menu.py
msgid "claim {amount} {currency}"
msgstr "Claim {amount} {currency}"

#: src/handlers/start_menu.py
msgid "no_cashback"
msgstr "You don't have cashback that can be claimed. Use escrow to get it."

#: src/handlers/start_menu.py
msgid "choose_cashback_currency"
msgstr "Choose currency of cashback."

#: src/handlers/start_menu.py
msgid "user_not_found"
msgstr "User is not found."
Expand Down
50 changes: 49 additions & 1 deletion locale/fr/LC_MESSAGES/bot.po
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: TellerBot\n"
"Report-Msgid-Bugs-To: rchrdsn@protonmail.ch\n"
"POT-Creation-Date: 2020-08-02 04:57+0300\n"
"POT-Creation-Date: 2020-08-25 07:27+0300\n"
"PO-Revision-Date: 2020-06-25 01:41+0000\n"
"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n"
"Language: fr\n"
Expand Down Expand Up @@ -103,6 +103,10 @@ msgstr "Journal des commandes"
msgid "referral_link"
msgstr ""

#: src/handlers/base.py
msgid "claim_cashback"
msgstr ""

#: src/handlers/base.py
msgid "language"
msgstr "Langue"
Expand Down Expand Up @@ -220,6 +224,34 @@ msgstr "Masquer"
msgid "unset"
msgstr "Désactiver"

#: src/handlers/cashback.py
msgid "confirm_cashback_address"
msgstr ""

#: src/handlers/cashback.py
msgid "custom_cashback_address"
msgstr ""

#: src/handlers/cashback.py
msgid "use_cashback_address {address}"
msgstr ""

#: src/handlers/cashback.py
msgid "send_cashback_address"
msgstr ""

#: src/handlers/cashback.py
msgid "claim_transfer_wait"
msgstr ""

#: src/handlers/cashback.py
msgid "cashback_transfer_error"
msgstr ""

#: src/handlers/cashback.py
msgid "cashback_transferred"
msgstr ""

#: src/handlers/creation.py
msgid "wrong_button"
msgstr "Vous utilisez le mauvais bouton."
Expand Down Expand Up @@ -558,6 +590,10 @@ msgstr ""
msgid "escrow_unavailable"
msgstr ""

#: src/handlers/order.py
msgid "escrow_starting_error"
msgstr ""

#: src/handlers/order.py
msgid "change_to {currency}"
msgstr ""
Expand Down Expand Up @@ -656,6 +692,18 @@ msgstr "Choisissez votre langue."
msgid "request_question"
msgstr "Quelle est votre question ?"

#: src/handlers/start_menu.py
msgid "claim {amount} {currency}"
msgstr ""

#: src/handlers/start_menu.py
msgid "no_cashback"
msgstr ""

#: src/handlers/start_menu.py
msgid "choose_cashback_currency"
msgstr ""

#: src/handlers/start_menu.py
msgid "user_not_found"
msgstr "L'utilisateur est introuvable."
Expand Down
54 changes: 53 additions & 1 deletion locale/ru/LC_MESSAGES/bot.po
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: TellerBot\n"
"Report-Msgid-Bugs-To: rchrdsn@protonmail.ch\n"
"POT-Creation-Date: 2020-08-02 04:57+0300\n"
"POT-Creation-Date: 2020-08-25 07:27+0300\n"
"PO-Revision-Date: 2020-06-17 12:41+0000\n"
"Last-Translator: alfred richardsn <rchrdsn@protonmail.ch>\n"
"Language: ru\n"
Expand Down Expand Up @@ -102,6 +102,10 @@ msgstr "Список заказов"
msgid "referral_link"
msgstr "Реферальная ссылка"

#: src/handlers/base.py
msgid "claim_cashback"
msgstr "Запросить кэшбэк"

#: src/handlers/base.py
msgid "language"
msgstr "Язык"
Expand Down Expand Up @@ -219,6 +223,36 @@ msgstr "Скрыть"
msgid "unset"
msgstr "Сбросить"

#: src/handlers/cashback.py
msgid "confirm_cashback_address"
msgstr "Да"

#: src/handlers/cashback.py
msgid "custom_cashback_address"
msgstr "Нет, использовать другой адрес"

#: src/handlers/cashback.py
msgid "use_cashback_address {address}"
msgstr "Отправить кэшбэк на адрес {address}?"

#: src/handlers/cashback.py
msgid "send_cashback_address"
msgstr "Отправьте адрес, на который будет отправлен кэшбэк."

#: src/handlers/cashback.py
msgid "claim_transfer_wait"
msgstr "Отправляю кэшбэк..."

#: src/handlers/cashback.py
msgid "cashback_transfer_error"
msgstr ""
"Не удалось отправить кэшбэк. Убедитесь, что запрашиваемая сумма кэшбэка "
"доступна для отправки."

#: src/handlers/cashback.py
msgid "cashback_transferred"
msgstr "Кэшбэк отправлен!"

#: src/handlers/creation.py
msgid "wrong_button"
msgstr "Вы используете неправильную кнопку."
Expand Down Expand Up @@ -566,6 +600,10 @@ msgstr "Нет предыдущих заказов."
msgid "escrow_unavailable"
msgstr "Эскроу временно недоступен. Извините за неудобства."

#: src/handlers/order.py
msgid "escrow_starting_error"
msgstr "Не удалось начать эскроу."

#: src/handlers/order.py
msgid "change_to {currency}"
msgstr "Поменять на {currency}"
Expand Down Expand Up @@ -665,6 +703,20 @@ msgstr "Выберите свой язык."
msgid "request_question"
msgstr "Какой у вас вопрос?"

#: src/handlers/start_menu.py
msgid "claim {amount} {currency}"
msgstr "Запросить {amount} {currency}"

#: src/handlers/start_menu.py
msgid "no_cashback"
msgstr ""
"У вас нет доступного для запроса кэшбэка. Используйте эскроу для его "
"получения."

#: src/handlers/start_menu.py
msgid "choose_cashback_currency"
msgstr "Выберите валюту кэшбэка."

#: src/handlers/start_menu.py
msgid "user_not_found"
msgstr "Пользователь не найден."
Expand Down
43 changes: 37 additions & 6 deletions src/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,27 +37,58 @@

database_user: ContextVar[typing.Mapping[str, typing.Any]] = ContextVar("database_user")

STATE_KEY = "state"


class MongoStorage(BaseStorage):
"""MongoDB asynchronous storage for FSM using motor."""

async def get_state(self, user: int, **kwargs) -> typing.Optional[str]:
"""Get current state of user with Telegram ID ``user``."""
document = await database.users.find_one({"id": user})
return document.get(STATE_KEY) if document else None
return document.get("state") if document else None

async def set_state(
self, user: int, state: typing.Optional[str] = None, **kwargs
) -> None:
"""Set new state ``state`` of user with Telegram ID ``user``."""
if state is None:
await database.users.update_one({"id": user}, {"$unset": {STATE_KEY: True}})
await database.users.update_one({"id": user}, {"$unset": {"state": True}})
else:
await database.users.update_one({"id": user}, {"$set": {"state": state}})

async def get_data(self, user: int, **kwargs) -> typing.Dict:
"""Get state data of user with Telegram ID ``user``."""
document = await database.users.find_one({"id": user})
return document.get("data", {})

async def set_data(
self, user: int, data: typing.Optional[typing.Dict] = None, **kwargs
) -> None:
"""Set state data ``data`` of user with Telegram ID ``user``."""
if data is None:
await database.users.update_one({"id": user}, {"$unset": {"data": True}})
else:
await database.users.update_one({"id": user}, {"$set": {STATE_KEY: state}})
await database.users.update_one({"id": user}, {"$set": {"data": data}})

async def update_data(
self, user: int, data: typing.Optional[typing.Dict] = None, **kwargs
) -> None:
"""Update data of user with Telegram ID ``user``."""
if data is None:
data = {}
data.update(kwargs)
await database.users.update_one(
{"id": user},
{"$set": {f"data.{key}": value for key, value in data.items()}},
)

async def reset_state(self, user: int, with_data: bool = True, **kwargs):
"""Reset state for user with Telegram ID ``user``."""
update = {"$unset": {"state": True}}
if with_data:
update["$unset"]["data"] = True
await database.users.update_one({"id": user}, update)

async def finish(self, user, **kwargs):
async def finish(self, user: int, **kwargs):
"""Finish conversation with user."""
await self.set_state(user=user, state=None)

Expand Down
4 changes: 4 additions & 0 deletions src/escrow/blockchain/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -405,3 +405,7 @@ async def add_to_queue(self, **kwargs):

class BlockchainConnectionError(Exception):
"""Unsuccessful attempt at connection to blockchain node."""


class TransferError(Exception):
"""Unsuccessful attempt at transfer."""
6 changes: 5 additions & 1 deletion src/escrow/blockchain/cyber_blockchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from src.escrow.blockchain import BaseBlockchain
from src.escrow.blockchain import BlockchainConnectionError
from src.escrow.blockchain import InsuranceLimits
from src.escrow.blockchain import TransferError


TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f"
Expand Down Expand Up @@ -173,7 +174,10 @@ async def transfer(self, to: str, amount: Decimal, asset: str, memo: str = ""):
"signatures": [EOSKey(self.wif).sign(digest)],
}
trx_data = json.dumps(final_trx, cls=types.EOSEncoder)
result = await self._api("v1/chain/push_transaction", data=trx_data)
try:
result = await self._api("v1/chain/push_transaction", data=trx_data)
except aiohttp.ClientResponseError:
raise TransferError
return self.trx_url(result["transaction_id"])

async def is_block_confirmed(self, block_num, op):
Expand Down
25 changes: 15 additions & 10 deletions src/escrow/blockchain/golos_blockchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@
from time import time

from golos import Api
from golos.exceptions import GolosException
from golos.exceptions import RetriesExceeded
from golos.exceptions import TransactionNotFound

from src.escrow.blockchain import BlockchainConnectionError
from src.escrow.blockchain import InsuranceLimits
from src.escrow.blockchain import StreamBlockchain
from src.escrow.blockchain import TransferError


class GolosBlockchain(StreamBlockchain):
Expand Down Expand Up @@ -81,16 +83,19 @@ async def get_limits(self, asset: str):
return limits.get(asset)

async def transfer(self, to: str, amount: Decimal, asset: str, memo: str = ""):
transaction = await get_running_loop().run_in_executor(
None,
self._golos.transfer,
to.lower(),
amount,
self.address,
self.wif,
asset,
memo,
)
try:
transaction = await get_running_loop().run_in_executor(
None,
self._golos.transfer,
to.lower(),
amount,
self.address,
self.wif,
asset,
memo,
)
except GolosException:
raise TransferError
return self.trx_url(transaction["id"])

async def is_block_confirmed(self, block_num, op):
Expand Down

0 comments on commit 6002e76

Please sign in to comment.