Commit 877c5e65 authored by Manuel's avatar Manuel

Merge branch 'feature/demo-backend' into develop

parents 15615084 534b87ec
# This is a generated file; do not edit or check into version control.
integration_test=C:\\_libs\\flutter\\packages\\integration_test\\
path_provider=C:\\_libs\\flutter\\.pub-cache\\hosted\\pub.dartlang.org\\path_provider-2.0.2\\
path_provider_linux=C:\\_libs\\flutter\\.pub-cache\\hosted\\pub.dartlang.org\\path_provider_linux-2.0.0\\
path_provider_macos=C:\\_libs\\flutter\\.pub-cache\\hosted\\pub.dartlang.org\\path_provider_macos-2.0.0\\
path_provider_windows=C:\\_libs\\flutter\\.pub-cache\\hosted\\pub.dartlang.org\\path_provider_windows-2.0.1\\
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"integration_test","path":"C:\\\\_libs\\\\flutter\\\\packages\\\\integration_test\\\\","dependencies":[]},{"name":"path_provider","path":"C:\\\\_libs\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-2.0.2\\\\","dependencies":[]}],"android":[{"name":"integration_test","path":"C:\\\\_libs\\\\flutter\\\\packages\\\\integration_test\\\\","dependencies":[]},{"name":"path_provider","path":"C:\\\\_libs\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider-2.0.2\\\\","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"C:\\\\_libs\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_macos-2.0.0\\\\","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\_libs\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-2.0.0\\\\","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\_libs\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_windows-2.0.1\\\\","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"integration_test","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2021-06-29 14:01:35.940460","version":"2.2.2"}
\ No newline at end of file
# This file is deprecated. Tools should instead consume
# `.dart_tools/package_config.json`.
#
# For more info see: https://dart.dev/go/dot-packages-deprecation
#
# Generated by pub on 2021-06-29 14:01:12.963522.
animated_text_kit:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/animated_text_kit-4.2.1/lib/
archive:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/archive-3.1.2/lib/
async:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/async-2.6.1/lib/
boolean_selector:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/boolean_selector-2.1.0/lib/
characters:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/characters-1.1.0/lib/
charcode:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/charcode-1.2.0/lib/
circlegraph:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/circlegraph-0.0.6/lib/
clock:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/clock-1.1.0/lib/
collection:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/collection-1.15.0/lib/
crypto:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/crypto-3.0.1/lib/
cupertino_icons:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/cupertino_icons-1.0.3/lib/
enhanced_future_builder:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/enhanced_future_builder-1.0.3/lib/
fake_async:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/fake_async-1.2.0/lib/
ffi:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/ffi-1.0.0/lib/
file:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/file-6.1.0/lib/
flutter:file:///C:/_libs/flutter/packages/flutter/lib/
flutter_driver:file:///C:/_libs/flutter/packages/flutter_driver/lib/
flutter_spinkit:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_spinkit-5.0.0/lib/
flutter_test:file:///C:/_libs/flutter/packages/flutter_test/lib/
fuchsia_remote_debug_protocol:file:///C:/_libs/flutter/packages/fuchsia_remote_debug_protocol/lib/
http:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/http-0.13.3/lib/
http_parser:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/http_parser-4.0.0/lib/
integration_test:file:///C:/_libs/flutter/packages/integration_test/lib/
intl:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/intl-0.17.0/lib/
localstorage:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/localstorage-4.0.0+1/lib/
logger:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/logger-1.0.0/lib/
matcher:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/matcher-0.12.10/lib/
meta:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/meta-1.3.0/lib/
path:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/path-1.8.0/lib/
path_provider:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.2/lib/
path_provider_linux:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.0.0/lib/
path_provider_macos:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.0/lib/
path_provider_platform_interface:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_platform_interface-2.0.1/lib/
path_provider_windows:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.1/lib/
pedantic:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/pedantic-1.11.0/lib/
platform:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/platform-3.0.0/lib/
plugin_platform_interface:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/plugin_platform_interface-2.0.0/lib/
process:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/process-4.2.1/lib/
sky_engine:file:///C:/_libs/flutter/bin/cache/pkg/sky_engine/lib/
source_span:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/source_span-1.8.1/lib/
stack_trace:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/stack_trace-1.10.0/lib/
stream_channel:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/stream_channel-2.1.0/lib/
string_scanner:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/string_scanner-1.1.0/lib/
sync_http:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/sync_http-0.3.0/lib/
term_glyph:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/term_glyph-1.2.0/lib/
test_api:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/test_api-0.3.0/lib/
typed_data:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/typed_data-1.3.0/lib/
vector_math:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/vector_math-2.1.0/lib/
vm_service:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/vm_service-6.2.0/lib/
webdriver:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/webdriver-3.0.0/lib/
win32:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/win32-2.0.0/lib/
xdg_directories:file:///C:/_libs/flutter/.pub-cache/hosted/pub.dartlang.org/xdg_directories-0.2.0/lib/
dashboard:lib/
package io.flutter.plugins;
import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import io.flutter.embedding.engine.FlutterEngine;
/**
* Generated file. Do not edit.
* This file is generated by the Flutter tool based on the
* plugins that support the Android platform.
*/
@Keep
public final class GeneratedPluginRegistrant {
public static void registerWith(@NonNull FlutterEngine flutterEngine) {
flutterEngine.getPlugins().add(new dev.flutter.plugins.integration_test.IntegrationTestPlugin());
flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin());
}
}
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/lib" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/.idea" />
<excludeFolder url="file://$MODULE_DIR$/.pub" />
<excludeFolder url="file://$MODULE_DIR$/build" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
<orderEntry type="library" name="Flutter Plugins" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>
\ No newline at end of file
class ServerConstants {
static const String host = "https://articonf1.itec.aau.at:30401/";
}
import 'package:flutter/foundation.dart';
class HostProvider {
static String _hostArticonfDebug = "https://articonf1.itec.aau.at";
static String _hostArticonfRelease = "https://articonf1.itec.aau.at";
static String _hostManuelDebug = "https://live.nope-api.systems:81";
static String _hostManuelRelease = "https://live.nope-api.systems:81";
static String articonfHost(int port) {
return kReleaseMode ? "$_hostArticonfRelease:$port" : "$_hostArticonfDebug:$port";
}
static String get manuelHost {
return kReleaseMode ? _hostManuelRelease : _hostManuelDebug;
}
}
class HostProvider {
static String _hostArticonfRelease = "https://articonf1.itec.aau.at";
static String _hostManuelRelease = "https://articonf1.itec.aau.at:30470";
static String articonfHost(int port) => "$_hostArticonfRelease:$port";
static String get manuelHost => _hostManuelRelease;
}
import 'dart:convert';
import 'dart:io';
import 'package:dashboard/constants/server_constants.dart';
import 'package:dashboard/exceptions/login_exception.dart';
import 'package:dashboard/querying/host_provider.dart';
import 'package:dashboard/util/user.dart';
import 'package:localstorage/localstorage.dart';
import 'package:logger/logger.dart';
......@@ -51,7 +51,7 @@ class LoginHelper {
"password": password,
});
String url = "${ServerConstants.host}/api/tokens";
String url = "${HostProvider.articonfHost(30401)}/api/tokens";
_logger.v("calling $url");
......
......@@ -98,7 +98,7 @@ packages:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
version: "1.1.2"
file:
dependency: transitive
description:
......@@ -235,7 +235,7 @@ packages:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.0"
version: "1.11.1"
platform:
dependency: transitive
description:
......@@ -345,7 +345,7 @@ packages:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
version: "2.2.5"
xdg_directories:
dependency: transitive
description:
......@@ -354,5 +354,5 @@ packages:
source: hosted
version: "0.2.0"
sdks:
dart: ">=2.12.0 <3.0.0"
dart: ">=2.13.0 <3.0.0"
flutter: ">=2.0.0"
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
\ No newline at end of file
FROM python:3.7
EXPOSE 8000
WORKDIR usr/src/flask_app
COPY src/demo/demo-backend/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY src/demo/demo-backend/ .
CMD ["python", "wsgi.py"]
\ No newline at end of file
import crawler
from flask import Flask
from crawler.user import User
from crawler import crawler
from trust.main import enhance_post, rate_user_trust
from trust.trust import TrustOracle
from flask_cors import CORS, cross_origin
app = Flask(__name__) # name for the Flask app (refer to output)
CORS(app)
oracle = TrustOracle(translate_value=60000, knowledge_border=.75)
def is_int(testee: str):
try:
i = int(testee)
return True
except ValueError:
return False
def retrieve_user(username: any):
users = crawler.read_users_from_file(input_file_path="crawler/output.json")
if is_int(username):
for user in users:
if user.id == int(username):
return user
else:
for user in users:
if user.name == username:
return user
return None
def retrieve_posts_for_user(user: User):
posts = crawler.read_posts_from_file(input_file_path="crawler/output.json")
result = []
for _, post_list in posts.items():
for post in post_list:
if post.user_id == user.name:
result.append(post)
return result
@app.route("/")
@cross_origin()
def home():
return "Hello, welcome to the demo application's backend!"
@app.route("/communities")
@cross_origin()
def communities():
posts = crawler.read_posts_from_file(input_file_path="crawler/output.json")
result = {}
for subreddit, post_list in posts.items():
if subreddit not in result.keys():
result[subreddit] = {"post_count": 0}
users_in_subreddit = []
for post in post_list:
if post.user_id not in users_in_subreddit:
result[subreddit]["post_count"] += 1
users_in_subreddit.append(post.user_id)
result[subreddit]["user_count"] = len(users_in_subreddit)
return result
@app.route("/communities/<community>/posts")
@cross_origin()
def single_community(community: str):
posts = crawler.read_posts_from_file(input_file_path="crawler/output.json")
if community not in posts.keys():
return f"community {community} does not exist"
posts = posts[community]
enhanced_posts = [enhance_post(post) for post in posts]
trust = oracle.calculate_trust(None, enhanced_posts)
print("trust: " + str(trust))
return {"posts": [post.to_serializable_dict() for post in posts], "trust": trust}
@app.route("/communities/<community>/trust")
@cross_origin()
def single_community_trust(community: str):
posts = crawler.read_posts_from_file(input_file_path="crawler/output.json")
if community not in posts.keys():
return f"community {community} does not exist"
enhanced_posts = [enhance_post(post) for post in posts[community]]
trust = oracle.calculate_trust(None, enhanced_posts)
return {"trust": trust}
@app.route("/users/<userstring>")
@cross_origin()
def single_user_trust(userstring: str):
User.nextId = 1
user = retrieve_user(userstring)
if user is None:
return "user not found"
posts = retrieve_posts_for_user(user)
# split posts into communities
posts_per_subreddit = {}
out_posts = {}
for post in posts:
if post.subreddit not in posts_per_subreddit.keys():
posts_per_subreddit[post.subreddit] = []
out_posts[post.subreddit] = []
posts_per_subreddit[post.subreddit].append(post)
post_dict = post.to_serializable_dict()
out_posts[post.subreddit].append(post_dict)
trust_ratings = {}
for subreddit, post_list in posts_per_subreddit.items():
trust_ratings[subreddit] = rate_user_trust(user, post_list, oracle)
# global trust score is average of all other trust scores
trust_ratings["global"] = rate_user_trust(user, posts, oracle) / len(trust_ratings.keys())
msg = f"Hello {user.name}, you wrote {len(posts)} posts so far!<br><br>Communities:"
for scope, post_list in trust_ratings.items():
msg += f"<br>trust({scope}): {trust_ratings[scope]}"
result = {
"user": user.to_serializable_dict(),
"trust_scores": trust_ratings,
"posts": out_posts
}
return result
from .crawler import main
from .post import Post
from .tuple import Tuple
from .user import User
\ No newline at end of file
import pprint
import praw
import prawcore
import json
import operator
from .post import Post
from .user import User
from .tuple import Tuple
from typing import List, Dict
from prawcore.exceptions import Forbidden
from numpy import random
def read_users_from_file(input_file_path: str) -> List[User]:
try:
input_file = open(input_file_path, "r")
input_data = input_file.read()
input_file.close()
input_data = json.loads(input_data)
users = [User.from_serializable_dict(row) for row in input_data["users"]]
except FileNotFoundError:
users = []
print(f"found {len(users)} users")
return users
def read_posts_from_file(input_file_path: str, debug_print: bool = False) -> Dict[str, List[Post]]:
posts = {}
n_posts = 0
try:
input_file = open(input_file_path, "r")
input_data = input_file.read()
input_file.close()
input_data = json.loads(input_data)
input_data = input_data["posts"]
for subreddit, subreddit_posts in input_data.items():
n_posts += len(subreddit_posts)
if debug_print:
print(f"/r/{subreddit} contains {len(subreddit_posts)} posts")
posts[subreddit] = [Post.from_serializable_dict(post) for post in subreddit_posts]
if debug_print:
print(f"{n_posts} posts in total")
except FileNotFoundError:
if debug_print:
print("no input file")
return posts
def analyze(input_file_path: str = "output.json", output_file_path: str = "output_statistics.json"):
users = read_users_from_file(input_file_path)
posts = read_posts_from_file(input_file_path)
subreddits_per_user = {user.id: [] for user in users}
# find out in how many communities the users are active
for subreddit, subreddit_posts in posts.items():
for post in subreddit_posts:
author = None
for user in users:
if user.name == post.user_id:
author = user
break
if author is None:
print("no author found")
continue
user_subreddit_list = subreddits_per_user[author.id]
if post.subreddit not in user_subreddit_list:
user_subreddit_list.append(post.subreddit)
subreddits_per_user[author.id] = user_subreddit_list
# find out how many posts the users created
posts_per_user = [Tuple(user.id) for user in users]
for subreddit, subreddit_posts in posts.items():
for post in subreddit_posts:
author = None
for user in users:
if user.name == post.user_id:
author = user
break
if author is None:
print("no author found")
continue
user_found = False
for t in posts_per_user:
if t.tid == author.id:
t.value += 1
user_found = True
break
if not user_found:
print("no tuple found ... ")
sorted_users_posts = sorted(posts_per_user, key=operator.attrgetter("value"))
data = {"users": []}
for user_tuple in sorted_users_posts:
d = {}
for user in users:
if user_tuple.tid == user.id:
d["user"] = user.name
d["n_posts"] = user_tuple.value
break
d["n_subreddits"] = len(subreddits_per_user[user_tuple.tid])
data["users"].append(d)
data["users"] = [user for user in data["users"] if (user["n_subreddits"] > 1 and user["n_posts"] > 1)]
output_file = open(output_file_path, "w")
output_file.write(json.dumps(data))
output_file.close()
def get_reddit_instance():
return praw.Reddit(
client_id="RXitZF9D_nYwYA",
client_secret="cpy2GaYmUr_ZJWf_gHBbX-hmnYo4cA",
user_agent="windows10:at.aau.itec.articonf1:v0.0.1 (by u/HerryKun)"
)
def scrape_by_subreddits(input_file_path: str = "output.json", output_file_path: str = "output.json", subreddits=None,
write: bool = True, limit: int = None):
print("parsing stored content...")
users = read_users_from_file(input_file_path)
if subreddits is None:
subreddits = []
reddit = get_reddit_instance()
subreddits_to_crawl = [reddit.subreddit(subreddit) for subreddit in subreddits]
posts_to_persist = read_posts_from_file(input_file_path)
i = 1
for subreddit in subreddits_to_crawl:
if subreddit.display_name in posts_to_persist:
print(f"used stored posts...")
posts = posts_to_persist[subreddit.display_name]
else:
posts = []
try:
for submission in subreddit.hot(limit=limit):
print(f"Post #{i}: {submission.title}")
i += 1
if submission.author is not None:
author = submission.author
existing_users = [user for user in users if user.name == author.name]
if len(existing_users) == 1:
user = existing_users[0]
else:
user = User(author.name)
users.append(user)
post_new = Post(
submission.id,
user.name,
submission.title,
submission.selftext,
submission.permalink,
submission.ups,
submission.upvote_ratio,
submission.num_comments,
subreddit.display_name,
submission.created
)
if post_new not in posts:
posts.append(post_new)
posts_to_persist[subreddit.display_name] = posts
except Forbidden:
print("Encountered Forbidden!")
continue
for subreddit_name, posts in posts_to_persist.items():
posts_to_persist[subreddit_name] = [post.to_serializable_dict() for post in posts]
print("start writing process...")
data = {
"posts": posts_to_persist,
"users": [user.to_serializable_dict() for user in users]
}
if write:
output_file = open(output_file_path, "w")
output_file.write(json.dumps(data))
output_file.close()
else:
print("### WRITE WAS DISABLED ###")
print("done")
def scrape_by_users(input_file_path: str = "output_statistics.json", output_file_path: str = "output.json"):
try:
input_file = open(input_file_path, "r")
input_data = input_file.read()
input_file.close()
except FileNotFoundError:
print("no input file, aborting...")
return
users = json.loads(input_data)
users = users["users"]
reddit = get_reddit_instance()
result = {}
for user in users:
print(f'enriching user {user["user"]}')
redditor = reddit.redditor(user["user"])
hot_posts = redditor.hot()
try:
for submission in hot_posts:
if submission.__class__.__name__ != "Submission":
continue
subreddit_name = submission.subreddit.display_name
post_new = Post(
submission.id,
user["user"],
submission.title,
submission.selftext,
submission.permalink,
submission.ups,
submission.upvote_ratio,
submission.num_comments,
subreddit_name,
submission.created
)
if subreddit_name in result:
posts = result[subreddit_name]
else:
posts = []
if post_new not in posts:
posts.append(post_new)
result[subreddit_name] = posts
except prawcore.Forbidden:
print(f'encountered 403 on user {user["user"]}, continueing')
continue
merge_and_persist_posts(result, output_file_path)
def merge_and_persist_posts(posts: Dict[str, List[Post]], input_file_path: str = "output.json",
output_file_path: str = "output.json", replace: bool = False):
existing_posts = read_posts_from_file(input_file_path)
users = read_users_from_file(input_file_path)
for subreddit_name, subreddit_posts in posts.items():
if subreddit_name not in existing_posts:
existing_posts[subreddit_name] = []
for post in subreddit_posts:
if post not in existing_posts[subreddit_name]:
existing_posts[subreddit_name].append(post)
elif post in existing_posts[subreddit_name] and replace:
existing_posts[subreddit_name][existing_posts[subreddit_name].index(post)] = post
for subreddit_name, posts in existing_posts.items():
existing_posts[subreddit_name] = [post.to_serializable_dict() for post in posts]
print("start writing process...")
data = {
"posts": existing_posts,
"users": [user.to_serializable_dict() for user in users]
}
output_file = open(output_file_path, "w")
output_file.write(json.dumps(data))
output_file.close()
def export_for_bogdan(input_file_path: str = "output.json", output_file_path: str = "dataset.json"):
posts = read_posts_from_file(input_file_path)
flattened_list = []
for subreddit_name, post_list in posts.items():
for post in post_list:
d = post.to_serializable_dict()
if d["title"] != "":
flattened_list.append(d)
output_file = open(output_file_path, "w")
output_file.write(json.dumps(flattened_list))
output_file.close()
print("done")
def randomize_posts(input_file_path: str = "output.json", output_file_path: str = "output.json"):
posts = read_posts_from_file(input_file_path)
posts_new = {}
mu = -0.3
sigma = 0.3
for subreddit_name, subreddit_posts in posts.items():
posts_new[subreddit_name] = []
for post in subreddit_posts:
s = random.normal(mu, sigma, 1) + 0.5
if s < 0:
s = 0
if s > 1:
s = 1
if not isinstance(s, int):
s = float(s[0])
post.percentage_upvoted = s
posts_new[subreddit_name].append(post)
merge_and_persist_posts(posts, input_file_path=input_file_path, output_file_path=output_file_path, replace=True)
def main(input_file_path: str = "output.json", output_file_path: str = "output_statistics.json", export_path: str = "dataset.json"):
print("starting scraper...")
# scrape_by_subreddits(
# input_file_path=input_file_path,
# output_file_path=output_file_path,
# subreddits=["news", "worldnews", "PoliticalDiscussion", "worldevents", "geopolitics", "business", "Economics",
# "environment", "history", "features", "UpliftingNews", "history", "PoliticalHumor", "AskReddit",
# "COVID19", "COVID19_data", "COVID19_support", "Conservative", "Coronavirus", "EverythingScience",
# "JoeBiden", "WhitePeopleTwitter", "atheism", "cybersecurity", "economy", "europe", "science",
# "technews", "technology", "todayilearned", "ukpolitics", "uspolitics"],
# # subreddits=["history"],
# # write=False,
# # limit=1
# )
# analyze(input_file_path, output_file_path)
# scrape_by_users()
randomize_posts(input_file_path=input_file_path, output_file_path=input_file_path)
export_for_bogdan(input_file_path=input_file_path, output_file_path=export_path)
if __name__ == "__main__":
main()
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{"users": [{"user": "twotwo_twentytwo", "n_posts": 2, "n_subreddits": 2}, {"user": "Madbrad200", "n_posts": 2, "n_subreddits": 2}, {"user": "o_joo", "n_posts": 2, "n_subreddits": 2}, {"user": "Naderium", "n_posts": 2, "n_subreddits": 2}, {"user": "Cagey898", "n_posts": 2, "n_subreddits": 2}, {"user": "Reed_collapse", "n_posts": 2, "n_subreddits": 2}, {"user": "aksai_hind", "n_posts": 2, "n_subreddits": 2}, {"user": "No-Orchid7553", "n_posts": 2, "n_subreddits": 2}, {"user": "TheColorOfDeadMen", "n_posts": 2, "n_subreddits": 2}, {"user": "FatFreddysCoat", "n_posts": 2, "n_subreddits": 2}, {"user": "itailitai", "n_posts": 2, "n_subreddits": 2}, {"user": "low_ego_no_deficits", "n_posts": 2, "n_subreddits": 2}, {"user": "DaDerpyDude", "n_posts": 2, "n_subreddits": 2}, {"user": "ionised", "n_posts": 2, "n_subreddits": 2}, {"user": "StuartFeed", "n_posts": 2, "n_subreddits": 2}, {"user": "Youaresowronglolumad", "n_posts": 2, "n_subreddits": 2}, {"user": "SerendipityQuest", "n_posts": 2, "n_subreddits": 2}, {"user": "165701020", "n_posts": 2, "n_subreddits": 2}, {"user": "hambakmeritru", "n_posts": 2, "n_subreddits": 2}, {"user": "Talk2DocAnisha", "n_posts": 2, "n_subreddits": 2}, {"user": "Camelcrushers", "n_posts": 2, "n_subreddits": 2}, {"user": "BoysenberryFaygo", "n_posts": 2, "n_subreddits": 2}, {"user": "ZaaZooLK", "n_posts": 2, "n_subreddits": 2}, {"user": "JFGAM", "n_posts": 2, "n_subreddits": 2}, {"user": "DukeofWessexx", "n_posts": 2, "n_subreddits": 2}, {"user": "JahB00ts", "n_posts": 2, "n_subreddits": 2}, {"user": "suddenimpulse", "n_posts": 2, "n_subreddits": 2}, {"user": "Dumbass1171", "n_posts": 2, "n_subreddits": 2}, {"user": "SpitefulShrimp", "n_posts": 2, "n_subreddits": 2}, {"user": "Redbean01", "n_posts": 2, "n_subreddits": 2}, {"user": "rollingboulder89", "n_posts": 2, "n_subreddits": 2}, {"user": "Wilsonhoe", "n_posts": 2, "n_subreddits": 2}, {"user": "netuserat", "n_posts": 2, "n_subreddits": 2}, {"user": "ADotSapiens", "n_posts": 2, "n_subreddits": 2}, {"user": "worriedpast", "n_posts": 2, "n_subreddits": 2}, {"user": "fluffykerfuffle1", "n_posts": 2, "n_subreddits": 2}, {"user": "DrogDrill", "n_posts": 2, "n_subreddits": 2}, {"user": "Naurgul", "n_posts": 2, "n_subreddits": 2}, {"user": "Ra75b", "n_posts": 2, "n_subreddits": 2}, {"user": "socuntruhan", "n_posts": 2, "n_subreddits": 2}, {"user": "HondaAnnaconda", "n_posts": 2, "n_subreddits": 2}, {"user": "Dragon3105", "n_posts": 2, "n_subreddits": 2}, {"user": "User808_", "n_posts": 2, "n_subreddits": 2}, {"user": "cambeiu", "n_posts": 2, "n_subreddits": 2}, {"user": "rogerram1", "n_posts": 2, "n_subreddits": 2}, {"user": "Macavity0", "n_posts": 2, "n_subreddits": 2}, {"user": "ZweigBL", "n_posts": 2, "n_subreddits": 2}, {"user": "AQMessiah", "n_posts": 2, "n_subreddits": 2}, {"user": "Saodazi", "n_posts": 2, "n_subreddits": 2}, {"user": "jiayounokim", "n_posts": 2, "n_subreddits": 2}, {"user": "Anteater_Able", "n_posts": 2, "n_subreddits": 2}, {"user": "TradingAllIn", "n_posts": 2, "n_subreddits": 2}, {"user": "speakhyroglyphically", "n_posts": 2, "n_subreddits": 2}, {"user": "bartturner", "n_posts": 2, "n_subreddits": 2}, {"user": "Financial_Freedommp", "n_posts": 2, "n_subreddits": 2}, {"user": "realreckless", "n_posts": 2, "n_subreddits": 2}, {"user": "cryptograbby", "n_posts": 2, "n_subreddits": 2}, {"user": "almac26", "n_posts": 2, "n_subreddits": 2}, {"user": "Professional-Cut4182", "n_posts": 2, "n_subreddits": 2}, {"user": "sjjain17", "n_posts": 2, "n_subreddits": 2}, {"user": "TheAdventureTraveler", "n_posts": 2, "n_subreddits": 2}, {"user": "jbdonges", "n_posts": 2, "n_subreddits": 2}, {"user": "hanslicht", "n_posts": 2, "n_subreddits": 2}, {"user": "econ_manj", "n_posts": 2, "n_subreddits": 2}, {"user": "Macarian_King", "n_posts": 2, "n_subreddits": 2}, {"user": "bhaggith", "n_posts": 2, "n_subreddits": 2}, {"user": "iali307", "n_posts": 2, "n_subreddits": 2}, {"user": "MickeyMoss", "n_posts": 2, "n_subreddits": 2}, {"user": "thelibertarianideal", "n_posts": 2, "n_subreddits": 2}, {"user": "ParkingIntroduction9", "n_posts": 2, "n_subreddits": 2}, {"user": "ZmeiOtPirin", "n_posts": 2, "n_subreddits": 2}, {"user": "JRWoodwardMSW", "n_posts": 2, "n_subreddits": 2}, {"user": "tocreatewebsite", "n_posts": 2, "n_subreddits": 2}, {"user": "pick-axis", "n_posts": 2, "n_subreddits": 2}, {"user": "ILikeMondayz", "n_posts": 2, "n_subreddits": 2}, {"user": "grand_nagus_gary", "n_posts": 2, "n_subreddits": 2}, {"user": "natalfoam", "n_posts": 2, "n_subreddits": 2}, {"user": "Fr1sk3r", "n_posts": 2, "n_subreddits": 2}, {"user": "PriorPhilip", "n_posts": 2, "n_subreddits": 2}, {"user": "Risingmagpie", "n_posts": 2, "n_subreddits": 2}, {"user": "Content_File_1408", "n_posts": 2, "n_subreddits": 2}, {"user": "Fit_Faithlessness398", "n_posts": 2, "n_subreddits": 2}, {"user": "HandToDirt", "n_posts": 2, "n_subreddits": 2}, {"user": "bloomberglaw", "n_posts": 2, "n_subreddits": 2}, {"user": "StatsTribe", "n_posts": 2, "n_subreddits": 2}, {"user": "westerbypl", "n_posts": 2, "n_subreddits": 2}, {"user": "DeadeyeClock", "n_posts": 2, "n_subreddits": 2}, {"user": "sstiel", "n_posts": 2, "n_subreddits": 2}, {"user": "Urbinaut", "n_posts": 2, "n_subreddits": 2}, {"user": "RichRaichu5", "n_posts": 2, "n_subreddits": 2}, {"user": "Tomahawkin95", "n_posts": 2, "n_subreddits": 2}, {"user": "DaddaMongo", "n_posts": 2, "n_subreddits": 2}, {"user": "PhillipCrawfordJr", "n_posts": 2, "n_subreddits": 2}, {"user": "Upset-Pool4864", "n_posts": 2, "n_subreddits": 2}, {"user": "thei0125", "n_posts": 2, "n_subreddits": 2}, {"user": "unexpectedmisogynist", "n_posts": 2, "n_subreddits": 2}, {"user": "defnotgrumbo", "n_posts": 2, "n_subreddits": 2}, {"user": "ItsGoingToFollowYou", "n_posts": 2, "n_subreddits": 2}, {"user": "hopskipjump2the", "n_posts": 2, "n_subreddits": 2}, {"user": "mind_kollective", "n_posts": 2, "n_subreddits": 2}, {"user": "Coriaceou", "n_posts": 2, "n_subreddits": 2}, {"user": "Fried_Green_Potatoes", "n_posts": 2, "n_subreddits": 2}, {"user": "lumpkin2013", "n_posts": 2, "n_subreddits": 2}, {"user": "KantKay11", "n_posts": 2, "n_subreddits": 2}, {"user": "ColonelBy", "n_posts": 2, "n_subreddits": 2}, {"user": "IberianIbex", "n_posts": 2, "n_subreddits": 2}, {"user": "jaiga99", "n_posts": 2, "n_subreddits": 2}, {"user": "SAT0725", "n_posts": 2, "n_subreddits": 2}, {"user": "WinnyDaBish", "n_posts": 2, "n_subreddits": 2}, {"user": "ApostateAardwolf", "n_posts": 2, "n_subreddits": 2}, {"user": "Nathan96762", "n_posts": 2, "n_subreddits": 2}, {"user": "usmaan", "n_posts": 2, "n_subreddits": 2}, {"user": "CascadiaRocks", "n_posts": 2, "n_subreddits": 2}, {"user": "MrDanger", "n_posts": 2, "n_subreddits": 2}, {"user": "FTEvan57", "n_posts": 2, "n_subreddits": 2}, {"user": "BreadTubeForever", "n_posts": 2, "n_subreddits": 2}, {"user": "SplodeyDope", "n_posts": 2, "n_subreddits": 2}, {"user": "GioCapri", "n_posts": 2, "n_subreddits": 2}, {"user": "WhoTFisthisdude1987", "n_posts": 2, "n_subreddits": 2}, {"user": "BurnsRedit", "n_posts": 2, "n_subreddits": 2}, {"user": "Elbandito78", "n_posts": 2, "n_subreddits": 2}, {"user": "ImaginarySel4", "n_posts": 2, "n_subreddits": 2}, {"user": "idonthavecovidithink", "n_posts": 2, "n_subreddits": 2}, {"user": "Rolloverbeethoven93", "n_posts": 2, "n_subreddits": 2}, {"user": "Historyiscoolguy", "n_posts": 2, "n_subreddits": 2}, {"user": "infliksimab", "n_posts": 2, "n_subreddits": 2}, {"user": "zhou_ds", "n_posts": 2, "n_subreddits": 2}, {"user": "ChaZz182", "n_posts": 2, "n_subreddits": 2}, {"user": "Nscience", "n_posts": 2, "n_subreddits": 2}, {"user": "kooshiromi", "n_posts": 2, "n_subreddits": 2}, {"user": "shrine", "n_posts": 2, "n_subreddits": 2}, {"user": "jsalsman", "n_posts": 2, "n_subreddits": 2}, {"user": "Bonboniru", "n_posts": 2, "n_subreddits": 2}, {"user": "Fertility18", "n_posts": 2, "n_subreddits": 2}, {"user": "DukeMaximum", "n_posts": 2, "n_subreddits": 2}, {"user": "Harvard2TheBigHouse", "n_posts": 2, "n_subreddits": 2}, {"user": "sanakhangeek", "n_posts": 2, "n_subreddits": 2}, {"user": "throwaway_06-20", "n_posts": 2, "n_subreddits": 2}, {"user": "treetyoselfcarol", "n_posts": 2, "n_subreddits": 2}, {"user": "parandroidfinn", "n_posts": 2, "n_subreddits": 2}, {"user": "hard2resist", "n_posts": 2, "n_subreddits": 2}, {"user": "HeartyBeast", "n_posts": 2, "n_subreddits": 2}, {"user": "ranorn227", "n_posts": 2, "n_subreddits": 2}, {"user": "userndj", "n_posts": 2, "n_subreddits": 2}, {"user": "HykaliaNavaratna", "n_posts": 2, "n_subreddits": 2}, {"user": "tcptomato", "n_posts": 2, "n_subreddits": 2}, {"user": "WindsorBallet", "n_posts": 2, "n_subreddits": 2}, {"user": "ToriCanyons", "n_posts": 2, "n_subreddits": 2}, {"user": "rbachar", "n_posts": 2, "n_subreddits": 2}, {"user": "accountisreadonly", "n_posts": 2, "n_subreddits": 2}, {"user": "PooPooRichardson", "n_posts": 2, "n_subreddits": 2}, {"user": "MacMommy111", "n_posts": 2, "n_subreddits": 2}, {"user": "burst678", "n_posts": 2, "n_subreddits": 2}, {"user": "DonnieMostDefinitely", "n_posts": 2, "n_subreddits": 2}, {"user": "williams1753", "n_posts": 2, "n_subreddits": 2}, {"user": "circusstrongman", "n_posts": 2, "n_subreddits": 2}, {"user": "Smithman", "n_posts": 2, "n_subreddits": 2}, {"user": "prashant_544", "n_posts": 2, "n_subreddits": 2}, {"user": "RatoTanornevd", "n_posts": 2, "n_subreddits": 2}, {"user": "lusttforli", "n_posts": 2, "n_subreddits": 2}, {"user": "DataQuality", "n_posts": 2, "n_subreddits": 2}, {"user": "andresnoyolaa", "n_posts": 2, "n_subreddits": 2}, {"user": "Moro18", "n_posts": 2, "n_subreddits": 2}, {"user": "EffectiveAffect", "n_posts": 2, "n_subreddits": 2}, {"user": "Ceestra", "n_posts": 2, "n_subreddits": 2}, {"user": "Bluest_waters", "n_posts": 2, "n_subreddits": 2}, {"user": "sophia-69", "n_posts": 2, "n_subreddits": 2}, {"user": "JonSolo1", "n_posts": 2, "n_subreddits": 2}, {"user": "ROKexpat", "n_posts": 2, "n_subreddits": 2}, {"user": "MedioDocs", "n_posts": 2, "n_subreddits": 2}, {"user": "apocalypticalley", "n_posts": 2, "n_subreddits": 2}, {"user": "holyfruits", "n_posts": 2, "n_subreddits": 2}, {"user": "justlooking033", "n_posts": 2, "n_subreddits": 2}, {"user": "RaveIsKing", "n_posts": 2, "n_subreddits": 2}, {"user": "uglymule", "n_posts": 2, "n_subreddits": 2}, {"user": "BeerAndaBackpack", "n_posts": 2, "n_subreddits": 2}, {"user": "2523775", "n_posts": 2, "n_subreddits": 2}, {"user": "okgodlemmehaveit", "n_posts": 2, "n_subreddits": 2}, {"user": "Roughneck16", "n_posts": 2, "n_subreddits": 2}, {"user": "notfromhere00", "n_posts": 2, "n_subreddits": 2}, {"user": "graining", "n_posts": 2, "n_subreddits": 2}, {"user": "FlatBrush7085", "n_posts": 2, "n_subreddits": 2}, {"user": "Prolificvisions", "n_posts": 2, "n_subreddits": 2}, {"user": "Uhhlaneuh", "n_posts": 2, "n_subreddits": 2}, {"user": "freeth1nker", "n_posts": 2, "n_subreddits": 2}, {"user": "Traveledfarwestward", "n_posts": 2, "n_subreddits": 2}, {"user": "glowsplash", "n_posts": 2, "n_subreddits": 2}, {"user": "justfor1t", "n_posts": 2, "n_subreddits": 2}, {"user": "boxsalesman", "n_posts": 2, "n_subreddits": 2}, {"user": "hnikret", "n_posts": 2, "n_subreddits": 2}, {"user": "Moist-Toes", "n_posts": 2, "n_subreddits": 2}, {"user": "opnerkal", "n_posts": 2, "n_subreddits": 2}, {"user": "Alex09464367", "n_posts": 2, "n_subreddits": 2}, {"user": "xhuljanomuca", "n_posts": 2, "n_subreddits": 2}, {"user": "canuvich", "n_posts": 2, "n_subreddits": 2}, {"user": "Vucea", "n_posts": 2, "n_subreddits": 2}, {"user": "BlueZybez", "n_posts": 2, "n_subreddits": 2}, {"user": "Artistic_Lab", "n_posts": 2, "n_subreddits": 2}, {"user": "VerdantFuppe", "n_posts": 2, "n_subreddits": 2}, {"user": "dorgoth12", "n_posts": 2, "n_subreddits": 2}, {"user": "2ADF379FF404DEEF", "n_posts": 2, "n_subreddits": 2}, {"user": "nicknameSerialNumber", "n_posts": 2, "n_subreddits": 2}, {"user": "SecondAccount404", "n_posts": 2, "n_subreddits": 2}, {"user": "ForeverSeahawks", "n_posts": 2, "n_subreddits": 2}, {"user": "snarkysmolbean", "n_posts": 2, "n_subreddits": 2}, {"user": "famously_decent", "n_posts": 2, "n_subreddits": 2}, {"user": "fcsuper", "n_posts": 2, "n_subreddits": 2}, {"user": "TheManInTheShack", "n_posts": 2, "n_subreddits": 2}, {"user": "InvestorForLife", "n_posts": 2, "n_subreddits": 2}, {"user": "spsheridan", "n_posts": 2, "n_subreddits": 2}, {"user": "qasqaldag", "n_posts": 2, "n_subreddits": 2}, {"user": "afrcnc", "n_posts": 2, "n_subreddits": 2}, {"user": "LucDoesStuff", "n_posts": 2, "n_subreddits": 2}, {"user": "aussie_bob", "n_posts": 2, "n_subreddits": 2}, {"user": "TimberLowe", "n_posts": 2, "n_subreddits": 2}, {"user": "GreekKnight3", "n_posts": 2, "n_subreddits": 2}, {"user": "wimpykidfan37", "n_posts": 2, "n_subreddits": 2}, {"user": "TurdsforNipples", "n_posts": 2, "n_subreddits": 2}, {"user": "Ocean_Beast", "n_posts": 2, "n_subreddits": 2}, {"user": "moeshaker188", "n_posts": 2, "n_subreddits": 2}, {"user": "RealityCheck18", "n_posts": 2, "n_subreddits": 2}, {"user": "Popular-Swordfish559", "n_posts": 2, "n_subreddits": 2}, {"user": "Triangle-Walks", "n_posts": 2, "n_subreddits": 2}, {"user": "jeezebitz", "n_posts": 2, "n_subreddits": 2}, {"user": "Cowicide", "n_posts": 2, "n_subreddits": 2}, {"user": "Forest_of_Mirrors", "n_posts": 2, "n_subreddits": 2}, {"user": "iamdeepakbohra", "n_posts": 2, "n_subreddits": 2}, {"user": "StakedPlainExplorer", "n_posts": 2, "n_subreddits": 2}, {"user": "human-no560", "n_posts": 2, "n_subreddits": 2}, {"user": "WorseCommander", "n_posts": 2, "n_subreddits": 2}, {"user": "Kevex_The_Dictator", "n_posts": 2, "n_subreddits": 2}, {"user": "ftejadal", "n_posts": 3, "n_subreddits": 2}, {"user": "redhatGizmo", "n_posts": 3, "n_subreddits": 3}, {"user": "calbert1735", "n_posts": 3, "n_subreddits": 2}, {"user": "davidlee93", "n_posts": 3, "n_subreddits": 2}, {"user": "MackTO", "n_posts": 3, "n_subreddits": 2}, {"user": "hodlDRGN", "n_posts": 3, "n_subreddits": 3}, {"user": "Jabbam", "n_posts": 3, "n_subreddits": 2}, {"user": "Therusso-irishman", "n_posts": 3, "n_subreddits": 2}, {"user": "arroz_com_feijao", "n_posts": 3, "n_subreddits": 2}, {"user": "bpntoday", "n_posts": 3, "n_subreddits": 3}, {"user": "Objective_Mistake_86", "n_posts": 3, "n_subreddits": 2}, {"user": "unlocknode", "n_posts": 3, "n_subreddits": 3}, {"user": "ReverendRoberts", "n_posts": 3, "n_subreddits": 2}, {"user": "Henrydot", "n_posts": 3, "n_subreddits": 2}, {"user": "MelodicBerries", "n_posts": 3, "n_subreddits": 2}, {"user": "monparan", "n_posts": 3, "n_subreddits": 3}, {"user": "Shalmanese", "n_posts": 3, "n_subreddits": 2}, {"user": "LtCmdrData", "n_posts": 3, "n_subreddits": 2}, {"user": "EsperantistoUsona", "n_posts": 3, "n_subreddits": 2}, {"user": "CorrectSecond5017", "n_posts": 3, "n_subreddits": 2}, {"user": "Zarzay", "n_posts": 3, "n_subreddits": 3}, {"user": "fchung", "n_posts": 3, "n_subreddits": 2}, {"user": "ChickenTeriyakiBoy1", "n_posts": 3, "n_subreddits": 2}, {"user": "besselfunctions", "n_posts": 3, "n_subreddits": 2}, {"user": "Battle4Seattle", "n_posts": 3, "n_subreddits": 3}, {"user": "goran7", "n_posts": 3, "n_subreddits": 3}, {"user": "VladM77", "n_posts": 3, "n_subreddits": 3}, {"user": "lughnasadh", "n_posts": 3, "n_subreddits": 2}, {"user": "xf4ph1", "n_posts": 3, "n_subreddits": 2}, {"user": "nevernotdating", "n_posts": 3, "n_subreddits": 2}, {"user": "GlobalShutTalk", "n_posts": 3, "n_subreddits": 2}, {"user": "OverByTheEdge", "n_posts": 3, "n_subreddits": 2}, {"user": "sgrnetworking", "n_posts": 3, "n_subreddits": 2}, {"user": "sixthsheik", "n_posts": 3, "n_subreddits": 2}, {"user": "Some_won", "n_posts": 3, "n_subreddits": 3}, {"user": "Ebadd", "n_posts": 3, "n_subreddits": 2}, {"user": "lordfoofoo", "n_posts": 3, "n_subreddits": 2}, {"user": "Hrodrik", "n_posts": 3, "n_subreddits": 3}, {"user": "SpoonKandy1", "n_posts": 3, "n_subreddits": 2}, {"user": "CommanderMcBragg", "n_posts": 3, "n_subreddits": 3}, {"user": "d-williams", "n_posts": 3, "n_subreddits": 2}, {"user": "Indupaul", "n_posts": 3, "n_subreddits": 3}, {"user": "rebeccajames47", "n_posts": 3, "n_subreddits": 2}, {"user": "x101y", "n_posts": 3, "n_subreddits": 3}, {"user": "idspispopd", "n_posts": 3, "n_subreddits": 2}, {"user": "Ayrane", "n_posts": 3, "n_subreddits": 2}, {"user": "UTUSBN533000", "n_posts": 3, "n_subreddits": 3}, {"user": "LIS1050010", "n_posts": 3, "n_subreddits": 2}, {"user": "b12ftw", "n_posts": 3, "n_subreddits": 2}, {"user": "Worldly_gh", "n_posts": 3, "n_subreddits": 2}, {"user": "seansraba", "n_posts": 3, "n_subreddits": 2}, {"user": "garzaculta", "n_posts": 3, "n_subreddits": 2}, {"user": "dem676", "n_posts": 3, "n_subreddits": 2}, {"user": "TommyAdagio", "n_posts": 3, "n_subreddits": 2}, {"user": "heinderhead", "n_posts": 3, "n_subreddits": 2}, {"user": "Bulky-Mark315", "n_posts": 3, "n_subreddits": 2}, {"user": "ExpertAccident", "n_posts": 3, "n_subreddits": 2}, {"user": "Paper_Rain", "n_posts": 3, "n_subreddits": 2}, {"user": "xiao95", "n_posts": 3, "n_subreddits": 3}, {"user": "madrid987", "n_posts": 3, "n_subreddits": 3}, {"user": "headtailgrep", "n_posts": 3, "n_subreddits": 2}, {"user": "carrorphcarp", "n_posts": 3, "n_subreddits": 2}, {"user": "KarlGreenMagic", "n_posts": 3, "n_subreddits": 2}, {"user": "mellowmonk", "n_posts": 3, "n_subreddits": 2}, {"user": "MaximilianKohler", "n_posts": 3, "n_subreddits": 2}, {"user": "mchoward", "n_posts": 3, "n_subreddits": 3}, {"user": "zonadedesconforto", "n_posts": 3, "n_subreddits": 2}, {"user": "Zhana-Aul", "n_posts": 3, "n_subreddits": 3}, {"user": "tatitomate", "n_posts": 3, "n_subreddits": 2}, {"user": "magadget", "n_posts": 3, "n_subreddits": 2}, {"user": "altaccountfiveyaboi", "n_posts": 3, "n_subreddits": 2}, {"user": "shrek69_420", "n_posts": 3, "n_subreddits": 2}, {"user": "ibmzrl", "n_posts": 3, "n_subreddits": 2}, {"user": "EridanusVoid", "n_posts": 3, "n_subreddits": 2}, {"user": "Scottish_Samurai", "n_posts": 3, "n_subreddits": 2}, {"user": "Jattack33", "n_posts": 3, "n_subreddits": 2}, {"user": "AdministrativePilot3", "n_posts": 3, "n_subreddits": 2}, {"user": "Cameron_Joe", "n_posts": 3, "n_subreddits": 2}, {"user": "losimagic", "n_posts": 3, "n_subreddits": 2}, {"user": "Worms_sg", "n_posts": 3, "n_subreddits": 2}, {"user": "kksingh1", "n_posts": 3, "n_subreddits": 2}, {"user": "Molire", "n_posts": 3, "n_subreddits": 2}, {"user": "littleMAS", "n_posts": 3, "n_subreddits": 3}, {"user": "txiao007", "n_posts": 3, "n_subreddits": 3}, {"user": "StevenSanders90210", "n_posts": 3, "n_subreddits": 2}, {"user": "SamirDN", "n_posts": 3, "n_subreddits": 2}, {"user": "john217", "n_posts": 3, "n_subreddits": 2}, {"user": "DusanRck", "n_posts": 3, "n_subreddits": 2}, {"user": "sedgecrooked", "n_posts": 3, "n_subreddits": 2}, {"user": "EdgyEdgarH", "n_posts": 3, "n_subreddits": 2}, {"user": "CureusJournal", "n_posts": 3, "n_subreddits": 2}, {"user": "eugene_russel", "n_posts": 3, "n_subreddits": 2}, {"user": "buffalorino", "n_posts": 3, "n_subreddits": 2}, {"user": "YZXFILE", "n_posts": 3, "n_subreddits": 2}, {"user": "boldie74", "n_posts": 3, "n_subreddits": 2}, {"user": "GeoGeoGeoGeo", "n_posts": 3, "n_subreddits": 2}, {"user": "Maaysa_Naayla", "n_posts": 3, "n_subreddits": 2}, {"user": "charismactivist", "n_posts": 3, "n_subreddits": 2}, {"user": "batsofburden", "n_posts": 3, "n_subreddits": 2}, {"user": "Adalyn_Sara", "n_posts": 3, "n_subreddits": 2}, {"user": "_therealwalrus_", "n_posts": 3, "n_subreddits": 2}, {"user": "TheAtheistArab87", "n_posts": 3, "n_subreddits": 2}, {"user": "Lighting", "n_posts": 3, "n_subreddits": 2}, {"user": "02K30C1", "n_posts": 3, "n_subreddits": 2}, {"user": "kteklol", "n_posts": 3, "n_subreddits": 2}, {"user": "LogicalRiver", "n_posts": 3, "n_subreddits": 2}, {"user": "mgc092", "n_posts": 3, "n_subreddits": 2}, {"user": "Good_Karm", "n_posts": 3, "n_subreddits": 2}, {"user": "blue_strat", "n_posts": 3, "n_subreddits": 2}, {"user": "jippiejee", "n_posts": 3, "n_subreddits": 2}, {"user": "Zhukov-74", "n_posts": 3, "n_subreddits": 2}, {"user": "Pilast", "n_posts": 3, "n_subreddits": 2}, {"user": "UrbannLegend", "n_posts": 3, "n_subreddits": 2}, {"user": "shubhbadonia", "n_posts": 3, "n_subreddits": 2}, {"user": "GOR098", "n_posts": 3, "n_subreddits": 3}, {"user": "dustofoblivion123", "n_posts": 3, "n_subreddits": 2}, {"user": "photoediting-", "n_posts": 3, "n_subreddits": 2}, {"user": "MyVideoConverter", "n_posts": 3, "n_subreddits": 3}, {"user": "n1ght_w1ng08", "n_posts": 3, "n_subreddits": 2}, {"user": "inwaitoftomorrow", "n_posts": 4, "n_subreddits": 4}, {"user": "ExcitingPush", "n_posts": 4, "n_subreddits": 3}, {"user": "Uwem1", "n_posts": 4, "n_subreddits": 3}, {"user": "Tesg9029", "n_posts": 4, "n_subreddits": 2}, {"user": "Hoosier_Jedi", "n_posts": 4, "n_subreddits": 2}, {"user": "mosaferalhoaa", "n_posts": 4, "n_subreddits": 2}, {"user": "zek_997", "n_posts": 4, "n_subreddits": 3}, {"user": "Strongbow85", "n_posts": 4, "n_subreddits": 3}, {"user": "itsbuzzpoint", "n_posts": 4, "n_subreddits": 3}, {"user": "Racist_FemboyV2", "n_posts": 4, "n_subreddits": 3}, {"user": "green_flash", "n_posts": 4, "n_subreddits": 2}, {"user": "WheelSevere", "n_posts": 4, "n_subreddits": 3}, {"user": "StuffyGoose", "n_posts": 4, "n_subreddits": 2}, {"user": "tenno4all", "n_posts": 4, "n_subreddits": 4}, {"user": "hermannschultz13", "n_posts": 4, "n_subreddits": 2}, {"user": "TheMob-TommyVercetti", "n_posts": 4, "n_subreddits": 2}, {"user": "thefoodboylover", "n_posts": 4, "n_subreddits": 3}, {"user": "Hanginon", "n_posts": 4, "n_subreddits": 3}, {"user": "nnomadic", "n_posts": 4, "n_subreddits": 3}, {"user": "dect60", "n_posts": 4, "n_subreddits": 3}, {"user": "ObjectiveMall", "n_posts": 4, "n_subreddits": 2}, {"user": "KiraTheMaster", "n_posts": 4, "n_subreddits": 2}, {"user": "ThePoarter", "n_posts": 4, "n_subreddits": 2}, {"user": "plato_thyself", "n_posts": 4, "n_subreddits": 2}, {"user": "mylittletoesss", "n_posts": 4, "n_subreddits": 2}, {"user": "jgeorge20", "n_posts": 4, "n_subreddits": 2}, {"user": "TobySomething", "n_posts": 4, "n_subreddits": 2}, {"user": "Helicase21", "n_posts": 4, "n_subreddits": 3}, {"user": "ILikeNeurons", "n_posts": 4, "n_subreddits": 3}, {"user": "JangoBeastwood", "n_posts": 4, "n_subreddits": 3}, {"user": "thexylom", "n_posts": 4, "n_subreddits": 2}, {"user": "Gram-GramAndShabadoo", "n_posts": 4, "n_subreddits": 2}, {"user": "yourbasicgeek", "n_posts": 4, "n_subreddits": 2}, {"user": "CharyBrown", "n_posts": 4, "n_subreddits": 2}, {"user": "saiteja13427", "n_posts": 4, "n_subreddits": 2}, {"user": "mom0nga", "n_posts": 4, "n_subreddits": 3}, {"user": "canrebuildhim", "n_posts": 4, "n_subreddits": 3}, {"user": "MBlaizze", "n_posts": 4, "n_subreddits": 2}, {"user": "james13h", "n_posts": 4, "n_subreddits": 3}, {"user": "Meanderingscientist", "n_posts": 4, "n_subreddits": 4}, {"user": "Eastern_Detective514", "n_posts": 4, "n_subreddits": 2}, {"user": "bojun", "n_posts": 4, "n_subreddits": 3}, {"user": "cncrndctzn2", "n_posts": 4, "n_subreddits": 3}, {"user": "WinterZone2", "n_posts": 4, "n_subreddits": 2}, {"user": "Obrocheetah", "n_posts": 4, "n_subreddits": 2}, {"user": "jakkkmotivator", "n_posts": 4, "n_subreddits": 2}, {"user": "Crazy_Mirror_3158", "n_posts": 4, "n_subreddits": 2}, {"user": "solefish1991", "n_posts": 4, "n_subreddits": 2}, {"user": "pick6061", "n_posts": 4, "n_subreddits": 2}, {"user": "Imperial_in_NewYork", "n_posts": 4, "n_subreddits": 3}, {"user": "tjmaxal", "n_posts": 4, "n_subreddits": 2}, {"user": "Pleasant-Force", "n_posts": 4, "n_subreddits": 2}, {"user": "Nstyboi", "n_posts": 4, "n_subreddits": 2}, {"user": "neuroticnotions", "n_posts": 4, "n_subreddits": 2}, {"user": "Goin2DaTimeoutChair", "n_posts": 4, "n_subreddits": 2}, {"user": "2old-you", "n_posts": 4, "n_subreddits": 3}, {"user": "ALEXDENIAL", "n_posts": 4, "n_subreddits": 2}, {"user": "Momqthrowaway3", "n_posts": 4, "n_subreddits": 2}, {"user": "purpleplumtree", "n_posts": 4, "n_subreddits": 2}, {"user": "BoldMiner", "n_posts": 4, "n_subreddits": 3}, {"user": "billypennsballs", "n_posts": 4, "n_subreddits": 2}, {"user": "scienceisfun112358", "n_posts": 4, "n_subreddits": 2}, {"user": "gordon22", "n_posts": 4, "n_subreddits": 2}, {"user": "bboyjkang", "n_posts": 4, "n_subreddits": 3}, {"user": "I_loveu3000", "n_posts": 4, "n_subreddits": 3}, {"user": "denis177", "n_posts": 4, "n_subreddits": 2}, {"user": "WK78ER", "n_posts": 4, "n_subreddits": 3}, {"user": "black_flag_4ever", "n_posts": 4, "n_subreddits": 2}, {"user": "AXEL_Network", "n_posts": 4, "n_subreddits": 2}, {"user": "stocklib", "n_posts": 4, "n_subreddits": 2}, {"user": "stepsinstereo", "n_posts": 4, "n_subreddits": 3}, {"user": "NeverTyranny", "n_posts": 4, "n_subreddits": 2}, {"user": "7Glorfindel", "n_posts": 4, "n_subreddits": 3}, {"user": "i_am_ayesha", "n_posts": 4, "n_subreddits": 3}, {"user": "swaffle74", "n_posts": 4, "n_subreddits": 3}, {"user": "bhodrolok", "n_posts": 4, "n_subreddits": 2}, {"user": "Jaamac2025", "n_posts": 4, "n_subreddits": 2}, {"user": "Veldron", "n_posts": 4, "n_subreddits": 3}, {"user": "bilefreebill", "n_posts": 4, "n_subreddits": 3}, {"user": "SpiritualHawk420", "n_posts": 5, "n_subreddits": 3}, {"user": "nikan69", "n_posts": 5, "n_subreddits": 2}, {"user": "Setagaya-Observer", "n_posts": 5, "n_subreddits": 3}, {"user": "BoGaN223", "n_posts": 5, "n_subreddits": 3}, {"user": "Airlinefightclub", "n_posts": 5, "n_subreddits": 2}, {"user": "rocksofiron", "n_posts": 5, "n_subreddits": 3}, {"user": "bustead", "n_posts": 5, "n_subreddits": 3}, {"user": "Dooraven", "n_posts": 5, "n_subreddits": 4}, {"user": "harrymatics", "n_posts": 5, "n_subreddits": 2}, {"user": "ueathrowaway123", "n_posts": 5, "n_subreddits": 3}, {"user": "BurstYourBubbles", "n_posts": 5, "n_subreddits": 3}, {"user": "Mexicanuck", "n_posts": 5, "n_subreddits": 3}, {"user": "I-still-want-Bernie", "n_posts": 5, "n_subreddits": 2}, {"user": "Fuji_Dragon", "n_posts": 5, "n_subreddits": 2}, {"user": "2020clusterfuck", "n_posts": 5, "n_subreddits": 2}, {"user": "towwin", "n_posts": 5, "n_subreddits": 4}, {"user": "Mister_Rashi", "n_posts": 5, "n_subreddits": 2}, {"user": "2A1ZA", "n_posts": 5, "n_subreddits": 2}, {"user": "cataractum", "n_posts": 5, "n_subreddits": 4}, {"user": "nafizzaki", "n_posts": 5, "n_subreddits": 2}, {"user": "henry_gindt", "n_posts": 5, "n_subreddits": 3}, {"user": "_hiddenscout", "n_posts": 5, "n_subreddits": 2}, {"user": "WarOfNoise", "n_posts": 5, "n_subreddits": 2}, {"user": "pipsdontsqueak", "n_posts": 5, "n_subreddits": 4}, {"user": "EconomicPolicy", "n_posts": 5, "n_subreddits": 2}, {"user": "Alastair789", "n_posts": 5, "n_subreddits": 4}, {"user": "RajpootRao", "n_posts": 5, "n_subreddits": 3}, {"user": "AdrianHao1", "n_posts": 5, "n_subreddits": 2}, {"user": "feross", "n_posts": 5, "n_subreddits": 2}, {"user": "trueslicky", "n_posts": 5, "n_subreddits": 4}, {"user": "simsirisic", "n_posts": 5, "n_subreddits": 5}, {"user": "FalseNihilist", "n_posts": 5, "n_subreddits": 4}, {"user": "dammand32", "n_posts": 5, "n_subreddits": 3}, {"user": "tuiposa", "n_posts": 5, "n_subreddits": 4}, {"user": "goodcheapandfast", "n_posts": 5, "n_subreddits": 2}, {"user": "Sampo", "n_posts": 5, "n_subreddits": 4}, {"user": "StcStasi", "n_posts": 5, "n_subreddits": 3}, {"user": "mythicpolitics", "n_posts": 5, "n_subreddits": 2}, {"user": "melwah2", "n_posts": 5, "n_subreddits": 2}, {"user": "JacquelynMccrea", "n_posts": 5, "n_subreddits": 2}, {"user": "ImNotYourGoogle", "n_posts": 5, "n_subreddits": 2}, {"user": "Sneaky-rodent", "n_posts": 5, "n_subreddits": 2}, {"user": "stereomatch", "n_posts": 5, "n_subreddits": 2}, {"user": "adotmatrix", "n_posts": 5, "n_subreddits": 2}, {"user": "PFC1224", "n_posts": 5, "n_subreddits": 2}, {"user": "oscfan173", "n_posts": 5, "n_subreddits": 2}, {"user": "cuffia_azzurra_2", "n_posts": 5, "n_subreddits": 3}, {"user": "dunkin1980", "n_posts": 5, "n_subreddits": 2}, {"user": "Lost_Distribution546", "n_posts": 5, "n_subreddits": 2}, {"user": "FortuitousAdroit", "n_posts": 5, "n_subreddits": 4}, {"user": "HeinieKaboobler", "n_posts": 5, "n_subreddits": 3}, {"user": "WebLinkr", "n_posts": 5, "n_subreddits": 2}, {"user": "Torquemada1970", "n_posts": 5, "n_subreddits": 2}, {"user": "RedmasterqQ", "n_posts": 5, "n_subreddits": 4}, {"user": "hecruz24", "n_posts": 5, "n_subreddits": 2}, {"user": "maki23", "n_posts": 5, "n_subreddits": 4}, {"user": "avogadros_number", "n_posts": 5, "n_subreddits": 2}, {"user": "CostelloSS", "n_posts": 5, "n_subreddits": 2}, {"user": "TheRavenSayeth", "n_posts": 5, "n_subreddits": 2}, {"user": "bassambadis", "n_posts": 5, "n_subreddits": 2}, {"user": "TendingTheirGarden", "n_posts": 5, "n_subreddits": 2}, {"user": "mepper", "n_posts": 5, "n_subreddits": 2}, {"user": "BrautanGud", "n_posts": 5, "n_subreddits": 2}, {"user": "apple_kicks", "n_posts": 5, "n_subreddits": 4}, {"user": "iwhistle_net", "n_posts": 5, "n_subreddits": 2}, {"user": "poclee", "n_posts": 5, "n_subreddits": 3}, {"user": "sh0tgunben", "n_posts": 6, "n_subreddits": 2}, {"user": "checkmak01", "n_posts": 6, "n_subreddits": 3}, {"user": "Slowbhai", "n_posts": 6, "n_subreddits": 2}, {"user": "nosotros_road_sodium", "n_posts": 6, "n_subreddits": 3}, {"user": "REVERSEZOOM2", "n_posts": 6, "n_subreddits": 2}, {"user": "LouQuacious", "n_posts": 6, "n_subreddits": 2}, {"user": "SomeEuropean_", "n_posts": 6, "n_subreddits": 2}, {"user": "XSpcwlker", "n_posts": 6, "n_subreddits": 2}, {"user": "polandballbounces", "n_posts": 6, "n_subreddits": 3}, {"user": "discocrisco", "n_posts": 6, "n_subreddits": 3}, {"user": "lnfinity", "n_posts": 6, "n_subreddits": 2}, {"user": "grassrootbeer", "n_posts": 6, "n_subreddits": 2}, {"user": "nick313", "n_posts": 6, "n_subreddits": 2}, {"user": "javaxcore", "n_posts": 6, "n_subreddits": 4}, {"user": "DarkDismissal", "n_posts": 6, "n_subreddits": 3}, {"user": "Hypx", "n_posts": 6, "n_subreddits": 3}, {"user": "altmorty", "n_posts": 6, "n_subreddits": 4}, {"user": "alllie", "n_posts": 6, "n_subreddits": 2}, {"user": "IlikeYuengling", "n_posts": 6, "n_subreddits": 3}, {"user": "sisyphushaditsoeasy", "n_posts": 6, "n_subreddits": 2}, {"user": "Better_Crazy_8669", "n_posts": 6, "n_subreddits": 2}, {"user": "perfect_wonders", "n_posts": 6, "n_subreddits": 4}, {"user": "eeca20", "n_posts": 6, "n_subreddits": 4}, {"user": "Quiet_Possession", "n_posts": 6, "n_subreddits": 2}, {"user": "Arya9019slp", "n_posts": 6, "n_subreddits": 2}, {"user": "LanJiaoDuaKee", "n_posts": 6, "n_subreddits": 2}, {"user": "ohnoh18", "n_posts": 6, "n_subreddits": 4}, {"user": "Quetzal_Dorado", "n_posts": 6, "n_subreddits": 2}, {"user": "Tough_Gadfly", "n_posts": 6, "n_subreddits": 2}, {"user": "lonnib", "n_posts": 6, "n_subreddits": 2}, {"user": "Barknuckle", "n_posts": 6, "n_subreddits": 2}, {"user": "conse_lad", "n_posts": 6, "n_subreddits": 2}, {"user": "trevor25", "n_posts": 6, "n_subreddits": 2}, {"user": "chromoscience", "n_posts": 6, "n_subreddits": 2}, {"user": "Malthus0", "n_posts": 6, "n_subreddits": 2}, {"user": "CamelsandHippos", "n_posts": 6, "n_subreddits": 2}, {"user": "CrankyBear", "n_posts": 6, "n_subreddits": 2}, {"user": "KuriousPanda", "n_posts": 6, "n_subreddits": 2}, {"user": "LeMoineSpectre", "n_posts": 7, "n_subreddits": 3}, {"user": "Massimo24ore", "n_posts": 7, "n_subreddits": 2}, {"user": "PanEuropeanism", "n_posts": 7, "n_subreddits": 2}, {"user": "arfee_droid", "n_posts": 7, "n_subreddits": 5}, {"user": "PauloPatricio", "n_posts": 7, "n_subreddits": 4}, {"user": "Mad_Chemist_", "n_posts": 7, "n_subreddits": 2}, {"user": "Cobalt_Caster", "n_posts": 7, "n_subreddits": 2}, {"user": "Objective_Curve3905", "n_posts": 7, "n_subreddits": 4}, {"user": "Joko11", "n_posts": 7, "n_subreddits": 2}, {"user": "FLTA", "n_posts": 7, "n_subreddits": 2}, {"user": "rsnpwr", "n_posts": 7, "n_subreddits": 4}, {"user": "CompletePen8", "n_posts": 7, "n_subreddits": 2}, {"user": "flacao9", "n_posts": 7, "n_subreddits": 3}, {"user": "KevTravels", "n_posts": 7, "n_subreddits": 2}, {"user": "vaish7848", "n_posts": 7, "n_subreddits": 5}, {"user": "Fosse22", "n_posts": 7, "n_subreddits": 3}, {"user": "JaxxisR", "n_posts": 7, "n_subreddits": 2}, {"user": "Doener23", "n_posts": 7, "n_subreddits": 4}, {"user": "DNAhelicase", "n_posts": 7, "n_subreddits": 2}, {"user": "udishomer", "n_posts": 7, "n_subreddits": 2}, {"user": "T-ROY_T-REDDIT", "n_posts": 7, "n_subreddits": 4}, {"user": "Speabberork", "n_posts": 7, "n_subreddits": 2}, {"user": "FINS-1972", "n_posts": 7, "n_subreddits": 2}, {"user": "_djs", "n_posts": 7, "n_subreddits": 3}, {"user": "WhileFalseRepeat", "n_posts": 7, "n_subreddits": 2}, {"user": "harsimbhullar", "n_posts": 8, "n_subreddits": 2}, {"user": "paulfromatlanta", "n_posts": 8, "n_subreddits": 5}, {"user": "NinjaDiscoJesus", "n_posts": 8, "n_subreddits": 3}, {"user": "giuliomagnifico", "n_posts": 8, "n_subreddits": 4}, {"user": "BareAuthority", "n_posts": 8, "n_subreddits": 2}, {"user": "ChrisTweten", "n_posts": 8, "n_subreddits": 3}, {"user": "Litvi", "n_posts": 8, "n_subreddits": 3}, {"user": "jordiwmata", "n_posts": 8, "n_subreddits": 3}, {"user": "psychothumbs", "n_posts": 8, "n_subreddits": 2}, {"user": "limache", "n_posts": 8, "n_subreddits": 5}, {"user": "Maxcactus", "n_posts": 8, "n_subreddits": 4}, {"user": "FERNnews", "n_posts": 8, "n_subreddits": 2}, {"user": "7MCMXC", "n_posts": 8, "n_subreddits": 6}, {"user": "josh252", "n_posts": 8, "n_subreddits": 4}, {"user": "wtf_ask_me", "n_posts": 8, "n_subreddits": 5}, {"user": "kandel72", "n_posts": 8, "n_subreddits": 2}, {"user": "CynicalRealist1", "n_posts": 8, "n_subreddits": 2}, {"user": "Vegaviguera", "n_posts": 8, "n_subreddits": 2}, {"user": "ScreenExtension", "n_posts": 8, "n_subreddits": 2}, {"user": "jussayingthings", "n_posts": 8, "n_subreddits": 2}, {"user": "chilladipa", "n_posts": 8, "n_subreddits": 3}, {"user": "ArsenalWillBeBack", "n_posts": 8, "n_subreddits": 3}, {"user": "New-Atlantis", "n_posts": 8, "n_subreddits": 2}, {"user": "yosemitefloyd", "n_posts": 8, "n_subreddits": 2}, {"user": "marsianer", "n_posts": 8, "n_subreddits": 4}, {"user": "GiveMeYourBussy", "n_posts": 8, "n_subreddits": 2}, {"user": "Cinemaphreak", "n_posts": 8, "n_subreddits": 2}, {"user": "WalkureARCH", "n_posts": 8, "n_subreddits": 2}, {"user": "wilmots1", "n_posts": 8, "n_subreddits": 2}, {"user": "Projectrage", "n_posts": 8, "n_subreddits": 2}, {"user": "habichuelacondulce", "n_posts": 8, "n_subreddits": 2}, {"user": "GeniusDevv", "n_posts": 9, "n_subreddits": 2}, {"user": "DavidofSasun", "n_posts": 9, "n_subreddits": 3}, {"user": "PandaMuffin1", "n_posts": 9, "n_subreddits": 3}, {"user": "Visco0825", "n_posts": 9, "n_subreddits": 2}, {"user": "AlternativeQuality2", "n_posts": 9, "n_subreddits": 2}, {"user": "sammyjamez", "n_posts": 9, "n_subreddits": 2}, {"user": "Bigbluebuttonman", "n_posts": 9, "n_subreddits": 2}, {"user": "SuccessfulOperation", "n_posts": 9, "n_subreddits": 5}, {"user": "Aerobics111", "n_posts": 9, "n_subreddits": 2}, {"user": "hourlystocks", "n_posts": 9, "n_subreddits": 2}, {"user": "furfulla", "n_posts": 9, "n_subreddits": 4}, {"user": "davidwholt", "n_posts": 9, "n_subreddits": 3}, {"user": "doboskombaya", "n_posts": 9, "n_subreddits": 2}, {"user": "QuicklyThisWay", "n_posts": 9, "n_subreddits": 4}, {"user": "Drahy", "n_posts": 9, "n_subreddits": 4}, {"user": "fbreaker", "n_posts": 9, "n_subreddits": 2}, {"user": "Majnum", "n_posts": 9, "n_subreddits": 3}, {"user": "AndrewYang4POTUS", "n_posts": 9, "n_subreddits": 2}, {"user": "jpc4stro", "n_posts": 9, "n_subreddits": 2}, {"user": "Faruyazy", "n_posts": 9, "n_subreddits": 3}, {"user": "Captain-Technology", "n_posts": 10, "n_subreddits": 4}, {"user": "Fuzier", "n_posts": 10, "n_subreddits": 7}, {"user": "IntnsRed", "n_posts": 10, "n_subreddits": 4}, {"user": "areemsa", "n_posts": 10, "n_subreddits": 3}, {"user": "GlobalCitizen12345", "n_posts": 10, "n_subreddits": 3}, {"user": "RoutineProcedure", "n_posts": 10, "n_subreddits": 3}, {"user": "OliverMarkusMalloy", "n_posts": 10, "n_subreddits": 3}, {"user": "PLUTO_HAS_COME_BACK", "n_posts": 10, "n_subreddits": 4}, {"user": "MandemDontHearMeTho", "n_posts": 10, "n_subreddits": 2}, {"user": "HassanAmmar22", "n_posts": 10, "n_subreddits": 2}, {"user": "Mynameis__--__", "n_posts": 10, "n_subreddits": 2}, {"user": "nikola28", "n_posts": 10, "n_subreddits": 3}, {"user": "IanMazgelis", "n_posts": 10, "n_subreddits": 3}, {"user": "princey12", "n_posts": 10, "n_subreddits": 3}, {"user": "nomad-wik", "n_posts": 10, "n_subreddits": 3}, {"user": "drewiepoodle", "n_posts": 10, "n_subreddits": 2}, {"user": "FirePing32", "n_posts": 10, "n_subreddits": 2}, {"user": "drunkles", "n_posts": 11, "n_subreddits": 4}, {"user": "Newsjunkeefromlondon", "n_posts": 11, "n_subreddits": 3}, {"user": "lotsofsweat", "n_posts": 11, "n_subreddits": 6}, {"user": "Ro_The_Great", "n_posts": 11, "n_subreddits": 4}, {"user": "Nikhil833032", "n_posts": 11, "n_subreddits": 4}, {"user": "NineteenEighty9", "n_posts": 11, "n_subreddits": 4}, {"user": "Evzob", "n_posts": 11, "n_subreddits": 2}, {"user": "MicroSofty88", "n_posts": 11, "n_subreddits": 4}, {"user": "LeDumonster", "n_posts": 11, "n_subreddits": 5}, {"user": "greyuniwave", "n_posts": 11, "n_subreddits": 2}, {"user": "Memetic1", "n_posts": 11, "n_subreddits": 2}, {"user": "CremationLily", "n_posts": 11, "n_subreddits": 2}, {"user": "tyw7", "n_posts": 11, "n_subreddits": 3}, {"user": "Lichbingeking", "n_posts": 12, "n_subreddits": 3}, {"user": "rainbowarriorhere", "n_posts": 12, "n_subreddits": 7}, {"user": "Doc_Liberty", "n_posts": 12, "n_subreddits": 5}, {"user": "BhaswatiGuha19", "n_posts": 12, "n_subreddits": 3}, {"user": "DomPachino", "n_posts": 12, "n_subreddits": 4}, {"user": "WannoHacker", "n_posts": 12, "n_subreddits": 2}, {"user": "MarineKingPrime_", "n_posts": 12, "n_subreddits": 3}, {"user": "newnemo", "n_posts": 12, "n_subreddits": 4}, {"user": "Toadfinger", "n_posts": 12, "n_subreddits": 3}, {"user": "monaleeparis", "n_posts": 12, "n_subreddits": 2}, {"user": "zzill6", "n_posts": 12, "n_subreddits": 3}, {"user": "1000000students", "n_posts": 12, "n_subreddits": 2}, {"user": "SuperDuper00001", "n_posts": 13, "n_subreddits": 3}, {"user": "Yogurt789", "n_posts": 13, "n_subreddits": 9}, {"user": "AntiTankieAction", "n_posts": 13, "n_subreddits": 3}, {"user": "jms1225", "n_posts": 13, "n_subreddits": 3}, {"user": "smurfyjenkins", "n_posts": 13, "n_subreddits": 3}, {"user": "PBR--Streetgang", "n_posts": 13, "n_subreddits": 5}, {"user": "andyholla84", "n_posts": 13, "n_subreddits": 3}, {"user": "chrisdh79", "n_posts": 13, "n_subreddits": 4}, {"user": "sld126", "n_posts": 13, "n_subreddits": 2}, {"user": "swingadmin", "n_posts": 13, "n_subreddits": 7}, {"user": "spainguy", "n_posts": 13, "n_subreddits": 3}, {"user": "PoliticiansAlwaysLie", "n_posts": 14, "n_subreddits": 4}, {"user": "yaboodooect", "n_posts": 14, "n_subreddits": 3}, {"user": "coolbern", "n_posts": 14, "n_subreddits": 4}, {"user": "avivi_", "n_posts": 14, "n_subreddits": 2}, {"user": "fragrance-harbour", "n_posts": 15, "n_subreddits": 8}, {"user": "Viewfromthe31stfloor", "n_posts": 15, "n_subreddits": 2}, {"user": "SnooBooks5387", "n_posts": 15, "n_subreddits": 3}, {"user": "JackGreen142", "n_posts": 15, "n_subreddits": 2}, {"user": "JHopeHoe", "n_posts": 16, "n_subreddits": 4}, {"user": "BudrickBundy", "n_posts": 16, "n_subreddits": 2}, {"user": "GalileoGurdjieff", "n_posts": 16, "n_subreddits": 6}, {"user": "filosoful", "n_posts": 16, "n_subreddits": 3}, {"user": "D-R-AZ", "n_posts": 16, "n_subreddits": 2}, {"user": "LoreleiOpine", "n_posts": 16, "n_subreddits": 2}, {"user": "Word_11", "n_posts": 16, "n_subreddits": 2}, {"user": "cos", "n_posts": 17, "n_subreddits": 3}, {"user": "Zattarra2020", "n_posts": 17, "n_subreddits": 5}, {"user": "clayt6", "n_posts": 17, "n_subreddits": 2}, {"user": "QuantumThinkology", "n_posts": 17, "n_subreddits": 3}, {"user": "Lightfiend", "n_posts": 18, "n_subreddits": 4}, {"user": "thorium43", "n_posts": 18, "n_subreddits": 2}, {"user": "fotogneric", "n_posts": 18, "n_subreddits": 6}, {"user": "1130wien", "n_posts": 18, "n_subreddits": 3}, {"user": "jonredd901", "n_posts": 18, "n_subreddits": 2}, {"user": "scata90x", "n_posts": 18, "n_subreddits": 3}, {"user": "accappatoiviola", "n_posts": 19, "n_subreddits": 3}, {"user": "FutureisAsian", "n_posts": 19, "n_subreddits": 2}, {"user": "HenryCorp", "n_posts": 19, "n_subreddits": 4}, {"user": "misana123", "n_posts": 19, "n_subreddits": 2}, {"user": "elisart", "n_posts": 19, "n_subreddits": 3}, {"user": "PHealthy", "n_posts": 19, "n_subreddits": 3}, {"user": "TheMildEngineer", "n_posts": 19, "n_subreddits": 2}, {"user": "thebelsnickle1991", "n_posts": 19, "n_subreddits": 3}, {"user": "dinozaur2020", "n_posts": 20, "n_subreddits": 2}, {"user": "BelleAriel", "n_posts": 20, "n_subreddits": 3}, {"user": "Underlaker", "n_posts": 21, "n_subreddits": 2}, {"user": "sabbir7860", "n_posts": 21, "n_subreddits": 4}, {"user": "unrushedlife", "n_posts": 21, "n_subreddits": 3}, {"user": "trot-trot", "n_posts": 21, "n_subreddits": 4}, {"user": "JesusCumelette", "n_posts": 21, "n_subreddits": 3}, {"user": "mem_somerville", "n_posts": 21, "n_subreddits": 2}, {"user": "casualphilosopher1", "n_posts": 22, "n_subreddits": 3}, {"user": "Sabatar446", "n_posts": 23, "n_subreddits": 4}, {"user": "DystopianAdvocate", "n_posts": 23, "n_subreddits": 2}, {"user": "GentrifriesGuy", "n_posts": 23, "n_subreddits": 2}, {"user": "LaromTheDestroyer", "n_posts": 24, "n_subreddits": 2}, {"user": "gaurishkohli", "n_posts": 24, "n_subreddits": 7}, {"user": "Express_Hyena", "n_posts": 24, "n_subreddits": 4}, {"user": "Fatherthinger", "n_posts": 25, "n_subreddits": 2}, {"user": "TomG12544", "n_posts": 25, "n_subreddits": 2}, {"user": "CaravanOfDeath", "n_posts": 25, "n_subreddits": 2}, {"user": "PoorIsTheNewSwag", "n_posts": 25, "n_subreddits": 3}, {"user": "MyNameIsGriffon", "n_posts": 26, "n_subreddits": 2}, {"user": "adearman91", "n_posts": 26, "n_subreddits": 4}, {"user": "NursingManChristDude", "n_posts": 26, "n_subreddits": 2}, {"user": "ElonMuch", "n_posts": 27, "n_subreddits": 7}, {"user": "realplayer16", "n_posts": 27, "n_subreddits": 4}, {"user": "stankmanly", "n_posts": 27, "n_subreddits": 2}, {"user": "Sumit316", "n_posts": 28, "n_subreddits": 4}, {"user": "gigivictoria", "n_posts": 28, "n_subreddits": 3}, {"user": "PjeterPannos", "n_posts": 29, "n_subreddits": 5}, {"user": "standardworks", "n_posts": 29, "n_subreddits": 2}, {"user": "Gonzo_B", "n_posts": 30, "n_subreddits": 5}, {"user": "dannylenwinn", "n_posts": 30, "n_subreddits": 6}, {"user": "Splenda", "n_posts": 30, "n_subreddits": 4}, {"user": "PLanPLan", "n_posts": 30, "n_subreddits": 2}, {"user": "geoxol", "n_posts": 31, "n_subreddits": 3}, {"user": "kevinowdziej", "n_posts": 32, "n_subreddits": 2}, {"user": "libtin", "n_posts": 32, "n_subreddits": 2}, {"user": "m3prx", "n_posts": 32, "n_subreddits": 2}, {"user": "UnstatesmanlikeChi", "n_posts": 33, "n_subreddits": 5}, {"user": "Juliemylove", "n_posts": 33, "n_subreddits": 5}, {"user": "Beliavsky", "n_posts": 35, "n_subreddits": 2}, {"user": "Bream1000", "n_posts": 36, "n_subreddits": 9}, {"user": "Sariel007", "n_posts": 38, "n_subreddits": 4}, {"user": "Larry-Shwa", "n_posts": 39, "n_subreddits": 4}, {"user": "signed7", "n_posts": 40, "n_subreddits": 5}, {"user": "kongweeneverdie", "n_posts": 41, "n_subreddits": 2}, {"user": "a_Ninja_b0y", "n_posts": 41, "n_subreddits": 4}, {"user": "zsreport", "n_posts": 42, "n_subreddits": 5}, {"user": "mohsinmughal72", "n_posts": 42, "n_subreddits": 3}, {"user": "Kunphen", "n_posts": 42, "n_subreddits": 4}, {"user": "Wong_John", "n_posts": 42, "n_subreddits": 2}, {"user": "khayrirrw", "n_posts": 43, "n_subreddits": 2}, {"user": "spaceghoti", "n_posts": 43, "n_subreddits": 2}, {"user": "AutoModerator", "n_posts": 45, "n_subreddits": 5}, {"user": "nimobo", "n_posts": 45, "n_subreddits": 2}, {"user": "SandyCoder", "n_posts": 46, "n_subreddits": 2}, {"user": "MrMrsMonk", "n_posts": 46, "n_subreddits": 2}, {"user": "quixotic_cynic", "n_posts": 47, "n_subreddits": 7}, {"user": "wakeup2019", "n_posts": 50, "n_subreddits": 2}, {"user": "burtzev", "n_posts": 50, "n_subreddits": 9}, {"user": "bobbyw24", "n_posts": 51, "n_subreddits": 5}, {"user": "impishrat", "n_posts": 51, "n_subreddits": 3}, {"user": "BlankVerse", "n_posts": 51, "n_subreddits": 8}, {"user": "DoremusJessup", "n_posts": 53, "n_subreddits": 7}, {"user": "-memeking-", "n_posts": 53, "n_subreddits": 5}, {"user": "TX908", "n_posts": 53, "n_subreddits": 2}, {"user": "thinkB4WeSpeak", "n_posts": 54, "n_subreddits": 11}, {"user": "BikkaZz", "n_posts": 56, "n_subreddits": 4}, {"user": "_Steamed_Hams", "n_posts": 62, "n_subreddits": 3}, {"user": "Philo1927", "n_posts": 63, "n_subreddits": 4}, {"user": "Mighty_L_LORT", "n_posts": 65, "n_subreddits": 2}, {"user": "rustoo", "n_posts": 67, "n_subreddits": 4}, {"user": "The-Techie", "n_posts": 67, "n_subreddits": 6}, {"user": "readerseven", "n_posts": 69, "n_subreddits": 2}, {"user": "pnewell", "n_posts": 69, "n_subreddits": 4}, {"user": "DonaldWillKillUsAll", "n_posts": 75, "n_subreddits": 6}, {"user": "snooshoe", "n_posts": 78, "n_subreddits": 5}, {"user": "speckz", "n_posts": 79, "n_subreddits": 8}, {"user": "wewewawa", "n_posts": 86, "n_subreddits": 8}, {"user": "MichaelTen", "n_posts": 91, "n_subreddits": 4}, {"user": "Facerealityalready", "n_posts": 102, "n_subreddits": 6}, {"user": "bored_curator", "n_posts": 103, "n_subreddits": 7}, {"user": "Sorin61", "n_posts": 120, "n_subreddits": 6}, {"user": "Wagamaga", "n_posts": 141, "n_subreddits": 5}, {"user": "GallantIce", "n_posts": 143, "n_subreddits": 2}, {"user": "boppinmule", "n_posts": 158, "n_subreddits": 4}, {"user": "shallah", "n_posts": 172, "n_subreddits": 6}, {"user": "Exastiken", "n_posts": 211, "n_subreddits": 9}, {"user": "Pessimist2020", "n_posts": 256, "n_subreddits": 9}]}
\ No newline at end of file
from typing import Dict
import json
class Post:
def __init__(self, post_id, user_id: str, content: str, title: str, permalink: str, upvotes: int, percentage_upvoted: float, n_comments: int, subreddit: str, created_at: int):
self.post_id = post_id
self.user_id = user_id
self.title = title
self.content = content
self.permalink = permalink
self.upvotes = upvotes
self.percentage_upvoted = percentage_upvoted
self.n_comments = n_comments
self.subreddit = subreddit
self.created_at = created_at
def to_serializable_dict(self) -> Dict:
return {
"id": self.post_id,
"user_id": self.user_id,
"title": self.title,
"content": self.content,
"permalink": self.permalink,
"upvotes": self.upvotes,
"percentage_upvoted": self.percentage_upvoted,
"n_comments": self.n_comments,
"subreddit": self.subreddit,
"created_at": self.created_at
}
@staticmethod
def from_serializable_dict(row: Dict):
return Post(
row["id"],
row["user_id"],
row["title"],
row["content"],
row["permalink"],
row["upvotes"],
row["percentage_upvoted"],
row["n_comments"],
row["subreddit"],
row["created_at"]
)
def to_json(self):
return json.dumps(self.to_serializable_dict())
def __eq__(self, other):
return self.__class__ == other.__class__ and self.post_id == other.post_id
class Tuple:
def __init__(self, tid: int):
self.tid = tid
self.value = 0
def __str__(self):
return f"Id:{self.tid}, Value:{self.value}"
import json
from typing import Dict
class User:
nextId = 1
def __init__(self, name: str):
self.name = name
self.id = User.nextId
User.nextId += 1
def __eq__(self, other):
return self.__class__ == other.__class__ and self.name == other.name
def to_serializable_dict(self):
return {"name": self.name, "id": self.id}
def to_json(self):
return json.dumps(self.to_serializable_dict())
@staticmethod
def from_serializable_dict(data: Dict):
return User(
data["name"]
)
This source diff could not be displayed because it is too large. You can view the blob instead.
apiVersion: v1
kind: Service
metadata:
name: demo-backend
spec:
type: LoadBalancer
selector:
app: demo-backend
ports:
- name: https
port: 8000
targetPort: 8000
nodePort: 30470
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-backend
spec:
replicas: 1
selector:
matchLabels:
app: demo-backend
template:
metadata:
labels:
app: demo-backend
spec:
containers:
- name: dashboard
image: alexx882/demo-backend
ports:
- containerPort: 8000
imagePullPolicy: Always
volumeMounts:
- mountPath: /certs
name: articonf
volumes:
- name: articonf
hostPath:
path: /srv/articonf
type: Directory
\ No newline at end of file
import crawler
from crawler.user import User
from crawler import crawler
if __name__ == "__main__":
crawler.main(input_file_path="crawler/output.json", output_file_path="crawler/output.json")
FROM nginx:1.15.8
RUN rm /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/
RUN rm /etc/nginx/conf.d/default.conf
COPY project.conf /etc/nginx/conf.d/
\ No newline at end of file
# Define the user that will own and run the Nginx server
user nginx;
# Define the number of worker processes; recommended value is the number of
# cores that are being used by your server
worker_processes 1;
# Define the location on the file system of the error log, plus the minimum
# severity to log messages for
error_log /var/log/nginx/error.log warn;
# Define the file that will store the process ID of the main NGINX process
pid /var/run/nginx.pid;
# events block defines the parameters that affect connection processing.
events {
# Define the maximum number of simultaneous connections that can be opened by a worker proce$
worker_connections 1024;
}
# http block defines the parameters for how NGINX should handle HTTP web traffic
http {
# Include the file defining the list of file types that are supported by NGINX
include /etc/nginx/mime.types;
# Define the default file type that is returned to the user
default_type text/html;
# Define the format of log messages.
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Define the location of the log of access attempts to NGINX
access_log /var/log/nginx/access.log main;
# Define the parameters to optimize the delivery of static content
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Define the timeout value for keep-alive connections with the client
keepalive_timeout 65;
# Define the usage of the gzip compression algorithm to reduce the amount of data to transmit
#gzip on;
# Include additional parameters for virtual host(s)/server(s)
include /etc/nginx/conf.d/*.conf;
}
\ No newline at end of file
server {
listen 443 ssl;
server_name docker_flask_gunicorn_nginx;
ssl_certificate /certs/articonf1.crt;
ssl_certificate_key /certs/articonf1.key;
location / {
proxy_pass http://flask_app:8000;
# Do not change this
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
rewrite ^/static(.*) /$1 break;
root /static;
}
}
pip~=20.1.1
certifi~=2020.12.5
websocket-client~=0.57.0
prawcore~=1.5.0
colorama~=0.4.4
Jinja2~=2.11.3
Werkzeug~=1.0.1
itsdangerous~=1.1.0
click~=7.1.2
MarkupSafe~=1.1.1
chardet~=4.0.0
urllib3~=1.26.3
six~=1.15.0
icecream~=2.1.0
Pygments~=2.7.4
executing~=0.5.4
requests~=2.25.1
idna~=2.10
asttokens~=2.0.4
setuptools~=53.0.0
praw~=7.1.0
Flask~=1.1.2
gunicorn
flask-cors
numpy~=1.20.2
\ No newline at end of file
from .post import Post
from .trust import Transaction, TrustOracle
from .enhanced_post import EnhancedPost
from .trust_label import TrustLabel
from trust import Transaction
from typing import Dict
import json
from .post import Post
class EnhancedPost(Transaction):
def __init__(self, base_post: Post, volume: float, is_trustworthy: bool, downvotes: int):
# parent class
super().__init__(base_post.created_at, volume=volume, is_trustworthy=is_trustworthy)
self.post_id = base_post.post_id
self.user_id = base_post.user_id
self.title = base_post.title
self.content = base_post.content
self.permalink = base_post.permalink
self.upvotes = base_post.upvotes
self.percentage_upvoted = base_post.percentage_upvoted
self.n_comments = base_post.n_comments
self.subreddit = base_post.subreddit
self.created_at = base_post.created_at
self.downvotes = downvotes
def to_serializable_dict(self) -> Dict:
return {
"id": self.post_id,
"user_id": self.user_id,
"title": self.title,
"content": self.content,
"permalink": self.permalink,
"upvotes": self.upvotes,
"percentage_upvoted": self.percentage_upvoted,
"n_comments": self.n_comments,
"subreddit": self.subreddit,
"created_at": self.created_at,
"volume": self.volume,
"timestamp": self.timestamp,
"trustworthy": self.trustworthy,
}
# @staticmethod
# def from_serializable_dict(row: Dict):
# return Post(
# row["id"],
# row["user_id"],
# row["title"],
# row["content"],
# row["permalink"],
# row["upvotes"],
# row["percentage_upvoted"],
# row["n_comments"],
# row["subreddit"],
# row["created_at"]
# )
def to_json(self):
return json.dumps(self.to_serializable_dict())
def __eq__(self, other):
return self.__class__ == other.__class__ and self.post_id == other.post_id
from .post import Post
from .user import User
from .enhanced_post import EnhancedPost
from .trust import TrustOracle
from typing import List
from icecream import ic
def volume_calculation(user_post: Post) -> float:
n_characters = len(user_post.content) + len(user_post.title)
return n_characters * (user_post.percentage_upvoted - .5)
def enhance_post(user_post: Post) -> EnhancedPost:
volume = volume_calculation(user_post)
if user_post.percentage_upvoted > 0:
downvotes = int(user_post.upvotes / user_post.percentage_upvoted)
else:
downvotes = user_post.upvotes
return EnhancedPost(user_post, volume, volume > 0, downvotes)
def rate_user_trust(creator: User, user_posts: List[Post], oracle: TrustOracle):
user_posts = [enhance_post(post) for post in user_posts]
return oracle.calculate_trust(None, user_posts)
if __name__ == "__main__":
user = User("Herry")
posts = [
Post(
"abcde",
"Herry",
"Fan in pink one-piece runs on field during Super Bowl LV",
"Fan in pink one-piece runs on field during Super Bowl LV. Fan in pink one-piece runs on field during Super Bowl LV. Fan in pink one-piece runs on field during Super Bowl LV. Fan in pink one-piece runs on field during Super Bowl LV",
"/r/news/abcde",
60,
0.73,
5,
"news",
1612965762
),
Post(
"abcde",
"Herry",
"Biden becomes the 46th president, vowing to heal and unite a nation in crisis",
"Biden becomes the 46th president, vowing to heal and unite a nation in crisis. Biden becomes the 46th president, vowing to heal and unite a nation in crisis. Biden becomes the 46th president, vowing to heal and unite a nation in crisis",
"/r/news/abcdf",
75,
0.2,
12,
"news",
1612965888
)
]
oracle = TrustOracle(translate_value=300, knowledge_border=.75)
trust = oracle.calculate_trust(None, [enhance_post(post) for post in posts])
ic(trust)
from typing import Dict
import json
class Post:
def __init__(self, post_id, user_id: str, content: str, title: str, permalink: str, upvotes: int,
percentage_upvoted: float, n_comments: int, subreddit: str, created_at: int):
self.post_id = post_id
self.user_id = user_id
self.title = title
self.content = content
self.permalink = permalink
self.upvotes = upvotes
self.percentage_upvoted = percentage_upvoted
self.n_comments = n_comments
self.subreddit = subreddit
self.created_at = created_at
def to_serializable_dict(self) -> Dict:
return {
"id": self.post_id,
"user_id": self.user_id,
"title": self.title,
"content": self.content,
"permalink": self.permalink,
"upvotes": self.upvotes,
"percentage_upvoted": self.percentage_upvoted,
"n_comments": self.n_comments,
"subreddit": self.subreddit,
"created_at": self.created_at
}
@staticmethod
def from_serializable_dict(row: Dict):
return Post(
row["id"],
row["user_id"],
row["title"],
row["content"],
row["permalink"],
row["upvotes"],
row["percentage_upvoted"],
row["n_comments"],
row["subreddit"],
row["created_at"]
)
def to_json(self):
return json.dumps(self.to_serializable_dict())
def __eq__(self, other):
return self.__class__ == other.__class__ and self.post_id == other.post_id
import datetime
import math
from typing import List
from icecream import ic
from .trust_label import TrustLabel
class Transaction:
def __init__(self, timestamp, volume=1, is_trustworthy=True):
self.volume = volume
self.trustworthy = is_trustworthy
self.timestamp = timestamp
class Node:
def __init__(self, initial_t=0):
self.t = initial_t
class TrustOracle:
def __init__(self, translate_value: float, knowledge_border: float):
# translates transaction volume into unitless x-axis value for sigmoid input
self.translate_value = translate_value
# nodes must reach a value of at least |trust(node)| = knowledge_border to get a definite label
self.knowledge_border = knowledge_border
def rate_node(self, node: Node) -> TrustLabel:
if node.t < -self.knowledge_border:
return TrustLabel.UNTRUSTWORTHY
if node.t > self.knowledge_border:
return TrustLabel.TRUSTWORTHY
return TrustLabel.UNSURE
def calculate_trust(self, start_date: datetime, node_transactions: List[Transaction]):
trust_total = 0
for transaction in node_transactions:
transaction_t = abs(transaction.volume / self.translate_value)
trust_total += transaction_t
print("t-value: "+str(trust_total))
print("translated: "+str(translate_t_to_trust_value(trust_total)))
return translate_t_to_trust_value(trust_total)
def translate_t_to_trust_value(t_value: float):
# classic sigmoid function as in https://en.wikipedia.org/wiki/Sigmoid_function
sig = 1 / (1 + math.exp(-t_value))
# rescale it st.:
# values are between ]-1;1[
sig *= 2
sig -= 1
return sig
if __name__ == "__main__":
oracle = TrustOracle(translate_value=10, knowledge_border=.75)
herry = Node()
transactions = [
Transaction(datetime.datetime(2020, 1, 20), is_trustworthy=False),
Transaction(datetime.datetime(2020, 1, 20)),
Transaction(datetime.datetime(2020, 1, 20)),
]
start: datetime = datetime.datetime.now() - datetime.timedelta(days=7)
t = oracle.calculate_trust(start, transactions)
trust = translate_t_to_trust_value(t)
ic(t)
ic(trust)
ic(oracle.rate_node(herry))
from enum import Enum
class TrustLabel(Enum):
UNTRUSTWORTHY = 1
UNSURE = 2
TRUSTWORTHY = 3
import json
from typing import Dict
class User:
nextId = 1
def __init__(self, name: str):
self.name = name
self.id = User.nextId
User.nextId += 1
def __eq__(self, other):
return self.__class__ == other.__class__ and self.name == other.name
def to_serializable_dict(self):
return {"name": self.name, "id": self.id}
def to_json(self):
return json.dumps(self.to_serializable_dict())
@staticmethod
def from_serializable_dict(data: Dict):
return User(
data["name"]
)
from app import app
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000, ssl_context=("/certs/articonf1.crt","/certs/articonf1.key"))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment