Advertisement
Guest User

Untitled

a guest
Jan 3rd, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.98 KB | None | 0 0
  1. import time
  2. import datetime
  3. import dateutil
  4. import json
  5. import bot_engine.const as const
  6. import bot_engine.util as util
  7. # import bot_engine.utility.kms as kms
  8. from bot_engine.log import log as bot_log
  9. from bot_engine.bot_base import BotBase
  10. from bot_engine.request.core import BotCoreRequest
  11. # from bot_engine.request.rocket_chat import RocketChatRequest
  12. from bot_engine.state import State
  13. from bot_engine.queue import BotQueue
  14. from bot_engine.model import (User, BotProfile, GeneralProfile, BotReply,
  15. Lookupgroup, Lookup, UserProfile, ActivityLog)
  16.  
  17.  
  18. class BotUpdate(BotBase):
  19. """
  20. Class for querying user, create user, and updating user
  21. """
  22. def __init__(self,
  23. file_config='config/update.conf',
  24. log=None):
  25. """
  26.  
  27. Args:
  28. log (Logger)
  29. file_config (string)
  30. """
  31. BotBase.__init__(self, log=log, file_config=file_config)
  32. self.request = BotCoreRequest(log=self.log)
  33. # self.rocket_chat = RocketChatRequest()
  34.  
  35. def get_user_by_id(self, uid):
  36. """
  37.  
  38. Args:
  39. uid (int): user id
  40.  
  41. Returns:
  42. bot_engine.model.User: response User object
  43. """
  44. return self.request.get_user(uid=uid)
  45.  
  46. def get_user(self, message):
  47. """
  48. Get user's data from bot database by message or callback query.
  49.  
  50. Args:
  51. message (bot_engine.model.BotMessage)
  52.  
  53. Returns:
  54. bot_engine.model.User: correspond user based on message's user id
  55. """
  56. self.log.debug('GET USER')
  57. user = None
  58.  
  59. if message.from_telegram_uid:
  60. telegram_uid = message.from_telegram_uid
  61. user = self.request.get_user_by_telegram_uid(telegram_uid)
  62. if user:
  63. user.bot_profile.last_active_platform = const.PLATFORM_TELEGRAM
  64.  
  65. if message.from_line_uid:
  66. line_uid = message.from_line_uid
  67. user = self.request.get_user_by_line_uid(line_uid)
  68. if user:
  69. user.bot_profile.last_active_platform = const.PLATFORM_LINE
  70.  
  71. if message.from_facebook_uid:
  72. facebook_uid = message.from_facebook_uid
  73. user = self.request.get_user_by_facebook_uid(facebook_uid)
  74. if user:
  75. user.bot_profile.last_active_platform = const.PLATFORM_FACEBOOK
  76.  
  77. if message.from_rocketchat_uid:
  78. rocketchat_uid = message.from_rocketchat_uid
  79. user = self.request.get_user_by_rocketchat_uid(rocketchat_uid)
  80. if user:
  81. user.bot_profile.last_active_platform = const.PLATFORM_RC
  82.  
  83. if message.from_mobile_uid:
  84. mobile_uid = message.from_mobile_uid
  85. user = self.request.get_user_by_mobile_uid(mobile_uid)
  86. if user:
  87. user.bot_profile.last_active_platform = const.PLATFORM_MOBILE
  88.  
  89. return user
  90.  
  91. def get_engagement(self, user_id):
  92. """
  93.  
  94. Args:
  95. user_id (int)
  96.  
  97. Returns:
  98. bot_engine.model.Engagement:
  99. """
  100. engagement = self.request.get_last_active_engagement(user_id)
  101. return engagement
  102.  
  103. def create_user(self, message):
  104. """
  105. Instantiate new user with provided uid, save to database
  106.  
  107. Args:
  108. message (bot_engine.model.BotMessage)
  109.  
  110. Returns:
  111. bot_engine.model.User: created user
  112. """
  113. self.log.debug('CREATE USER')
  114. first_name = None
  115. last_name = None
  116. last_active_platform = None
  117. if message.from_telegram_uid:
  118. telegram_uid = message.from_telegram_uid
  119. first_name = message.from_first_name
  120. last_name = message.from_last_name
  121. last_active_platform = const.PLATFORM_TELEGRAM
  122.  
  123. if message.from_line_uid:
  124. line_uid = message.from_line_uid
  125. first_name = message.from_first_name
  126. last_name = message.from_last_name
  127. last_active_platform = const.PLATFORM_LINE
  128. picture_profile = message.photo_profile
  129.  
  130. if message.from_facebook_uid:
  131. facebook_uid = message.from_facebook_uid
  132. first_name = message.from_first_name
  133. last_name = message.from_last_name
  134. last_active_platform = const.PLATFORM_FACEBOOK
  135.  
  136. if message.from_rocketchat_uid:
  137. rocketchat_uid = message.from_rocketchat_uid
  138. first_name = message.from_first_name
  139. last_name = message.from_last_name
  140. last_active_platform = const.PLATFORM_RC
  141.  
  142. if message.from_mobile_uid:
  143. mobile_uid = message.from_mobile_uid
  144. first_name = message.from_first_name
  145. last_name = message.from_last_name
  146. last_active_platform = const.PLATFORM_MOBILE
  147. device_token = message.from_device_token
  148. # ADD QUERY FROM LINE
  149. # if message.telegram:
  150. # telegram_uid = message.telegram.message.from_user.id
  151. # first_name = message.telegram.message.from_user.first_name
  152. # last_name = message.telegram.message.from_user.last_name
  153.  
  154. user = User()
  155. # Bot Profile
  156. bot_profile = BotProfile()
  157. if message.from_telegram_uid:
  158. bot_profile.telegram_uid = telegram_uid
  159. if message.from_line_uid:
  160. bot_profile.line_uid = line_uid
  161. if message.from_facebook_uid:
  162. bot_profile.facebook_uid = facebook_uid
  163. if message.from_rocketchat_uid:
  164. bot_profile.rocketchat_uid = rocketchat_uid
  165. if message.from_mobile_uid:
  166. bot_profile.mobile_uid = mobile_uid
  167.  
  168. bot_profile.language = const.LANGUAGE_ID
  169. bot_profile.current_state_id = 1
  170. bot_profile.last_active_platform = last_active_platform
  171.  
  172. # General Profile
  173. general_profile = GeneralProfile()
  174. general_profile.first_name = first_name
  175. general_profile.last_name = last_name
  176. general_profile.join_date = datetime.datetime.now()
  177.  
  178. name = ' '.join([first_name or '', last_name or ''])
  179. if last_active_platform == const.PLATFORM_LINE:
  180. general_profile.picture = picture_profile
  181. if last_active_platform == const.PLATFORM_MOBILE:
  182. general_profile.device_token = device_token
  183.  
  184. # User Profile
  185. user_profile = UserProfile()
  186. # user_profile.rc_user_name = self.config.get('rocket_chat', 'USERNAME_PATTERN').format(id='0')
  187. # user_profile.rc_email = self.config.get('rocket_chat', 'EMAIL_PATTERN').format(id='0')
  188. #
  189. # raw_password = self.config.get('rocket_chat', 'PASSWORD_PATTERN')
  190.  
  191. # encrypt password
  192. # encrypted_data = kms.encrypt_text(raw_password)
  193. # user_profile.rc_password = encrypted_data
  194. # user_profile.rc_password = "ga bisa encrypt"
  195. # user_profile.ciphertext = ciphertext
  196.  
  197. user.bot_profile = bot_profile
  198. user.general_profile = general_profile
  199. user.user_profile = user_profile
  200.  
  201. if user:
  202. user = self.request.post_user(user)
  203.  
  204. # Create rocket chat user
  205. # user.user_profile.rc_user_name = self.config.get('rocket_chat', 'USERNAME_PATTERN').format(id=user.id)
  206. # user.user_profile.rc_email = self.config.get('rocket_chat', 'EMAIL_PATTERN').format(id=user.id)
  207. #
  208. # json_user = self.rocket_chat.create_user_person_service(name,
  209. # user.user_profile.rc_email,
  210. # raw_password,
  211. # user.user_profile.rc_user_name)
  212.  
  213. if user:
  214. user = self.request.put_user(user)
  215.  
  216. return user
  217.  
  218. def save_user(self, user):
  219. """
  220. Save user object into database
  221.  
  222. Args:
  223. user (bot_engine.model.User)
  224.  
  225. Returns:
  226. bot_engine.model.User: response User objectjson
  227.  
  228. """
  229. return self.request.put_user(user)
  230.  
  231. def process(self, message, user=None):
  232. """
  233. Get message from message instance then find the user, if not found
  234. register new user to database
  235.  
  236. Args:
  237. message (bot_engine.model.BotMessage)
  238.  
  239. Returns:
  240. bot_engine.model.User: updated user
  241. bot_engine.model.BotReply: bot engine reply object consist of replies
  242. and input replies
  243. """
  244. start_time = time.time()
  245. self.log.info('START UPDATE: message: %s', message)
  246. if user is None:
  247. # get user and create new user
  248. user = self.get_user(message)
  249. if user is None:
  250. user = self.create_user(message)
  251. self.log.debug('CURRENT USER: %s', user)
  252.  
  253. # get engagement
  254. # engagement = self.get_engagement(user.id)
  255.  
  256. # Save log from user
  257.  
  258. # if user.get_attr('session.commerce_chat_id'):
  259. # chat_partner = user.get_attr('session.commerce_chat_id')
  260. chat_partner = None
  261. if user.get_attr('session.ecommerce.commerce_chat_id'):
  262. chat_partner = user.get_attr('session.ecommerce.commerce_chat_id')
  263. message_to = None
  264. if user.get_attr('session.ecommerce.leave_message_to'):
  265. message_to = user.get_attr('session.ecommerce.leave_message_to')
  266. user.set_attr('session.ecommerce.leave_message_to', None)
  267. is_read = False
  268.  
  269. self.save_log(from_user=user.id,
  270. state_id=user.bot_profile.current_state_id,
  271. message=message.to_dict(),
  272. chat_partner=chat_partner,
  273. message_to=message_to,
  274. is_read=False )
  275.  
  276. # process next state and return updated user
  277. state = State(log=self.log)
  278. user, bot_reply = state.process(user, message)
  279.  
  280. # self.save_engagement(engagement)
  281.  
  282. # Save log from botengine
  283. self.save_log_from_bot(user, bot_reply)
  284.  
  285. # Update user memory
  286. self.log.debug('UPDATED USER: %s', user)
  287. self.save_user(user)
  288. self.log.info("--- bot_update.process: %s seconds ---", (time.time() - start_time))
  289. return user, bot_reply
  290.  
  291. def process_queue(self, user_id=None, user=None, alert_only=False):
  292. """
  293. Get user from user_id then process to queue
  294.  
  295. Args:
  296. user_id (int)
  297.  
  298. Returns:
  299. bot_engine.model.User: updated user
  300. bot_engine.model.BotReply: bot engine reply object consist of replies
  301. and input replies
  302. """
  303. start_time = time.time()
  304. self.log.info('START PROCESS QUEUE: user_id: %s', user_id)
  305.  
  306. # get user and proces queue
  307. if user_id is not None:
  308. user = self.get_user_by_id(user_id)
  309.  
  310. state = State(log=self.log)
  311.  
  312. user, bot_reply = state.process_queue(user, alert_only)
  313.  
  314. # Save log from botengine
  315. self.save_log_from_bot(user, bot_reply)
  316.  
  317. # Update user memory
  318. self.log.debug('UPDATED USER: %s', user)
  319. self.save_user(user)
  320. self.log.info("--- bot_update.process_queue: %s seconds ---", (time.time() - start_time))
  321.  
  322. return user, bot_reply
  323.  
  324. def save_log(self, from_user=None, to_user=None, state_id=None, message=None, chat_partner=None, message_to=None, is_read=None):
  325. """
  326. Log user message or bot message to database
  327.  
  328. Args:
  329. from_user (int):
  330. to_user (int):
  331. state_id (int):
  332. message (dict):
  333. message_to (int):
  334.  
  335. Returns:
  336. bot_engine.model.ActivityLog
  337. """
  338. timestamp = util.date_now()
  339. activity_log = ActivityLog(from_user=from_user,
  340. to_user=to_user, state_id=state_id, timestamp=timestamp,
  341. message=message, chat_partner=chat_partner, message_to=message_to, is_read=is_read)
  342. activity_log = self.request.post_activity_logs(activity_log=activity_log)
  343. return activity_log
  344.  
  345. def save_log_from_bot(self, user, bot_reply):
  346. """
  347.  
  348. Args:
  349. user (bot_engine.model.User)
  350. bot_reply (bot_engine.model.BotReply)
  351.  
  352. Returns:
  353. bot_engine.model.ActivityLog
  354.  
  355. """
  356.  
  357. # immediate fix to handle binary files: Remove them!
  358. for rep in bot_reply.replies:
  359. try:
  360. result = json.dumps(rep)
  361. except TypeError as e:
  362. bot_reply.replies.remove(rep)
  363.  
  364. # if user.get_attr('session.commerce_chat_id'):
  365. # chat_partner = user.get_attr('session.commerce_chat_id')
  366. chat_partner = None
  367. if user.get_attr('session.ecommerce.commerce_chat_id'):
  368. chat_partner = user.get_attr('session.ecommerce.commerce_chat_id')
  369.  
  370. return self.save_log(to_user=user.id,
  371. state_id=user.bot_profile.current_state_id,
  372. message=bot_reply.replies,
  373. chat_partner=chat_partner)
  374.  
  375. def save_engagement(self, engagement):
  376. return self.request.put_engagements(engagement)
  377.  
  378. def get_user(message, user=None):
  379. """
  380. Get message from message instance then find the user, if not found
  381. register new user to database
  382.  
  383. Args:
  384. message (bot_engine.model.BotMessage)
  385.  
  386. Returns:
  387. bot_engine.model.User: updated user
  388. bot_engine.model.BotReply: bot engine reply object consist of replies
  389. and input replies
  390. """
  391. update = BotUpdate(log=bot_log)
  392. bot_log.debug('START UPDATE: message: %s', message)
  393.  
  394. if user is None:
  395. # get user and create new user
  396. user = update.get_user(message)
  397. if user is None:
  398. user = update.create_user(message)
  399. # bot_log.debug('CURRENT USER: %s', user)
  400.  
  401. # Save log from user
  402. chat_partner = None
  403. message_to = None
  404. is_read = None
  405. if user.get_attr('session.ecommerce.leave_message_to'):
  406. message_to = user.get_attr('session.ecommerce.leave_message_to')
  407. user.set_attr('session.ecommerce.leave_message_to', None)
  408. is_read = False
  409. # if user.get_attr('session.commerce_chat_id'):
  410. # chat_partner = user.get_attr('session.commerce_chat_id')
  411. if user.get_attr('session.ecommerce.commerce_chat_id'):
  412. chat_partner = user.get_attr('session.ecommerce.commerce_chat_id')
  413.  
  414. update.save_log(from_user=user.id,
  415. state_id=user.bot_profile.current_state_id,
  416. message=message.to_dict(),
  417. chat_partner=chat_partner,
  418. is_read = is_read,
  419. message_to=message_to)
  420. return user
  421.  
  422. def get_user_by_id(uid):
  423. """
  424. Args:
  425. uid (int): user id
  426.  
  427. Returns:
  428. bot_engine.model.User: response User object
  429. """
  430. update = BotUpdate(log=bot_log)
  431. return update.request.get_user(uid=uid)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement