選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

381 行
19 KiB

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # This program is dedicated to the public domain under the CC0 license.
  4. # Telegram - Betaseries
  5. import logging
  6. import requests
  7. import json
  8. from telegram import InlineKeyboardButton, InlineKeyboardMarkup
  9. from telegram.ext import Updater, CommandHandler, CallbackQueryHandler
  10. from config import config, series
  11. from betaseries import login_beta, get_title_only, to_see, seen, get_episode_code, what_2see, get_ep_code_series
  12. from telegram_api import send_message
  13. # Activer / Désactiver le debuggage {Projet : pas encore utilisé}
  14. DEBUG = True
  15. # Recupération de la configuration dans config.py
  16. client_id = config['client_id']
  17. login= config['login']
  18. password = config['password']
  19. user_id = config['user_id']
  20. token_bot = config['token_bot']
  21. #Debug only -> permet d'afficher les erreurs sur la console.
  22. logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
  23. level=logging.INFO)
  24. logger = logging.getLogger(__name__)
  25. def help(update, context):
  26. message = "Commandes du bot : " + '\n \n'
  27. message += u"/help - Permet d'afficher ce message \n"
  28. message += u"/start - Afficher le message d'accueil \n"
  29. message += u"/ping - Verifier le temps de reaction du bot /!\Parfois il se peut que ça soit l'API de Betaseries qui prenne du temps \n"
  30. message += u"/repeat {message} - Permet de repeter votre message + permet d'afficher votre ID dans la console \n"
  31. message += u"/latest - permet de voir les derniers episodes des series surveillées \n"
  32. message += u"/liste - permet de voir les series surveillées \n"
  33. message += u"/all_seen - permet de dire qu'on a vu tout les episodes d'une des series surveillées \n"
  34. message += u"/2see - Permet de voir les episodes que nous n'avons pas encore vu sur Betaseries \n"
  35. message += u"/watched - Permet de marquer un épisode comme 'vu' dans la liste de la commande /2see"
  36. update.message.reply_text(message)
  37. def start(update, context):
  38. message = "Bonjour, " + "\n" + "je suis un bot telegram vous permettant de marquer une serie comme 'vu' sur votre compte Betaseries" + '\n \n'
  39. message += u"Pour commencer à utiliser le bot, vous aurez besoin de suivre le guide. Bien que le bot répond ici : ça ne veut pas dire que toutes les fonctions sont disponibles ! " + '\n \n'
  40. message += u"Si vous avez le moindre problème, référez vous au guide présent ici : https://git.thoughtless.eu/Cinabre/Telegram-Betaseries" + '\n \n'
  41. message += u"Pour voir la liste des commandes, tapez /help"
  42. update.message.reply_text(message)
  43. return
  44. def ping(update, context):
  45. send_message("Pong!")
  46. return
  47. def init(update, context):
  48. update.message.reply_text("Tentative de connexion à Betaseries...")
  49. data = login_beta()
  50. if data == False :
  51. error = "Impossible d'interroger l'API\n Code:" + str(request.status_code)
  52. update.message.reply_text(error)
  53. return
  54. #Si la fonction ne renvoie pas "False", on considère que le token est bon !
  55. betauser = data
  56. message = "Token utilise pour Betaseries : " + betauser
  57. # à editer : nous utiliserons plutot la librairie de telegram lorsque nous répondons à une commande. l'API sera utile pour le script
  58. API_Message = 'https://api.telegram.org/'
  59. API_Message += 'bot' + token_bot + '/sendMessage?chat_id=' + user_id + '&text='
  60. #
  61. Notification = API_Message + "Connection Reussie ! "
  62. request = requests.post(Notification)
  63. Notification = API_Message + " Votre Token sur Betaseries: " + betauser
  64. request = requests.post(Notification)
  65. update.message.reply_text("Vous pouvez maintenant utiliser le bot !")
  66. print("Token Betaseries :", betauser)
  67. return
  68. def repeat(update, context):
  69. message = ''
  70. user = update.message.from_user
  71. print('Pseudo du compte : {} ID: {} '.format(user['username'], user['id']))
  72. if len(context.args) > 1 :
  73. for i in range(len(context.args)):
  74. mot = str(context.args[i]) + " "
  75. message += mot
  76. message = message[:-1]
  77. else :
  78. message = context.args[0]
  79. print("phrase envoyée : ", message)
  80. if message == "Tu es genial":
  81. update.message.reply_text("Je me trouve aussi genial !")
  82. return
  83. update.message.reply_text(message)
  84. return
  85. def latest(update, context):
  86. message = 'à voir : \n'
  87. for i in range(len(series)):
  88. thetvdb_id = series[i]
  89. episode = to_see(thetvdb_id)
  90. if episode != False:
  91. message += '- ' + str(episode)
  92. send_message(message)
  93. def liste(update, context):
  94. message = ''
  95. message = u'Liste des séries surveillées : ' + '\n'
  96. for i in range(len(series)):
  97. message += '- ' + get_title_only(series[i]) + '\n'
  98. message += '\n' + "Bon Visionnage !"
  99. send_message(message)
  100. def ive_all_seen(update, context):
  101. global callback
  102. callback = 1
  103. send_message(u'Selectionnez la serie dont vous avez vu le dernier episode !')
  104. if type(series) == str :
  105. file_path = 'latest/' + series + '.json'
  106. print(file_path)
  107. with open(file_path) as json_file:
  108. data = json.load(json_file)
  109. keyboard = [[InlineKeyboardButton(data['serie_title'] + '|' + 'S' + str(data['season ']) + 'E' + str(data['episode']), callback_data='1')]]
  110. reply_markup = InlineKeyboardMarkup(keyboard)
  111. update.message.reply_text('Vous avez vu :', reply_markup=reply_markup)
  112. return
  113. else :
  114. if len(series) == 2 :
  115. keyboard = [[InlineKeyboardButton(get_title_only(series[0]), callback_data='1'),
  116. InlineKeyboardButton(get_title_only(series[1]), callback_data='2')]]
  117. if len(series) == 3 :
  118. keyboard = [
  119. [InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2')],
  120. [InlineKeyboardButton(get_title_only(series[2]), callback_data='3')]
  121. ]
  122. if len(series) == 4 :
  123. keyboard = [
  124. [InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2') ],
  125. [InlineKeyboardButton(get_title_only(series[2]), callback_data='3'), InlineKeyboardButton(get_title_only(series[3]), callback_data='4') ]
  126. ]
  127. if len(series) == 5 :
  128. keyboard = [
  129. [ InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2')],
  130. [ InlineKeyboardButton(get_title_only(series[2]), callback_data='3'), InlineKeyboardButton(get_title_only(series[3]), callback_data='4')],
  131. [ InlineKeyboardButton(get_title_only(series[4]), callback_data='5')]
  132. ]
  133. if len(series) == 6 :
  134. keyboard = [
  135. [ InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2')],
  136. [ InlineKeyboardButton(get_title_only(series[2]), callback_data='3'), InlineKeyboardButton(get_title_only(series[3]), callback_data='4')],
  137. [ InlineKeyboardButton(get_title_only(series[4]), callback_data='5'), InlineKeyboardButton(get_title_only(series[5]), callback_data='6')]
  138. ]
  139. if len(series) == 7 :
  140. keyboard = [
  141. [ InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2')],
  142. [ InlineKeyboardButton(get_title_only(series[2]), callback_data='3'), InlineKeyboardButton(get_title_only(series[3]), callback_data='4')],
  143. [ InlineKeyboardButton(get_title_only(series[4]), callback_data='5'), InlineKeyboardButton(get_title_only(series[5]), callback_data='6')],
  144. [ InlineKeyboardButton(get_title_only(series[6]), callback_data='7')]
  145. ]
  146. if len(series) == 8 :
  147. keyboard = [
  148. [ InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2')],
  149. [ InlineKeyboardButton(get_title_only(series[2]), callback_data='3'), InlineKeyboardButton(get_title_only(series[3]), callback_data='4')],
  150. [ InlineKeyboardButton(get_title_only(series[4]), callback_data='5'), InlineKeyboardButton(get_title_only(series[5]), callback_data='6')],
  151. [ InlineKeyboardButton(get_title_only(series[6]), callback_data='7'), InlineKeyboardButton(get_title_only(series[7]), callback_data='8')]
  152. ]
  153. if len(series) == 9 :
  154. keyboard = [
  155. [ InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2')],
  156. [ InlineKeyboardButton(get_title_only(series[2]), callback_data='3'), InlineKeyboardButton(get_title_only(series[3]), callback_data='4')],
  157. [ InlineKeyboardButton(get_title_only(series[4]), callback_data='5'), InlineKeyboardButton(get_title_only(series[5]), callback_data='6')],
  158. [ InlineKeyboardButton(get_title_only(series[6]), callback_data='7'), InlineKeyboardButton(get_title_only(series[7]), callback_data='8')],
  159. [ InlineKeyboardButton(get_title_only(series[8]), callback_data='9')]
  160. ]
  161. if len(series) == 10 :
  162. keyboard = [
  163. [ InlineKeyboardButton(get_title_only(series[0]), callback_data='1'), InlineKeyboardButton(get_title_only(series[1]), callback_data='2')],
  164. [ InlineKeyboardButton(get_title_only(series[2]), callback_data='3'), InlineKeyboardButton(get_title_only(series[3]), callback_data='4')],
  165. [ InlineKeyboardButton(get_title_only(series[4]), callback_data='5'), InlineKeyboardButton(get_title_only(series[5]), callback_data='6')],
  166. [ InlineKeyboardButton(get_title_only(series[6]), callback_data='7'), InlineKeyboardButton(get_title_only(series[7]), callback_data='8')],
  167. [ InlineKeyboardButton(get_title_only(series[8]), callback_data='9'), InlineKeyboardButton(get_title_only(series[9]), callback_data='10') ]
  168. ]
  169. reply_markup = InlineKeyboardMarkup(keyboard)
  170. update.message.reply_text('Selectionnez une reponse', reply_markup=reply_markup)
  171. return
  172. def button(update, context):
  173. query = update.callback_query
  174. query.answer()
  175. # Si jamais l'utilisateur fait le 1er choix, on vérifie si jamais 'series' n'est pas un str (qui serait donc le cas ou l'utilisateur n'a qu'une serie
  176. if callback == 1:
  177. if query['data'] == u'1' :
  178. if type(series) == str :
  179. seen(series, 'latest')
  180. episode = get_title_only(series) + ' | ' + get_episode_code(series)
  181. query.edit_message_text(text="Choix de la series : {}".format(episode))
  182. return
  183. else :
  184. seen(series[0], 'latest')
  185. episode = get_title_only(series[0]) + ' | ' + get_episode_code(series[0])
  186. query.edit_message_text(text="Choix de la series : {}".format(episode))
  187. return
  188. number = int(query['data']) - 1
  189. seen(series[number], 'latest')
  190. episode = get_title_only(series[number]) + ' | ' + get_episode_code(series[number])
  191. query.edit_message_text(text="Choix de la series : {}".format(episode))
  192. return
  193. if callback == 2 :
  194. with open(query['data']) as json_file:
  195. data = json.load(json_file)
  196. message = u"episode que vous venez de marquer comme 'vu' : " + '\n' + data["title"] + " - S" + str(data['season']) + "E" + str(data['episode']) + " ID: " + str(data['id'])
  197. with open(query['data'], 'r') as episode_file:
  198. episode = json.load(episode_file)
  199. seen(episode[u'id'], 'watched')
  200. query.edit_message_text(text=message)
  201. what_2see()
  202. def what2see(update, context):
  203. send_message("Voici la liste des épisodes que vous devez voir :")
  204. message = what_2see()
  205. send_message(message)
  206. return
  207. def watched(update, context):
  208. global callback
  209. callback = 2
  210. list=[]
  211. file=[]
  212. with open('cache_to_see.json', 'r') as list_file:
  213. list = json.load(list_file)
  214. for i in range(len(list)) :
  215. file_path = 'series/' + list[i] + '.json'
  216. file.append(file_path)
  217. longueur = int(len(list))
  218. print("Longueur de la liste : ", longueur)
  219. if longueur == 2 :
  220. choix = [
  221. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])]
  222. ]
  223. if longueur == 3 :
  224. choix = [
  225. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  226. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2])]
  227. ]
  228. if longueur == 4 :
  229. choix = [
  230. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  231. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2]), InlineKeyboardButton(get_ep_code_series(file[3]), callback_data=file[3])]
  232. ]
  233. if longueur == 5 :
  234. choix = [
  235. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  236. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2]), InlineKeyboardButton(get_ep_code_series(file[3]), callback_data=file[3])],
  237. [ InlineKeyboardButton(get_ep_code_series(file[4]), callback_data=file[4])]
  238. ]
  239. if longueur == 6 :
  240. choix = [
  241. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  242. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2]), InlineKeyboardButton(get_ep_code_series(file[3]), callback_data=file[3])],
  243. [ InlineKeyboardButton(get_ep_code_series(file[4]), callback_data=file[4]), InlineKeyboardButton(get_ep_code_series(file[5]), callback_data=file[5])]
  244. ]
  245. if longueur == 7 :
  246. choix = [
  247. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  248. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2]), InlineKeyboardButton(get_ep_code_series(file[3]), callback_data=file[3])],
  249. [ InlineKeyboardButton(get_ep_code_series(file[4]), callback_data=file[4]), InlineKeyboardButton(get_ep_code_series(file[5]), callback_data=file[5])],
  250. [ InlineKeyboardButton(get_ep_code_series(file[6]), callback_data=file[6])]
  251. ]
  252. if longueur == 8 :
  253. choix = [
  254. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  255. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2]), InlineKeyboardButton(get_ep_code_series(file[3]), callback_data=file[3])],
  256. [ InlineKeyboardButton(get_ep_code_series(file[4]), callback_data=file[4]), InlineKeyboardButton(get_ep_code_series(file[5]), callback_data=file[5])],
  257. [ InlineKeyboardButton(get_ep_code_series(file[6]), callback_data=file[6]), InlineKeyboardButton(get_ep_code_series(file[7]), callback_data=file[7])]
  258. ]
  259. if longueur == 9 :
  260. choix = [
  261. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  262. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2]), InlineKeyboardButton(get_ep_code_series(file[3]), callback_data=file[3])],
  263. [ InlineKeyboardButton(get_ep_code_series(file[4]), callback_data=file[4]), InlineKeyboardButton(get_ep_code_series(file[5]), callback_data=file[5])],
  264. [ InlineKeyboardButton(get_ep_code_series(file[6]), callback_data=file[6]), InlineKeyboardButton(get_ep_code_series(file[7]), callback_data=file[7])],
  265. [ InlineKeyboardButton(get_ep_code_series(file[8]), callback_data=file[8])]
  266. ]
  267. if longueur == 10 :
  268. choix = [
  269. [ InlineKeyboardButton(get_ep_code_series(file[0]), callback_data=file[0]), InlineKeyboardButton(get_ep_code_series(file[1]), callback_data=file[1])],
  270. [ InlineKeyboardButton(get_ep_code_series(file[2]), callback_data=file[2]), InlineKeyboardButton(get_ep_code_series(file[3]), callback_data=file[3])],
  271. [ InlineKeyboardButton(get_ep_code_series(file[4]), callback_data=file[4]), InlineKeyboardButton(get_ep_code_series(file[5]), callback_data=file[5])],
  272. [ InlineKeyboardButton(get_ep_code_series(file[6]), callback_data=file[6]), InlineKeyboardButton(get_ep_code_series(file[7]), callback_data=file[7])],
  273. [ InlineKeyboardButton(get_ep_code_series(file[8]), callback_data=file[8]), InlineKeyboardButton(get_ep_code_series(file[9]), callback_data=file[9]) ]
  274. ]
  275. if longueur > 10 or longueur == 1 :
  276. send_message("Un probleme est survenu lors de l'interrogation de la liste")
  277. send_message("Longueur de la liste : ")
  278. send_message(str(longueur))
  279. send_message(str(type(longueur)))
  280. return
  281. reply_markup = InlineKeyboardMarkup(choix)
  282. update.message.reply_text("Selectionnez l'episode que vous avez vu", reply_markup=reply_markup)
  283. def main():
  284. updater = Updater(token_bot, use_context=True)
  285. print("Bot connecté")
  286. dp = updater.dispatcher
  287. dp.add_handler(CommandHandler("start", start))
  288. dp.add_handler(CommandHandler("help", help))
  289. dp.add_handler(CommandHandler("ping", ping))
  290. dp.add_handler(CommandHandler("repeat", repeat,
  291. pass_args=True,
  292. pass_job_queue=True,
  293. pass_chat_data=True))
  294. dp.add_handler(CommandHandler("initialisation", init,
  295. pass_args=True,
  296. pass_job_queue=True,
  297. pass_chat_data=True))
  298. dp.add_handler(CommandHandler("liste", liste))
  299. dp.add_handler(CommandHandler("latest", latest))
  300. dp.add_handler(CommandHandler("all_seen", ive_all_seen))
  301. updater.dispatcher.add_handler(CallbackQueryHandler(button))
  302. dp.add_handler(CommandHandler("2see", what2see))
  303. dp.add_handler(CommandHandler("watched", watched))
  304. updater.start_polling()
  305. updater.idle()
  306. if __name__ == '__main__':
  307. main()