From 860ecc5eda89e37d5ad2b0624fa02516f29327fb Mon Sep 17 00:00:00 2001 From: chylex Date: Wed, 31 May 2017 16:13:05 +0200 Subject: [PATCH] Add the website source code --- build.py | 22 ++++++++++++++ web/img/tracker.png | Bin 0 -> 14554 bytes web/index.php | 58 +++++++++++++++++++++++++++++++++++++ web/style.css | 69 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 web/img/tracker.png create mode 100644 web/index.php create mode 100644 web/style.css diff --git a/build.py b/build.py index 9fc3611..2d3c3c7 100644 --- a/build.py +++ b/build.py @@ -5,6 +5,7 @@ import glob import shutil import sys import os +import distutils.dir_util EXEC_UGLIFYJS_WIN = "{2}/lib/uglifyjs.cmd --parse bare_returns --compress --mangle toplevel --mangle-props keep_quoted,reserved=[{3}] --output \"{1}\" \"{0}\"" @@ -13,6 +14,7 @@ EXEC_YUI = "java -jar lib/yuicompressor-2.4.8.jar --charset utf-8 --line-break 1 USE_UGLIFYJS = "--nominify" not in sys.argv USE_JAVA = "--nominify" not in sys.argv +BUILD_WEBSITE = "--website" in sys.argv WORKING_DIR = os.getcwd() @@ -133,9 +135,29 @@ def build_renderer(): out.write(line) +def build_website(): + tracker_file = "bld/track.html" + viewer_file = "bld/viewer.html" + web_style_file = "bld/web/style.css" + + distutils.dir_util.copy_tree("web", "bld/web") + + os.makedirs("bld/web/build", exist_ok = True) + shutil.copyfile(tracker_file, "bld/web/build/track.html") + shutil.copyfile(viewer_file, "bld/web/build/viewer.html") + + if USE_JAVA: + os.system(EXEC_YUI.format(web_style_file, web_style_file)) + + os.makedirs("bld", exist_ok = True) print("Building tracker...") build_tracker() + print("Building renderer...") build_renderer() + +if BUILD_WEBSITE: + print("Building website...") + build_website() diff --git a/web/img/tracker.png b/web/img/tracker.png new file mode 100644 index 0000000000000000000000000000000000000000..8a6901a0c35c9f7b32570a7cfdd24d377396f01b GIT binary patch literal 14554 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 + + + + + + + + + Discord History Tracker + + + + +
+

Discord History Tracker BETA v.1

+

Discord History Tracker is a browser script that lets you locally save chat history in your servers, groups, and private conversations.

+

When the script is active, it will automatically load history of the selected text channel up to the first message, and let you download it for offline viewing in your browser.

+ + + +

How to Save History

+

Add the following script as a bookmark, or run it in your browser console:

+

Open your Discord Friends list in a new tab (do not use an already opened one), click the bookmark, and read the additional instructions that explain the limitations and recommendations.

+

Upload your previously saved file if you have any. By default, Discord History Tracker is set to pause tracking after it reaches a previously saved message to avoid unnecessary history loading. You may also set it to load all channels in the server or your friends list by checking Switch to Next Channel.

+

Once you have configured everything, click Start Tracking, let it run in the background, and download the file when done.

+ +

How to View History

+

To browse the saved text channels, open the Renderer and upload the file. It is recommended to download the renderer and place it next to your saved files, that way you can view your history offline.

+ +

External Links

+ + +

Planned Features

+
    +
  • Message filtering and search
  • +
  • Statistics
  • +
  • and more...
  • +
+ +

Disclaimer

+

Discord History Tracker and the renderer are fully client-side and do not communicate with any servers. If you close your browser while the script is running, all unsaved progress will be lost.

+

Please, do not use this script for large or public servers. The script was made as a convenient way of keeping a local copy of private and group chats, as Discord is currently lacking this functionality.

+

Make sure you are using an up-to-date browser. Internet Explorer and old versions of good browsers are not supported.

+
+ + + + \ No newline at end of file diff --git a/web/style.css b/web/style.css new file mode 100644 index 0000000..c3a8d34 --- /dev/null +++ b/web/style.css @@ -0,0 +1,69 @@ +body { + font-family: Whitney, "Helvetica Neue", Helvetica, Verdana, "Lucida Grande", sans-serif; + margin: 0; + padding: 0; + font-size: 18px; + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); + color: rgba(255, 255, 255, 0.8); + background-color: #36393E; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +.inner { + max-width: 1050px; + margin: 0 auto 32px; + padding: 0 8px; +} + +p { + margin: 12px 0 14px; + line-height: 130%; +} + +a { + color: #0BA0D9; + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +h1 { + margin: 40px 0 16px; + font-size: 44px; + color: rgba(255, 255, 255, 0.6); + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.7); +} + +h1 span { + font-size: 22px; + color: rgba(255, 255, 255, 0.35); +} + +h2 { + margin: 36px 0 0; + font-size: 32px; + color: rgba(255, 255, 255, 0.7); + text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.7); +} + +ul { + margin-top: 12px; +} + +.dht { + border: 2px dashed rgba(255, 255, 255, 0.35); + border-radius: 9px; + padding: 3px; + max-width: 100%; + max-height: auto; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +.links { + overflow: hidden; + text-overflow: ellipsis; +}