2017-02-07 21:36:31 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
2017-03-18 20:45:02 +00:00
|
|
|
import ast, dbtools, io, logging, PIL.Image, setuptools, strings, telegram.ext, twitools, urllib.request, tweepy
|
2017-02-07 21:36:31 +00:00
|
|
|
|
2017-02-07 22:11:59 +00:00
|
|
|
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)
|
2017-02-08 13:58:09 +00:00
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
def log(bot, update, error):
|
|
|
|
logger.warn("Error %s caused by '%s'" % (error, update))
|
2017-02-07 22:11:59 +00:00
|
|
|
|
2017-03-18 20:45:02 +00:00
|
|
|
def twoExceptions(e, message):
|
2017-03-18 18:23:38 +00:00
|
|
|
text = {
|
|
|
|
32: strings.badToken,
|
|
|
|
36: strings.selfSpam,
|
|
|
|
64: strings.accountSuspended,
|
|
|
|
88: strings.rateLimit,
|
|
|
|
89: strings.badToken,
|
|
|
|
99: strings.badToken,
|
|
|
|
130: strings.overload,
|
|
|
|
131: strings.twitterError,
|
|
|
|
161: strings.followLimit,
|
|
|
|
185: strings.tweetLimit,
|
|
|
|
187: strings.dupTweet,
|
|
|
|
205: strings.rateLimit,
|
|
|
|
226: strings.automatedTweet,
|
|
|
|
271: strings.selfMute,
|
|
|
|
272: strings.notMuted,
|
|
|
|
323: strings.multipleGIFs,
|
|
|
|
326: strings.accountLocked,
|
|
|
|
354: strings.longTweet
|
2017-03-18 20:45:02 +00:00
|
|
|
}.get(e.api_code)
|
2017-03-18 18:23:38 +00:00
|
|
|
|
2017-03-18 20:45:02 +00:00
|
|
|
message.reply_text(text or strings.twoFail)
|
2017-03-18 18:23:38 +00:00
|
|
|
|
|
|
|
def getTwo(message):
|
|
|
|
try:
|
|
|
|
return twitools.twoBotHelper(message.chat_id)
|
|
|
|
except ValueError:
|
|
|
|
noauth(message)
|
|
|
|
except tweepy.error.TweepError as e:
|
2017-03-18 20:45:02 +00:00
|
|
|
twoExceptions(e, message)
|
2017-02-07 21:54:22 +00:00
|
|
|
|
2017-03-18 18:23:38 +00:00
|
|
|
def noauth(message):
|
|
|
|
message.reply_text(strings.noauth)
|
2017-02-10 17:41:28 +00:00
|
|
|
|
2017-02-07 21:54:22 +00:00
|
|
|
def start(bot, update):
|
2017-02-08 13:46:59 +00:00
|
|
|
update.message.reply_text(strings.start % (setuptools.botname(), setuptools.botname()))
|
2017-02-08 11:26:25 +00:00
|
|
|
|
|
|
|
def auth(bot, update):
|
2017-02-10 17:41:28 +00:00
|
|
|
db = dbtools.dbHelper()
|
|
|
|
cid = update.message.chat_id
|
|
|
|
|
|
|
|
if not (db.ato(cid) or db.ase(cid)):
|
|
|
|
auth = tweepy.OAuthHandler(setuptools.cke(), setuptools.cse())
|
|
|
|
update.message.reply_text(strings.auth % auth.get_authorization_url())
|
|
|
|
dbtools.dbHelper().storeToken(cid, auth.request_token)
|
|
|
|
|
|
|
|
else:
|
|
|
|
update.message.reply_text(strings.authimp)
|
|
|
|
|
|
|
|
def verify(bot, update, args):
|
|
|
|
db = dbtools.dbHelper()
|
|
|
|
cid = update.message.chat_id
|
2017-02-07 21:54:22 +00:00
|
|
|
|
2017-02-10 17:41:28 +00:00
|
|
|
if db.ato(cid) and not db.ase(cid):
|
|
|
|
auth = tweepy.OAuthHandler(setuptools.cke(), setuptools.cse())
|
|
|
|
auth.request_token = ast.literal_eval(db.ato(cid))
|
|
|
|
|
|
|
|
try:
|
|
|
|
auth.get_access_token(args[0])
|
|
|
|
dbtools.dbHelper().storeUser(cid, auth.access_token, auth.access_token_secret)
|
|
|
|
update.message.reply_text(strings.verify)
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
dbtools.dbHelper().deleteUser(update.message.chat_id)
|
|
|
|
update.message.reply_text(strings.verifyfail)
|
|
|
|
|
|
|
|
else:
|
|
|
|
update.message.reply_text(strings.verifyimp)
|
|
|
|
|
2017-02-08 12:06:17 +00:00
|
|
|
def unauth(bot, update):
|
2017-02-08 12:12:05 +00:00
|
|
|
dbtools.dbHelper().deleteUser(update.message.chat_id)
|
2017-02-08 13:46:59 +00:00
|
|
|
update.message.reply_text(strings.unauth % setuptools.url())
|
2017-02-08 12:06:17 +00:00
|
|
|
|
2017-02-08 13:09:00 +00:00
|
|
|
def fish(bot, update):
|
2017-02-08 14:23:15 +00:00
|
|
|
dbtools.dbHelper().addFish(update.message.chat_id)
|
2017-03-18 18:23:38 +00:00
|
|
|
update.message.reply_text(strings.fishThanks)
|
2017-02-08 13:46:59 +00:00
|
|
|
|
2017-02-10 17:41:28 +00:00
|
|
|
def explicitTweet(bot, update, args):
|
2017-03-18 18:23:38 +00:00
|
|
|
try:
|
|
|
|
two = getTwo(update.message)
|
2017-03-18 20:45:02 +00:00
|
|
|
|
|
|
|
if update.message.photo or update.message.video or update.message.sticker:
|
|
|
|
fid = update.message.sticker.file_id if update.message.sticker else update.message.video.file_id if update.message.video else update.message.photo[-1].file_id
|
|
|
|
path = bot.getFile(fid).file_path
|
|
|
|
media = urllib.request.urlopen(path)
|
|
|
|
mobj = io.BytesIO(media.read())
|
|
|
|
|
|
|
|
filename = path.split("/")[-1]
|
|
|
|
|
|
|
|
if filename.split(".")[-1].lower() == "webp":
|
|
|
|
out = io.BytesIO()
|
|
|
|
PIL.Image.open(mobj).convert('RGB').save(out, "jpeg")
|
|
|
|
out.read()
|
|
|
|
filename = "%s.jpg" % filename.split(".")[0]
|
|
|
|
|
|
|
|
two.api.update_with_media(filename, ' '.join(args), file=mobj)
|
|
|
|
|
|
|
|
else:
|
|
|
|
two.tweet(' '.join(args))
|
|
|
|
|
2017-03-18 18:23:38 +00:00
|
|
|
except tweepy.error.TweepError as e:
|
2017-03-18 20:45:02 +00:00
|
|
|
logging.exception("Meh.")
|
|
|
|
twoExceptions(e, update.message)
|
|
|
|
|
|
|
|
except:
|
|
|
|
logging.exception("Meh.")
|
2017-02-08 14:14:03 +00:00
|
|
|
|
2017-02-08 13:46:59 +00:00
|
|
|
def tweet(bot, update):
|
2017-02-10 17:41:28 +00:00
|
|
|
try:
|
|
|
|
if dbtools.dbHelper().getTStatus(update.message.chat_id):
|
2017-02-10 17:54:30 +00:00
|
|
|
explicitTweet(bot, update, [update.message.text])
|
2017-02-10 17:41:28 +00:00
|
|
|
except:
|
2017-03-18 18:23:38 +00:00
|
|
|
noauth(update.message)
|
2017-02-10 17:41:28 +00:00
|
|
|
|
|
|
|
def timeline(bot, update, args = [10]):
|
|
|
|
try:
|
|
|
|
count = int(args[0])
|
|
|
|
except:
|
|
|
|
count = 10
|
|
|
|
|
2017-03-18 18:23:38 +00:00
|
|
|
try:
|
|
|
|
two = getTwo(update.message)
|
|
|
|
for status in two.api.home_timeline(count=count):
|
|
|
|
update.message.reply_text("%s (%s) at %s: %s" % (status.author.name, status.author.screen_name, status.created_at, status.text))
|
|
|
|
except tweepy.error.TweepError as e:
|
2017-03-18 20:45:02 +00:00
|
|
|
twoExceptions(e, update.message)
|
2017-02-08 13:09:00 +00:00
|
|
|
|
2017-02-08 14:14:03 +00:00
|
|
|
def toggleTweet(bot, update):
|
2017-02-08 14:19:01 +00:00
|
|
|
try:
|
2017-03-18 18:23:38 +00:00
|
|
|
update.message.reply_text(strings.toggleTweet % (strings.toggleTweetOn if dbtools.dbHelper().toggleTweet(update.message.chat_id) else strings.toggleTweetOff))
|
2017-02-08 14:19:01 +00:00
|
|
|
except:
|
2017-03-18 18:23:38 +00:00
|
|
|
noauth(update.message)
|
2017-02-08 14:14:03 +00:00
|
|
|
|
2017-02-08 13:58:09 +00:00
|
|
|
def unknown(bot, update):
|
2017-03-18 18:23:38 +00:00
|
|
|
update.message.reply_text(strings.unknownCommand)
|
2017-02-08 13:58:09 +00:00
|
|
|
|
2017-02-10 17:41:28 +00:00
|
|
|
def test(bot, update, args):
|
|
|
|
print(args)
|
|
|
|
unknown(bot, update)
|
|
|
|
|
2017-03-18 18:23:38 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
updater = telegram.ext.Updater(token=setuptools.token())
|
|
|
|
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("auth", auth))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("fish", fish))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("help", start))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("start", start))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("test", test, pass_args=True))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("timeline", timeline))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("toggletweet", toggleTweet))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("tweet", explicitTweet, pass_args=True))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("unauth", unauth))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.CommandHandler("verify", verify, pass_args=True))
|
2017-02-08 14:14:03 +00:00
|
|
|
|
2017-03-18 18:23:38 +00:00
|
|
|
updater.dispatcher.add_handler(telegram.ext.MessageHandler(telegram.ext.Filters.text, tweet))
|
2017-03-18 20:45:02 +00:00
|
|
|
updater.dispatcher.add_handler(telegram.ext.MessageHandler(telegram.ext.Filters.photo, tweet))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.MessageHandler(telegram.ext.Filters.sticker, tweet))
|
|
|
|
updater.dispatcher.add_handler(telegram.ext.MessageHandler(telegram.ext.Filters.video, tweet))
|
2017-03-18 18:23:38 +00:00
|
|
|
updater.dispatcher.add_handler(telegram.ext.MessageHandler(telegram.ext.Filters.command, unknown))
|
2017-02-08 13:58:09 +00:00
|
|
|
|
2017-03-18 18:23:38 +00:00
|
|
|
updater.dispatcher.add_error_handler(log)
|
2017-02-07 21:54:22 +00:00
|
|
|
|
2017-03-18 18:23:38 +00:00
|
|
|
updater.start_polling()
|
|
|
|
updater.idle()
|