You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
6.4 KiB
161 lines
6.4 KiB
from django.contrib import messages
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin
|
|
from django.http import HttpResponseForbidden, HttpResponse, HttpResponseNotFound
|
|
from django.shortcuts import resolve_url
|
|
from django.urls import reverse_lazy
|
|
from django.utils.decorators import method_decorator
|
|
from django.utils.translation import gettext_lazy as _, gettext
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, FormView, View
|
|
from django.views.generic.detail import SingleObjectMixin
|
|
from viberbot.api.messages import KeyboardMessage, ContactMessage
|
|
from viberbot.api.user_profile import UserProfile as ViberUserProfile
|
|
from viberbot.api.viber_requests import ViberMessageRequest, ViberSubscribedRequest, ViberFailedRequest, \
|
|
ViberUnsubscribedRequest
|
|
|
|
from accounts_app.models import UserProfile
|
|
from djing.lib.mixins import LoginAdminPermissionMixin, LoginAdminMixin
|
|
from messenger import forms, models
|
|
|
|
from messenger.models import ViberMessage, ViberSubscriber
|
|
|
|
|
|
class messengerListView(LoginAdminPermissionMixin, ListView):
|
|
model = models.Messenger
|
|
permission_required = 'messenger.view_messenger'
|
|
|
|
|
|
class AddmessengerCreateView(LoginAdminMixin, FormView):
|
|
template_name = 'messenger/add_messenger.html'
|
|
form_class = forms.MessengerForm
|
|
|
|
def form_valid(self, form):
|
|
bot_type = form.cleaned_data.get('bot_type')
|
|
if isinstance(bot_type, int) and bot_type > 0:
|
|
if bot_type == 1:
|
|
self.success_url = resolve_url('messenger:add_viber_messenger')
|
|
return super().form_valid(form)
|
|
messages.info(self.request, _('Unexpected bot type'))
|
|
self.success_url = resolve_url('messenger:messengers_list')
|
|
return super().form_valid(form)
|
|
|
|
|
|
class AddmessengerViberCreateView(LoginAdminMixin, PermissionRequiredMixin, CreateView):
|
|
model = models.ViberMessenger
|
|
form_class = forms.MessengerViberForm
|
|
permission_required = 'messenger.add_vibermessenger'
|
|
success_url = reverse_lazy('messenger:messengers_list')
|
|
|
|
def form_valid(self, form):
|
|
r = super().form_valid(form)
|
|
messages.success(self.request, _('New viber messenger successfully created'))
|
|
return r
|
|
|
|
|
|
class UpdateVibermessengerUpdateView(LoginAdminPermissionMixin, UpdateView):
|
|
model = models.ViberMessenger
|
|
form_class = forms.MessengerViberForm
|
|
permission_required = 'messenger.change_vibermessenger'
|
|
|
|
def form_valid(self, form):
|
|
r = super().form_valid(form)
|
|
messages.success(self.request, _('Viber messenger successfully updated'))
|
|
return r
|
|
|
|
|
|
class RemoveVibermessengerDeleteView(LoginAdminPermissionMixin, DeleteView):
|
|
model = models.ViberMessenger
|
|
permission_required = 'messenger.delete_vibermessenger'
|
|
success_url = reverse_lazy('messenger:messengers_list')
|
|
|
|
def delete(self, request, *args, **kwargs):
|
|
r = super().delete(request, *args, **kwargs)
|
|
messages.success(request, _('Viber messenger successfully deleted'))
|
|
return r
|
|
|
|
|
|
@method_decorator(csrf_exempt, name='post')
|
|
class ListenViberView(SingleObjectMixin, View):
|
|
http_method_names = 'post',
|
|
model = models.ViberMessenger
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
if not obj:
|
|
return HttpResponseNotFound()
|
|
self.object = obj
|
|
viber = obj.get_viber()
|
|
if not viber.verify_signature(request.body, request.META.get('HTTP_X_VIBER_CONTENT_SIGNATURE')):
|
|
return HttpResponseForbidden()
|
|
# this library supplies a simple way to receive a request object
|
|
vr = viber.parse_request(request.body)
|
|
if isinstance(vr, ViberMessageRequest):
|
|
in_msg = vr.message
|
|
if isinstance(in_msg, ContactMessage):
|
|
self.inbox_contact(in_msg, vr.sender)
|
|
subscriber, created = self.make_subscriber(vr.sender)
|
|
if not created:
|
|
ViberMessage.objects.create(
|
|
msg=vr.message,
|
|
sender=vr.sender.id,
|
|
messenger=obj,
|
|
subscriber=subscriber
|
|
)
|
|
elif isinstance(vr, ViberSubscribedRequest):
|
|
self.make_subscriber(vr.user)
|
|
elif isinstance(vr, ViberFailedRequest):
|
|
print("client failed receiving message. failure: {0}".format(vr))
|
|
elif isinstance(vr, ViberUnsubscribedRequest):
|
|
ViberSubscriber.objects.filter(
|
|
uid=vr.user_id
|
|
).delete()
|
|
return HttpResponse(status=200)
|
|
|
|
def make_subscriber(self, viber_user_profile: ViberUserProfile):
|
|
subscriber, created = ViberSubscriber.objects.get_or_create(
|
|
uid=viber_user_profile.id,
|
|
defaults={
|
|
'name': viber_user_profile.name,
|
|
'avatar': viber_user_profile.avatar
|
|
}
|
|
)
|
|
if created and hasattr(self, 'object'):
|
|
msg = KeyboardMessage(keyboard={
|
|
'Type': 'keyboard',
|
|
'DefaultHeight': True,
|
|
'Buttons': ({
|
|
'ActionType': 'share-phone',
|
|
'ActionBody': 'reply to me',
|
|
"Text": gettext('My telephone number'),
|
|
"TextSize": "medium"
|
|
},)
|
|
}, min_api_version=3)
|
|
viber = self.object.get_viber()
|
|
viber.send_messages(viber_user_profile.id, msg)
|
|
return subscriber, created
|
|
|
|
def inbox_contact(self, msg, sender: ViberUserProfile):
|
|
tel = msg.contact.phone_number
|
|
accs = UserProfile.objects.filter(telephone__icontains=tel)
|
|
viber = self.object.get_viber()
|
|
if accs.exists():
|
|
subs = ViberSubscriber.objects.filter(uid=sender.id)
|
|
if subs.exists():
|
|
subs.update(account=accs.first())
|
|
viber.send_messages(sender.id, gettext(
|
|
'Your account is attached. Now you will be receive notifications from billing'
|
|
))
|
|
else:
|
|
viber.send_messages(sender.id, gettext('Telephone not found, please specify telephone number in account in billing'))
|
|
|
|
|
|
class SetWebhook(LoginAdminMixin, SingleObjectMixin, View):
|
|
http_method_names = 'get',
|
|
model = models.ViberMessenger
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
obj = self.get_object()
|
|
if not obj:
|
|
return HttpResponseNotFound
|
|
obj.send_webhook()
|
|
return HttpResponse(b'ok', status=200)
|