def OnSend(self, event): """ Handler for clicking to send feedback, hides the dialog and posts data to feedback web service. """ text = self.edit_text.Value.strip() text_short = text[:500] + ".." if len(text) > 500 else text bmp = self.cb_bmp.Value and self.screenshot if text: ok = wx.MessageBox("Send the entered text%s?\n\n\"%s\"" % ( " and screenshot" if bmp else "", text_short), self.Title, wx.OK | wx.CANCEL | wx.ICON_INFORMATION) text = (text if wx.OK == ok else "") if text: self.Hide() kwargs = {"type": "feedback", "content": text} if bmp: kwargs["screenshot"] = util.img_wx_to_raw(bmp) main.status("Submitting feedback..") wx.CallAfter(self._SendReport, kwargs)
def OnSend(self, event): """ Handler for clicking to send feedback, hides the dialog and posts data to feedback web service. """ text = self.edit_text.Value.strip() text_short = text[:500] + ".." if len(text) > 500 else text bmp = self.cb_bmp.Value and self.screenshot if text: ok = wx.MessageBox( "Send the entered text%s?\n\n\"%s\"" % (" and screenshot" if bmp else "", text_short), self.Title, wx.OK | wx.CANCEL | wx.ICON_INFORMATION) text = (text if wx.OK == ok else "") if text: self.Hide() kwargs = {"type": "feedback", "content": text} if bmp: kwargs["screenshot"] = util.img_wx_to_raw(bmp) main.status("Submitting feedback..") wx.CallAfter(self._SendReport, kwargs)
def export_chat_template(chat, filename, db, messages): """ Exports the chat messages to file using templates. @param chat chat data dict, as returned from SkypeDatabase @param filename full path and filename of resulting file, file extension .html|.txt determines file format @param db SkypeDatabase instance @param messages list of message data dicts """ tmpfile, tmpname = None, None # Temporary file for exported messages try: is_html = filename.lower().endswith(".html") parser = skypedata.MessageParser(db, chat=chat, stats=True) namespace = {"db": db, "chat": chat, "messages": messages, "parser": parser} # As HTML and TXT contain statistics in their headers before # messages, write out all messages to a temporary file first, # statistics will be available for the main file after parsing. # Cannot keep all messages in memory at once - very large chats # (500,000+ messages) can take gigabytes. tmpname = util.unique_path("%s.messages" % filename) tmpfile = open(tmpname, "w+") mtemplate = templates.CHAT_MESSAGES_HTML if is_html \ else templates.CHAT_MESSAGES_TXT step.Template(mtemplate, strip=False).stream(tmpfile, namespace) namespace["stats"] = stats = parser.get_collected_stats() namespace.update({ "date1": stats["startdate"].strftime("%d.%m.%Y") if stats.get("startdate") else "", "date2": stats["enddate"].strftime("%d.%m.%Y") if stats.get("enddate") else "", "emoticons_used": [x for x in parser.emoticons_unique if hasattr(emoticons, x)], "message_count": stats.get("messages", 0), }) if is_html: # Collect chat and participant images. namespace.update({"participants": [], "chat_picture_size": None, "chat_picture_raw": None, }) if chat["meta_picture"]: raw = skypedata.fix_image_raw(chat["meta_picture"]) namespace["chat_picture_raw"] = raw namespace["chat_picture_size"] = util.img_size(raw) contacts = dict((c["skypename"], c) for c in db.get_contacts()) partics = dict((p["identity"], p) for p in chat["participants"]) # There can be authors not among participants, and vice versa for author in stats["authors"].union(partics): contact = partics.get(author, {}).get("contact") contact = contact or contacts.get(author, {}) contact = contact or {"identity": author, "name": author} bmp = contact.get("avatar_bitmap") raw = contact.get("avatar_raw_small") or "" raw_large = contact.get("avatar_raw_large") or "" if not raw and not bmp: raw = skypedata.get_avatar_raw(contact, conf.AvatarImageSize) raw = bmp and util.img_wx_to_raw(bmp) or raw if raw: raw_large = raw_large or skypedata.get_avatar_raw( contact, conf.AvatarImageLargeSize) contact["avatar_raw_small"] = raw contact["avatar_raw_large"] = raw_large contact["rank"] = partics.get(author, {}).get("rank") namespace["participants"].append(contact) tmpfile.flush(), tmpfile.seek(0) namespace["message_buffer"] = iter(lambda: tmpfile.read(65536), "") template = templates.CHAT_HTML if is_html else templates.CHAT_TXT with open(filename, "w") as f: step.Template(template, strip=False).stream(f, namespace) finally: if tmpfile: util.try_until(tmpfile.close) if tmpname: util.try_until(lambda: os.unlink(tmpname))
def export_chat_template(chat, filename, db, messages): """ Exports the chat messages to file using templates. @param chat chat data dict, as returned from SkypeDatabase @param filename full path and filename of resulting file, file extension .html|.txt determines file format @param db SkypeDatabase instance @param messages list of message data dicts """ tmpfile, tmpname = None, None # Temporary file for exported messages try: is_html = filename.lower().endswith(".html") parser = skypedata.MessageParser(db, chat=chat, stats=True) namespace = { "db": db, "chat": chat, "messages": messages, "parser": parser } # As HTML and TXT contain statistics in their headers before # messages, write out all messages to a temporary file first, # statistics will be available for the main file after parsing. # Cannot keep all messages in memory at once - very large chats # (500,000+ messages) can take gigabytes. tmpname = util.unique_path("%s.messages" % filename) tmpfile = open(tmpname, "w+") mtemplate = templates.CHAT_MESSAGES_HTML if is_html \ else templates.CHAT_MESSAGES_TXT step.Template(mtemplate, strip=False).stream(tmpfile, namespace) namespace["stats"] = stats = parser.get_collected_stats() namespace.update({ "date1": stats["startdate"].strftime("%d.%m.%Y") if stats.get("startdate") else "", "date2": stats["enddate"].strftime("%d.%m.%Y") if stats.get("enddate") else "", "emoticons_used": [x for x in parser.emoticons_unique if hasattr(emoticons, x)], "message_count": stats.get("messages", 0), }) if is_html: # Collect chat and participant images. namespace.update({ "participants": [], "chat_picture_size": None, "chat_picture_raw": None, }) if chat["meta_picture"]: raw = skypedata.fix_image_raw(chat["meta_picture"]) namespace["chat_picture_raw"] = raw namespace["chat_picture_size"] = util.img_size(raw) contacts = dict((c["skypename"], c) for c in db.get_contacts()) partics = dict((p["identity"], p) for p in chat["participants"]) # There can be authors not among participants, and vice versa for author in stats["authors"].union(partics): contact = partics.get(author, {}).get("contact") contact = contact or contacts.get(author, {}) contact = contact or {"identity": author, "name": author} bmp = contact.get("avatar_bitmap") raw = contact.get("avatar_raw_small") or "" raw_large = contact.get("avatar_raw_large") or "" if not raw and not bmp: raw = skypedata.get_avatar_raw(contact, conf.AvatarImageSize) raw = bmp and util.img_wx_to_raw(bmp) or raw if raw: raw_large = raw_large or skypedata.get_avatar_raw( contact, conf.AvatarImageLargeSize) contact["avatar_raw_small"] = raw contact["avatar_raw_large"] = raw_large contact["rank"] = partics.get(author, {}).get("rank") namespace["participants"].append(contact) tmpfile.flush(), tmpfile.seek(0) namespace["message_buffer"] = iter(lambda: tmpfile.read(65536), "") template = templates.CHAT_HTML if is_html else templates.CHAT_TXT with open(filename, "w") as f: step.Template(template, strip=False).stream(f, namespace) finally: if tmpfile: util.try_until(tmpfile.close) if tmpname: util.try_until(lambda: os.unlink(tmpname))