From a6777cf2a378fa5183f35799cde8d6faf9067e7f Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 15 Jan 2017 20:57:33 +0000 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chatbot/__init__.py | 0 chatbot/admin.py | 5 + chatbot/apps.py | 5 + chatbot/migrations/0001_initial.py | 36 ++++++++ chatbot/migrations/__init__.py | 0 chatbot/models.py | 19 ++++ chatbot/telebot.py | 141 +++++++++++++++++++++++++++++ chatbot/tests.py | 3 + chatbot/views.py | 3 + 9 files changed, 212 insertions(+) create mode 100644 chatbot/__init__.py create mode 100644 chatbot/admin.py create mode 100644 chatbot/apps.py create mode 100644 chatbot/migrations/0001_initial.py create mode 100644 chatbot/migrations/__init__.py create mode 100644 chatbot/models.py create mode 100755 chatbot/telebot.py create mode 100644 chatbot/tests.py create mode 100644 chatbot/views.py diff --git a/chatbot/__init__.py b/chatbot/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/chatbot/admin.py b/chatbot/admin.py new file mode 100644 index 0000000..e8b9ae8 --- /dev/null +++ b/chatbot/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +import models + +admin.site.register(models.MessageHistory) +admin.site.register(models.TelegramBot) diff --git a/chatbot/apps.py b/chatbot/apps.py new file mode 100644 index 0000000..d440779 --- /dev/null +++ b/chatbot/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class ChatbotConfig(AppConfig): + name = 'chatbot' diff --git a/chatbot/migrations/0001_initial.py b/chatbot/migrations/0001_initial.py new file mode 100644 index 0000000..de353d9 --- /dev/null +++ b/chatbot/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-01-15 20:55 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='MessageHistory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.CharField(max_length=255)), + ('date_sent', models.DateTimeField(auto_now_add=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='TelegramBot', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('chat_id', models.PositiveIntegerField(default=0)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/chatbot/migrations/__init__.py b/chatbot/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/chatbot/models.py b/chatbot/models.py new file mode 100644 index 0000000..9adc027 --- /dev/null +++ b/chatbot/models.py @@ -0,0 +1,19 @@ +from django.db import models +from djing.settings import AUTH_USER_MODEL + + +class TelegramBot(models.Model): + user = models.ForeignKey(AUTH_USER_MODEL) + chat_id = models.PositiveIntegerField(default=0) + + def __unicode__(self): + return self.user.get_full_name() + ' - ' + str(self.chat_id) + + +class MessageHistory(models.Model): + user = models.ForeignKey(AUTH_USER_MODEL) + message = models.CharField(max_length=255) + date_sent = models.DateTimeField(auto_now_add=True) + + def __unicode__(self): + return self.message diff --git a/chatbot/telebot.py b/chatbot/telebot.py new file mode 100755 index 0000000..dd6a86c --- /dev/null +++ b/chatbot/telebot.py @@ -0,0 +1,141 @@ +# -*- coding: utf-8 -*- +from telepot import helper, glance, Bot +import os +import socket +from models import TelegramBot +from chatbot.models import MessageHistory +from accounts_app.models import UserProfile + +token = '285129725:AAF9Si5_b1n1_cN3vJtwXt0gkgsqKBptut4' + + +class DjingTelebot(helper.ChatHandler): + _current_user = None + _dialog_fn = None + _chat_id = 0 + + def __init__(self, seed_tuple, **kwargs): + super(DjingTelebot, self).__init__(seed_tuple, **kwargs) + self.cmds = { + 'ping': self.ping, + 'iam': self.say_me + } + print 'Constructor' + + # отвечаем пользователю + def _sent_reply(self, text): + print('CALL: _sent_reply') + self.sender.sendMessage(text) + + # задаём вопрос пользователю, и ожидаем ответ в fn + def _question(self, text, fn): + print('CALL: _question') + assert callable(fn) + self._dialog_fn = fn + if text is not None: + self._sent_reply(text) + + # сохраняем сообщение в базе + def _message_log(self, msg): + print('CALL: _message_log') + if self._current_user is None: + self._question(None, self.question_name) + return False + MessageHistory.objects.create( + user=self._current_user, + message=msg + ) + return True + + # Начинаем диалог + # @seed - chat_id + def open(self, initial_msg, seed): + print('CALL: open') + content_type, chat_type, chat_id = glance(initial_msg) + if content_type != 'text': + return True + self._chat_id = chat_id + try: + tbot = TelegramBot.objects.get(chat_id=seed) + self._current_user = tbot.user + self._message_log(initial_msg['text']) + except TelegramBot.DoesNotExist: + self._question(u'Давай знакомиться, как тебя зовут? Напиши свой логин из биллинга.', + self.question_name) + return True # prevent on_message() from being called on the initial message + + # получаем сообщение + def on_chat_message(self, msg): + print('CALL: on_chat_message') + content_type, chat_type, chat_id = glance(msg) + if content_type != 'text': + return + self._chat_id = chat_id + text = msg['text'] + + # выполняем комманды если они есть + if text in self.cmds.keys(): + self.cmds[text]() + elif self._dialog_fn is not None: + self._dialog_fn(text) + self._dialog_fn = None + else: + self._sent_reply(u'Я пока не знаю ответа на это') + + if not self._message_log(text): + return + + # спрашиваем имя пользователя + def question_name(self, username): + print('CALL: question_name') + try: + profile = UserProfile.objects.get(username=username) + self._current_user = profile + try: + TelegramBot.objects.get(user=profile) + except TelegramBot.DoesNotExist: + print '_chat_id', self._chat_id + assert self._chat_id != 0 + TelegramBot.objects.create( + user=profile, + chat_id=self._chat_id + ) + except UserProfile.DoesNotExist: + self._question(u'Ты не найден в базе, проверь что правильно указал именно свой ЛОГИН. Попробуй ещё', + self.question_name) + return + self._sent_reply(u'Да, приятно познакомиться %s, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)' + % profile.get_full_name()) + + # заканчивается время диалога + # ex - время ожидания (timeout=ex в pave_event_space) + def on_close(self, ex): + self._current_user = None + self._dialog_fn = None + self._chat_id = 0 + print 'Destructor' + + # пингуем адрес + def ping(self, ip=None): + print('CALL: ping') + if ip is None: + self._question(u'Давай пинганём, напиши ip. Нужно будет подождать 10 сек', self.ping) + return + try: + socket.inet_aton(ip) + ret = os.popen('`which ping` -c 10 ' + ip).read() + self._sent_reply(ret) + except socket.error: + self._question(u'Это не похоже на ip адрес, попробуй ещё', self.ping) + + def say_me(self): + print('CALL: say_me') + self._sent_reply(u'Ты ведь %s ?' % self._current_user.get_full_name()) + + +# Просто отправляем текст оповещения указанному админу +def send_notify(msg_text, account): + tb = TelegramBot.objects.get(user=account) + tbot = Bot(token) + tbot.sendMessage(tb.chat_id, msg_text) + diff --git a/chatbot/tests.py b/chatbot/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/chatbot/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/chatbot/views.py b/chatbot/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/chatbot/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.