-
-
Save adryd325/f811e975bf8240fb6e6555e57c3db7d2 to your computer and use it in GitHub Desktop.
| #!/usr/bin/env python3 | |
| # Download your data dump and place this file in the "messages" folder of your data dump. | |
| # Run it using python | |
| from datetime import datetime, timedelta, timezone | |
| import dateutil.parser | |
| import matplotlib.pyplot as plt | |
| import matplotlib.ticker as ticker | |
| import matplotlib.dates as mdates | |
| import csv | |
| import json | |
| import os | |
| # User parameters | |
| root = os.path.dirname(os.path.realpath(__file__)) | |
| # root = "." # Uncomment to use PWD rather than script location | |
| yourNameHere = "@your.name.here" | |
| renderHorizontal = True | |
| dates = [] | |
| for dir in os.listdir(root): | |
| if (os.path.isdir(dir)): | |
| print(f"reading messages for channel: {dir}") | |
| if "messages.csv" not in os.listdir(dir): | |
| with open(dir + '/messages.json', 'r', encoding="utf-8") as json_file: | |
| json2 = json.load(json_file) | |
| for message in json2: | |
| dates.append(datetime.fromisoformat(message["Timestamp"])) | |
| json_file.close() | |
| else: | |
| with open(dir + '/messages.csv', 'r', encoding="utf-8") as csv_file: | |
| reader = csv.reader(csv_file) | |
| for row in reader: | |
| if (row[1] != "Timestamp"): | |
| dates.append(datetime.fromisoformat(row[1])) | |
| csv_file.close() | |
| print(f"total messages: {len(dates)}") | |
| now = datetime.utcnow() | |
| days=[] | |
| times=[] | |
| print("processing dates") | |
| for date in dates: | |
| timeNoDate = datetime(1970, 1, 1, date.hour, date.minute, date.second) | |
| dateNoTime = datetime(date.year, date.month, date.day) | |
| days.append(dateNoTime) | |
| times.append(timeNoDate) | |
| print("processing graph") | |
| hoursMajorLocator = mdates.HourLocator(interval=6) | |
| hoursMinorLocator = mdates.HourLocator(interval=1) | |
| hoursMajorFormatter = mdates.DateFormatter('%H:%M') | |
| daysMajorLocator = mdates.YearLocator(base=1) | |
| daysMinorLocator = mdates.MonthLocator() | |
| daysMajorFormatter = mdates.DateFormatter('%Y') | |
| daysMinorFormatter = mdates.DateFormatter('%b') | |
| if renderHorizontal: | |
| fig, ax = plt.subplots(figsize=((max(days)-min(days)).days / 200, 3)) | |
| plt.scatter(days, times, s=1, linewidths=0, color='#1f77b4c0') | |
| plt.xlim(min(days), max(days)) | |
| plt.ylim(0, 1) | |
| dateAxis = ax.xaxis | |
| hoursAxis = ax.yaxis | |
| daysMinorFormatter = mdates.DateFormatter('') | |
| else: | |
| fig, ax = plt.subplots(figsize=(3, (max(days)-min(days)).days / 200)) | |
| plt.scatter(times, days, s=1, linewidths=0, color='#1f77b4c0') | |
| plt.ylim(min(days), max(days)) | |
| plt.xlim(0, 1) | |
| dateAxis = ax.yaxis | |
| hoursAxis = ax.xaxis | |
| ax.tick_params(axis='y', which='minor', labelsize=5, color='#777') | |
| # time goes downwards and to the right | |
| plt.gca().invert_yaxis() | |
| hoursAxis.set_major_locator(hoursMajorLocator) | |
| hoursAxis.set_minor_locator(hoursMinorLocator) | |
| hoursAxis.set_major_formatter(hoursMajorFormatter) | |
| dateAxis.set_major_locator(daysMajorLocator) | |
| dateAxis.set_minor_locator(daysMinorLocator) | |
| dateAxis.set_major_formatter(daysMajorFormatter) | |
| dateAxis.set_minor_formatter(daysMinorFormatter) | |
| hoursAxis.set_label('Time of day') | |
| dateAxis.set_label('Date') | |
| plt.title(f"When does {yourNameHere} post on Discord (UTC)") | |
| print("rendering png") | |
| plt.savefig('out.png', bbox_inches='tight', pad_inches=0.3, dpi=300) | |
| print("rendering svg") | |
| plt.savefig('out.svg', bbox_inches='tight', pad_inches=0.3) |
You can just do
datetime.fromisoformat()(datetime.datetime.fromisoformat()) instead of usingdateutils.parser.parse
- Please do
open(..., encoding="utf-8")because I'm getting charmap errors.
Updated c:
Traceback (most recent call last):
File "c:\Users\Anders\Downloads\package\messages\discord-scatter-plot.py", line 62, in
fig, ax = plt.subplots(figsize=((max(days)-min(days)).days / 200, 3))
ValueError: max() arg is an empty sequence
Getting the same error as above ๐
Traceback (most recent call last): File "c:\Users\[username]\Downloads\package\messages\discord-scatter-plot.py", line 62, in <module> fig, ax = plt.subplots(figsize=((max(days)-min(days)).days / 200, 3)) ^^^^^^^^^ ValueError: max() arg is an empty sequence
Getting the same error as above ๐
Traceback (most recent call last): File "c:\Users\[username]\Downloads\package\messages\discord-scatter-plot.py", line 62, in <module> fig, ax = plt.subplots(figsize=((max(days)-min(days)).days / 200, 3)) ^^^^^^^^^ ValueError: max() arg is an empty sequence
How many total messages did it say there were? It looks like the days list is empty for some reason, though I can't understand why it would do that looking at the code. Do your subfolders have a messages.csv or a messages.json? It looks like the code supports both but I'm pretty sure it should be csv only. And what python version are you using? I doubt this is the cause, but you never know.
It might be due to the dir variable in for dir in os.listdir(root): (Line 21) being the folder name for the message instead of the full path
Doing a os.path.join(root, dir) worked for me, if that helps!
Fixed the issue and put together a GUI (and a .exe file) for it which can be found here:
https://github.com/TheSaltyGaming/Discord-Scatterplot-GUI
datetime.fromisoformat()(datetime.datetime.fromisoformat()) instead of usingdateutils.parser.parseopen(..., encoding="utf-8")because I'm getting charmap errors.