Skip to content

Commit

Permalink
Конфликты
Browse files Browse the repository at this point in the history
  • Loading branch information
denismosolov committed Jun 24, 2020
2 parents 34246c0 + 0bb4ae9 commit ef0a188
Show file tree
Hide file tree
Showing 26 changed files with 1,478 additions and 207 deletions.
1 change: 0 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
SESSION_USER_ID=D7E7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
TINKOFF_OPEN_API_SANDBOX=aaa
TINKOFF_OPEN_API_EXCHANGE=bbb
1 change: 0 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,5 @@ create_version:
--entrypoint index.main \
--memory 128m \
--execution-timeout 3s \
--environment="SESSION_USER_ID=${SESSION_USER_ID}" \
--environment="TINKOFF_OPEN_API_EXCHANGE=${TINKOFF_OPEN_API_EXCHANGE}" \
--source-path ./oliver.zip
45 changes: 40 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,6 @@ make test
Для тестов используется песочница Tinkoff Invest Open API, если часто запускать тесты, то можно упереться в [ограничения песочницы](https://tinkoffcreditsystems.github.io/invest-openapi/rest/).

## Деплой в Яндекс.Облако
Перед деплоем загляните в файл `.env` в корневой директории проекта и замените идентификатор пользователя Яндекса в `SESSION_USER_ID` на свой. Этот идентификатор используется для аутентификации в навыке, чтобы никто кроме вас не смог запустить ваш навык, зная активационное имя. `SESSION_USER_ID` передаётся в переменную окружения функции в Яндекс.Облаке при запуске `make create_version`. Я не уверен, что это безопасно, поэтому используйте на свой страх и риск.

Для справки посмотрите session.user.user_id в https://yandex.ru/dev/dialogs/alice/doc/protocol-docpage/#request.

Выпустите [токены OpenAPI](https://tinkoffcreditsystems.github.io/invest-openapi/auth/) для биржи и Sandbox , запишите их в `TINKOFF_OPEN_API_SANDBOX` и `TINKOFF_OPEN_API_EXCHANGE` в файле `.env`.

А вот и команда для деплоя кода в Яндекс.Облако.
Expand All @@ -52,11 +48,50 @@ make create_version
## Навык в Яндекс.Диалоги
Справка https://yandex.ru/dev/dialogs/alice/doc/smart-home/start-docpage/

В поле «Тип доступа» выберите «Приватный».

Не забудьте указать функцию
![Selection_018](https://user-images.githubusercontent.com/3057626/83176044-85456180-a125-11ea-994b-6087a78f42f8.png)

### Сущности

В настройках навыка выберите подраздел Интенты, найдите Сущности и нажмите Редактировать, появится всплывающее окно с полем ввода. Вставьте содержимое файла `intents/entities` в поле ввода, нажмите Сохранить и закройте окно.

### Интенты

В настройках навыка выберите подраздел Интенты, нажмите Создать. В появившемся окне впишите Название: `Заявка на покупку или продажу по рыночной цене`, ID: `market.order`, в поле Грамматика вставьте содержимое файла `intents/market_order/intent`, в поле Положительные тесты вставьте содержимое файла `tests/intents/market_order/positive`, а в поле Отрицательные тесты вставьте содержимое файла `tests/intents/market_order/negative`. Нажмите Сохранить. Первый интент готов.

По аналогии создайте второй интент.
Название: Мои заявки
ID: my.orders
Грамматика: `intents/my_orders/intent`
Положительные тесты: `tests/intents/my_orders/positive`
Отрицательные тесты: `tests/intents/my_orders/negative`

Название: Мои акции
ID: my.stocks
Грамматика: `intents/my_stocks/intent`
Положительные тесты: `tests/intents/my_stocks/positive`
Отрицательные тесты: `tests/intents/my_stocks/negative`

## Руководство пользователя

### Покупка акций по рыночной цене

Чтобы отправить заявку на покупку акций по рыночной цене скажите: «купи 10 лотов НЛМК».

После этого Оливер попросит подтвердить заявку: «заявка на покупку 10 лотов НЛМК по рыночной цене, тикер NLMK, для подтверждения скажите подтверждаю, для отмены скажите нет».

Если вы подтвердите намерение, то услышите: «заявка на покупку 10 лотов НЛМК по рыночной цене создана» либо «заявка исполнена».

### Продажа акций по рыночной цене

Чтобы отправить заявку на продажу акций по рыночной цене скажите: «продай 10 лотов НЛМК».

После этого Оливер попросит подтвердить заявку: «заявка на продажу 10 лотов НЛМК по рыночной цене, тикер NLMK, для подтверждения скажите подтверждаю, для отмены скажите нет».

Если вы подтвердите намерение, то услышите: «заявка на продажу создана» либо «заявка исполнена».

### Лимитная заявка на покупку акций

Чтобы отправить лимитную заявку на покупку акций по заданной цене скажите: «купи 10 лотов НЛМК по цене 120 рублей 30 копеек».
Expand All @@ -83,4 +118,4 @@ make create_version

## Планы на будущее
1. Хочу в каталог навыков Алисы https://dialogs.yandex.ru/store (ждём TinkoffCreditSystems/invest-openapi#217)
2. Хочу выставлять и отменять заявки на покупку и продажу акций через навык
2. Хочу слушать посты из Пульса (Тинькофф Инвестиции) по тикеру
2 changes: 0 additions & 2 deletions index.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@

function main($event, $context): array
{
$user_id = $_ENV['SESSION_USER_ID'] ?? '';
$token = $_ENV['TINKOFF_OPEN_API_EXCHANGE'] ?? '';
try {
// @todo: на самом деле это лучше запихнуть в Application
Expand All @@ -34,6 +33,5 @@ function main($event, $context): array
$app = new Application();
$app->setClient($client);
$app->setEvent($event);
$app->setUserId($user_id);
return $app->run();
}
34 changes: 34 additions & 0 deletions intents/entities
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# чтобы отличать лоты от акций
entity OperationUnit:
values:
lot:
%lemma
лот
share:
%lemma
акция

# чтобы различать покупку и продажу
entity OperationType:
values:
buy:
%lemma
купи
sell:
%lemma
продай

# чтобы различать тикеры
entity FIGI:
values:
BBG005DXJS36:
тиньков(банк)?
тинькоф(банк)?
тинькофф(банк)?
ти си эс (груп)?
BBG004S681B4:
нлмк
эн эл эм ка
BBG004730ZJ9:
(банк)? втб
(банк)? вэ тэ бэ
32 changes: 32 additions & 0 deletions intents/market_order/intent
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Заявка на покупку или продажу по рыночной цене
# market.order

slots:
operation:
source: $Operation
type: OperationType
figi:
source: $Stock
type: FIGI
amount:
source: $Amount
type: YANDEX.NUMBER
unit:
source: $Unit
type: OperationUnit
root:
$Operation [$Amount $Unit $Stock $Market?]
$Operation:
$OperationType
$Amount:
$YANDEX.NUMBER
$Unit:
$OperationUnit
$Stock:
$FIGI
$Market:
%lemma
по рынку | по рыночной цене
filler:
%lemma
пожалуйста | алиса | оливер
8 changes: 8 additions & 0 deletions intents/my_orders/intent
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Описание интента "my.orders"
# Эта грамматика позволяет распознать,
# когда пользователь просит список активных заявок
# на брокерском счёте

root:
мои (активные)? заявки
список (моих)? (активных)? заявок
8 changes: 8 additions & 0 deletions intents/my_stocks/intent
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Описание интента "my.stocks"
# Эта грамматика позволяет распознать,
# когда пользователь просит рассказать об акциях
# на своём брокерском счёте

root:
мои акции
список (моих)? акций
5 changes: 2 additions & 3 deletions phpunit.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
<phpunit bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="general">
<file>tests/ApplicationTest.php</file>
</testsuite>
<testsuite name="handlers">
<file>tests/Reply/IntroductionTest.php</file>
<file>tests/Reply/RepeatTest.php</file>
<file>tests/Reply/LimitOrderBuyStockTest.php</file>
<file>tests/Reply/OrdersTest.php</file>
<file>tests/Reply/StocksTest.php</file>
<file>tests/Reply/MarketOrderBuyStockTest.php</file>
<file>tests/Reply/MarketOrderSellStockTest.php</file>
</testsuite>
<testsuite name="utils">
<file>tests/DeclensionTest.php</file>
Expand Down
14 changes: 4 additions & 10 deletions src/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@

namespace Oliver;

use Oliver\Reply\PrivateSkill;
use Oliver\Reply\Stocks;
use jamesRUS52\TinkoffInvest\TIClient;
use Oliver\Reply\Introduction;
use Oliver\Reply\LimitOrderBuyStock;
use Oliver\Reply\Orders;
use Oliver\Reply\Repeat;
use Oliver\Reply\MarketOrderBuyStock;
use Oliver\Reply\MarketOrderSellStock;

class Application
{
Expand Down Expand Up @@ -57,27 +58,20 @@ public function setClient(TIClient $client): void
$this->client = $client;
}

/**
* Allowed user id
*/
public function setUserId(string $id): void
{
$this->session_user_id = $id;
}

/**
* @see https://yandex.ru/dev/dialogs/alice/doc/protocol-docpage/#response
*/
public function run(): array
{
try {
$replies = [
new PrivateSkill($this->session_user_id),
new Introduction(),
new Repeat(),
new Stocks($this->client),
new Orders($this->client),
new LimitOrderBuyStock($this->client),
new MarketOrderBuyStock($this->client),
new MarketOrderSellStock($this->client),
];
foreach ($replies as $reply) {
$response = $reply->handle($this->event);
Expand Down
Loading

0 comments on commit ef0a188

Please sign in to comment.