Receive incoming messages every 300 seconds
parent
4c47546415
commit
23a95499b8
@ -0,0 +1,55 @@
|
||||
from datetime import timezone
|
||||
from django.conf import settings
|
||||
import requests
|
||||
|
||||
|
||||
BASE_URL = "https://api.sipgate.com/v2"
|
||||
|
||||
|
||||
class SMS:
|
||||
def __init__(self, item):
|
||||
self.content = item["smsContent"]
|
||||
self.created_at = item["created"]
|
||||
self.id = item["id"]
|
||||
self.sender = item["source"]
|
||||
|
||||
|
||||
def list_incoming_sms(from_date=None):
|
||||
if not settings.SIPGATE_INCOMING_TOKEN_ID:
|
||||
raise RuntimeError("required setting SIPGATE_INCOMING_TOKEN_ID is not set")
|
||||
|
||||
if not settings.SIPGATE_INCOMING_TOKEN:
|
||||
raise RuntimeError("required setting SIPGATE_INCOMING_TOKEN is not set")
|
||||
|
||||
limit = 10
|
||||
params = {
|
||||
"directions": "INCOMING",
|
||||
"limit": limit,
|
||||
"types": "SMS",
|
||||
}
|
||||
|
||||
if from_date is not None:
|
||||
params["from"] = (
|
||||
from_dt.astimezone(timezone.utc).isoformat(timespec="seconds") + "Z"
|
||||
)
|
||||
|
||||
items = []
|
||||
offset = 0
|
||||
total = 10
|
||||
while offset < total:
|
||||
r = requests.get(
|
||||
f"{BASE_URL}/history",
|
||||
auth=requests.auth.HTTPBasicAuth(
|
||||
settings.SIPGATE_INCOMING_TOKEN_ID, settings.SIPGATE_INCOMING_TOKEN
|
||||
),
|
||||
params=params | {"offset": offset},
|
||||
)
|
||||
r.raise_for_status()
|
||||
|
||||
data = r.json()
|
||||
|
||||
items += data["items"]
|
||||
offset += limit
|
||||
total = data["totalCount"]
|
||||
|
||||
return list(map(lambda item: SMS(item), items))
|
@ -1,3 +1,9 @@
|
||||
from django.contrib import admin
|
||||
from .models import IncomingMessage
|
||||
|
||||
# Register your models here.
|
||||
|
||||
|
||||
@admin.register(IncomingMessage)
|
||||
class IncomingMessageAdmin(admin.ModelAdmin):
|
||||
list_display = ("sender", "created_at")
|
||||
|
@ -0,0 +1,30 @@
|
||||
# Generated by Django 4.0.4 on 2023-05-06 23:27
|
||||
|
||||
from django.db import migrations, models
|
||||
import phonenumber_field.modelfields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
initial = True
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="IncomingMessage",
|
||||
fields=[
|
||||
("id", models.IntegerField(primary_key=True, serialize=False)),
|
||||
(
|
||||
"sender",
|
||||
phonenumber_field.modelfields.PhoneNumberField(
|
||||
max_length=128, region=None
|
||||
),
|
||||
),
|
||||
("content", models.TextField()),
|
||||
("created_at", models.DateTimeField()),
|
||||
],
|
||||
options={
|
||||
"get_latest_by": "created_at",
|
||||
},
|
||||
),
|
||||
]
|
@ -1,4 +1,15 @@
|
||||
from django.db import models
|
||||
from phonenumber_field.modelfields import PhoneNumberField
|
||||
from shiftregister.app.models import *
|
||||
|
||||
# Create your models here.
|
||||
|
||||
|
||||
class IncomingMessage(models.Model):
|
||||
class Meta:
|
||||
get_latest_by = "created_at"
|
||||
|
||||
id = models.IntegerField(primary_key=True)
|
||||
sender = PhoneNumberField()
|
||||
content = models.TextField()
|
||||
created_at = models.DateTimeField()
|
||||
|
@ -0,0 +1,27 @@
|
||||
from celery import shared_task
|
||||
from django.conf import settings
|
||||
from shiftregister.app.sipgate.history import list_incoming_sms
|
||||
from .models import IncomingMessage
|
||||
import sentry_sdk
|
||||
|
||||
|
||||
@shared_task
|
||||
def receive_messages():
|
||||
if not settings.SIPGATE_INCOMING_TOKEN or not settings.SIPGATE_INCOMING_TOKEN_ID:
|
||||
return
|
||||
|
||||
try:
|
||||
from_dt = IncomingMessage.objects.latest()
|
||||
except IncomingMessage.DoesNotExist:
|
||||
from_dt = None
|
||||
|
||||
try:
|
||||
for sms in list_incoming_sms(from_dt):
|
||||
IncomingMessage(
|
||||
id=sms.id,
|
||||
sender=sms.sender,
|
||||
content=sms.content,
|
||||
created_at=sms.created_at,
|
||||
).save()
|
||||
except Exception as e:
|
||||
sentry_sdk.capture_exception(e)
|
Loading…
Reference in New Issue