| 
 | 1 | +# coding=utf8  | 
 | 2 | +from django.core.management.base import BaseCommand  | 
 | 3 | + | 
 | 4 | +import datetime  | 
 | 5 | +import logging  | 
 | 6 | +import smpplib.gsm  | 
 | 7 | +import smpplib.client  | 
 | 8 | +import smpplib.consts  | 
 | 9 | + | 
 | 10 | +h1 = datetime.timedelta(hours=1)  | 
 | 11 | + | 
 | 12 | +from django.conf import settings  | 
 | 13 | + | 
 | 14 | +def mkGetPdu(op: str):  | 
 | 15 | +    def getPdu(pdu):  | 
 | 16 | +        try:  | 
 | 17 | +            source = pdu.parsed['saddress']  | 
 | 18 | +            target = pdu.parsed['daddress']  | 
 | 19 | +            message = pdu.parsed.get('sm', '') + pdu.parsed.get('payload', '')  | 
 | 20 | +            from sms import models  | 
 | 21 | +            if 'submit date:' not in message:  | 
 | 22 | +                sms = models.SMS(direction=1, sphone=source, tphone=target, message=message, sended=True, op=op)  | 
 | 23 | +                sms.message = "".join(filter(lambda x: x not in ['\u0000'], sms.message))  | 
 | 24 | +                sms.save()  | 
 | 25 | + | 
 | 26 | +        except Exception as e:  | 
 | 27 | +           logging.error(e)  | 
 | 28 | + | 
 | 29 | +    return getPdu  | 
 | 30 | + | 
 | 31 | + | 
 | 32 | +def mkGenMessages(op, num):  | 
 | 33 | +    def GenMessages():  | 
 | 34 | +        from sms.models import SMS  | 
 | 35 | +        newSMS = list(SMS.objects.filter(op=op, direction=0, sended=False)[:100])  | 
 | 36 | + | 
 | 37 | +        if newSMS:  | 
 | 38 | +            for sms in newSMS:  | 
 | 39 | +                if not sms.sphone:  | 
 | 40 | +                    sms.sphone = num  | 
 | 41 | +                sms.sended = True  | 
 | 42 | +                sms.save()  | 
 | 43 | +                yield (sms.sphone, sms.tphone, sms.message)  | 
 | 44 | +        yield None  | 
 | 45 | + | 
 | 46 | +    return GenMessages  | 
 | 47 | + | 
 | 48 | + | 
 | 49 | +class Command(BaseCommand):  | 
 | 50 | +    help = 'serve SMPP requests'  | 
 | 51 | + | 
 | 52 | +    def add_arguments(self, parser):  | 
 | 53 | +        parser.add_argument('op', help='tele2/mts/beeline')  | 
 | 54 | + | 
 | 55 | +    def handle(self, *args, **options):  | 
 | 56 | +        logging.basicConfig(level='DEBUG')  | 
 | 57 | +        try:  | 
 | 58 | +            op = options['op']  | 
 | 59 | +            s = settings.SMPP[op]  | 
 | 60 | +        except:  | 
 | 61 | +            logging.error("no such config")  | 
 | 62 | +            exit()  | 
 | 63 | + | 
 | 64 | +        timeout = 15  | 
 | 65 | +        if options['op'] == 'megafon':  | 
 | 66 | +            timeout = 60  | 
 | 67 | +        client = smpplib.client.Client(s['ip'], s['port'], timeout)  | 
 | 68 | + | 
 | 69 | +        client.set_message_received_handler(mkGetPdu(op))  | 
 | 70 | +        client.set_message_source(mkGenMessages(op, s['source']))  | 
 | 71 | +        client.connect()  | 
 | 72 | + | 
 | 73 | +        client.bind_transceiver(system_id=s['system_id'], password=s['password'])  | 
 | 74 | +        try:  | 
 | 75 | +            client.listen([11])  | 
 | 76 | +        except Exception as e:  | 
 | 77 | +            logging.error(e)  | 
0 commit comments