Ignore "not following" errors in twitter DMs
authorMagnus Hagander <magnus@hagander.net>
Mon, 29 Oct 2018 12:22:10 +0000 (13:22 +0100)
committerMagnus Hagander <magnus@hagander.net>
Mon, 29 Oct 2018 12:22:10 +0000 (13:22 +0100)
When the cronjob tries to send a twitter DM for example to a speaker, it
fails if that user is not following the conference account. This is a
normal state, and in this case we should just ignore the message rather
than throw an error.

postgresqleu/confreg/backendviews.py
postgresqleu/confreg/management/commands/confreg_frequent_reminders.py
postgresqleu/util/messaging/twitter.py

index 4eba24d1a68a24e3fb07a868b7e87cb7a71b96d3..c7a6691e539812d1d53c9c52a5960a91845f7eeb 100644 (file)
@@ -641,9 +641,11 @@ def twitter_integration(request, urlname):
                                recipient = testform.cleaned_data['recipient']
                                message = testform.cleaned_data['message']
 
-                               ok, msg = tw.send_message(recipient, message)
+                               ok, code, msg = tw.send_message(recipient, message)
                                if ok:
                                        messages.info(request, 'Message successfully sent to {0}'.format(recipient))
+                               elif code == 150:
+                                       messages.warning(request, 'Cannot send message to users not being followed')
                                else:
                                        messages.error(request, 'Failed to send to {0}: {1}'.format(recipient, msg))
                                return HttpResponseRedirect('.')
index 3533d0db7f2824ef387de50e7701c46ff28dde75..3985c2bd9e320b7c9619fc0ada0d1df658ecebbe 100644 (file)
@@ -60,8 +60,10 @@ class Command(BaseCommand):
                                                )
                                                if reg.twittername:
                                                        # Twitter name registered, so send reminder
-                                                       ok, err = tw.send_message(reg.twittername, msg)
-                                                       if not ok:
+                                                       ok, code, err = tw.send_message(reg.twittername, msg)
+                                                       if not ok and code != 150:
+                                                               # Code 150 means trying to send DM to user not following us, so just
+                                                               # ignore that one. Other errors should be shown.
                                                                print("Failed to send twitter DM to {0}: {1}".format(reg.twittername, err))
 
                                        s.reminder_sent=True
index 62666473828cc0dbe98f8a1c5e7762f717ce01fa..74c514b1f0259bbbe9bb56dbad1a39120ef2123f 100644 (file)
@@ -39,7 +39,7 @@ class Twitter(object):
                                                                params={'screen_name': tousername})
                                _cached_twitter_users[tousername] = r.json()['id']
                        except Exception, e:
-                               return (False, "Failed to look up user %s: %s" % (tousername, e))
+                               return (False, None, "Failed to look up user %s: %s" % (tousername, e))
 
                try:
                        r = self.tw.post('https://api.twitter.com/1.1/direct_messages/events/new.json', json={
@@ -56,10 +56,15 @@ class Twitter(object):
                                }
                        })
                        if r.status_code != 200:
-                               return (False, r.text)
+                               try:
+                                       # Normally these errors come back as json
+                                       ej = r.json()['errors'][0]
+                                       return (False, ej['code'], ej['message'])
+                               except:
+                                       return (False, None, r.text)
                except Exception, e:
-                       return (False, e)
-               return (True, None)
+                       return (False, None, e)
+               return (True, None, None)
 
 
 class TwitterSetup(object):