commit 7a70033dee413922d6d45f5bd2b92e2a5d780119 Author: Aevann1 Date: Wed Jul 21 03:12:26 2021 +0200 sneed diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..8dc698e6b --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.css linguist-detectable=false +*.js linguist-detectable=true +*.html linguist-detectable=false +*.py linguist-detectable=true diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..6747a83c0 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +github: Aevann1 +patreon: Aevann +custom: ["https://rdrama.gumroad.com/l/tfcvri"] diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..3cda725bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,115 @@ +ruqquscache/ +# 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/ +*.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/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# 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/ + +#custom +*.DS_Store +#node_modules/ +package-lock.json +*.css.map +*.map +local.txt +*.scssc +.idea/* diff --git a/.well-known/assetlinks.json b/.well-known/assetlinks.json new file mode 100644 index 000000000..40a7e7e7a --- /dev/null +++ b/.well-known/assetlinks.json @@ -0,0 +1,9 @@ +[{ + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "net.rdrama", + "sha256_cert_fingerprints": + ["ED:D9:72:9B:CD:61:52:18:AB:95:D0:21:BD:7F:04:6F:89:04:AC:B9:73:A2:2E:90:A5:2B:0C:13:F8:4A:EC:18"] + } +}] \ No newline at end of file diff --git a/.well-known/brave-rewards-verification.txt b/.well-known/brave-rewards-verification.txt new file mode 100644 index 000000000..1ba71b66d --- /dev/null +++ b/.well-known/brave-rewards-verification.txt @@ -0,0 +1,4 @@ +This is a Brave Rewards publisher verification file. + +Domain: rdrama.net +Token: 0774158a4aec1e891263f84cf37919c0aa19309b9fba4ad9c4a0aae8946f5d0d diff --git a/.well-known/service-worker.js b/.well-known/service-worker.js new file mode 100644 index 000000000..f2918a743 --- /dev/null +++ b/.well-known/service-worker.js @@ -0,0 +1 @@ +importScripts("https://js.pusher.com/beams/service-worker.js"); \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..56f7fdf69 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +FROM ubuntu:20.04 + +COPY supervisord.conf /etc/supervisord.conf + +RUN apt update \ + && apt install -y python3.8 python3-pip supervisor + +RUN mkdir -p /opt/Drama/service + +COPY requirements.txt /opt/Drama/service/requirements.txt + +RUN cd /opt/Drama/service \ + && pip3 install -r requirements.txt + +EXPOSE 80/tcp + +CMD [ "/usr/bin/supervisord", "-c", "/etc/supervisord.conf" ] diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d0a1fa148 --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/appspec.yml b/appspec.yml new file mode 100644 index 000000000..e31c52105 --- /dev/null +++ b/appspec.yml @@ -0,0 +1,13 @@ +version: 0.0 +os: linux +files: + - source: / + destination: ruqqus +permissions: + - object: ruqqus/* + mode: 4755 +hooks: + AfterInstall: + - location: scripts/install_pip + ApplicationStart: + - location: scripts/start_ruqqus \ No newline at end of file diff --git a/buildspec.yml b/buildspec.yml new file mode 100644 index 000000000..db85248f5 --- /dev/null +++ b/buildspec.yml @@ -0,0 +1,8 @@ +version: 0.2 +phases: + install: + runtime-versions: + python: 3.7 +artifacts: + files: + - '**/*' \ No newline at end of file diff --git a/compilecss.py b/compilecss.py new file mode 100644 index 000000000..0249fb3f6 --- /dev/null +++ b/compilecss.py @@ -0,0 +1,7 @@ +for theme in ['dark', 'light', 'coffee', 'tron', '4chan']: + with open(f"D:/#D/ruqqus/assets/style/{theme}_ff66ac.css", encoding='utf-8') as t: + text = t.read() + for color in ['805ad5','62ca56','38a169','80ffff','2a96f3','62ca56','eb4963','ff0000','f39731','30409f','3e98a7','e4432d','7b9ae4','ec72de','7f8fa6', 'f8db58']: + newtext = text.replace("ff66ac", color).replace("ff4097", color).replace("ff1a83", color).replace("ff3390", color) + with open(f"D:/#D/ruqqus/assets/style/{theme}_{color}.css", encoding='utf-8', mode='w') as nt: + nt.write(newtext) \ No newline at end of file diff --git a/dependabot.yml b/dependabot.yml new file mode 100644 index 000000000..f1747992c --- /dev/null +++ b/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..85a71ce94 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,62 @@ +version: '2.3' + +services: + ruqqus: + build: + context: . + volumes: + - "./:/opt/Drama/service" + environment: + - PYTHONPATH="opt/Drama/service" + - REDIS_URL=redis://127.0.0.1 + - DATABASE_URL=postgresql://postgres@127.0.0.1:5432/postgres + - DATABASE_CONNECTION_POOL_URL=postgresql://postgres@127.0.0.1:5432/postgres + - MASTER_KEY=${MASTER_KEY:-KTVciAUQFpFh2WdJ/oiHJlxl6FvzRZp8kYzAAv3l2OA=} + - SESSION_COOKIE_SECURE=false + - FLASK_DEBUG=1 + - FLASK_ENV=development + - domain=localhost + - SITE_NAME=Drama + - CLOUDFLARE_ZONE=vcxvdfgfc6r554etrgd + - CLOUDFLARE_KEY=vcxvdfgfc6r554etrgd + - TENOR_KEY=vcxvdfgfc6r554etrgd + - S3_BUCKET_NAME=i.ruqqus.ga + - AWS_ACCESS_KEY_ID=vcxvdfgfc6r554etrgd + - AWS_SECRET_ACCESS_KEY=vcxvdfgfc6r554etrgd + - MAILGUN_KEY=vcxvdfgfc6r554etrgd + - admin_email=drama@rdrama.net + - FORCE_HTTPS=1 + - DISCORD_SERVER_ID=vcxvdfgfc6r554etrgd + - DISCORD_CLIENT_ID=vcxvdfgfc6r554etrgd + - DISCORD_CLIENT_SECRET=vcxvdfgfc6r554etrgd + - DISCORD_BOT_TOKEN=vcxvdfgfc6r554etrgd + - imgurkey=vcxvdfgfc6r554etrgd + - FACEBOOK_TOKEN=vcxvdfgfc6r554etrgd + - HCAPTCHA_SITEKEY=vcxvdfgfc6r554etrgd + - HCAPTCHA_SECRET=vcxvdfgfc6r554etrgd + - youtubekey=vcxvdfgfc6r554etrgd + - PUSHER_KEY=vcxvdfgfc6r554etrgd + links: + - "redis" + - "postgres" + ports: + - "80:80" + depends_on: + - redis + - postgres + + redis: + image: redis + volumes: + - ./redis.conf:/opt/Drama/redis.conf + ports: + - "6379:6379" + + postgres: + image: postgres:12.3 + volumes: + - "./schema.sql:/docker-entrypoint-initdb.d/00-schema.sql" + environment: + - POSTGRES_HOST_AUTH_METHOD=trust + ports: + - "5432:5432" diff --git a/push.sh b/push.sh new file mode 100644 index 000000000..0a93042bc --- /dev/null +++ b/push.sh @@ -0,0 +1,17 @@ +git pull +git add . +git commit -m "sneed" +git push + +sass ./ruqqus/assets/style/dark.scss D:/#D/ruqqus/assets/style/dark_ff66ac.css +sass ./ruqqus/assets/style/light.scss D:/#D/ruqqus/assets/style/light_ff66ac.css +sass ./ruqqus/assets/style/coffee.scss D:/#D/ruqqus/assets/style/coffee_ff66ac.css +sass ./ruqqus/assets/style/tron.scss D:/#D/ruqqus/assets/style/tron_ff66ac.css +sass ./ruqqus/assets/style/4chan.scss D:/#D/ruqqus/assets/style/4chan_ff66ac.css +python ./compilecss.py +git add . +git commit -m "css" +git push + +cd D:\1 +git pull \ No newline at end of file diff --git a/pushforce.sh b/pushforce.sh new file mode 100644 index 000000000..26412e5da --- /dev/null +++ b/pushforce.sh @@ -0,0 +1,3 @@ +git add . +git commit -m "force push" +git push --force \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 000000000..684daa217 --- /dev/null +++ b/readme.md @@ -0,0 +1,78 @@ +# How to Install Drama Locally + + +## Overview + +Installing Drama locally is the fastest way to get the software up and running and start tinkering under the hood. + +--- + +## Windows + +### Install Docker + +Install Docker on your machine. + +[Docker installation for Windows](https://docs.docker.com/docker-for-windows/install/) + +### Download Drama + +Download the latest release of Drama from GitHub. + +[Drama Latest Release - GitHub](https://github.com/Drama/Drama/releases) + +### PowerShell + +Press shift+right click inside the code folder and run PowerShell. Then in PowerShell, run the following command: + +``` +docker-compose up +``` + +That's it! Visit `localhost` in your browser. + +--- + +## Linux + +### Install Docker + +Install Docker on your machine. + +[Docker installation for Ubuntu](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04) + +### Install Docker-compose + +Install Docker-compose on your machine. + +[Docker-compose installation for Ubuntu](https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-18-04) + +### Download Drama + +Navigate to `/opt` + +``` +cd /opt +``` + +then clone Drama into your machine. + +``` +git clone https://github.com/Drama/Drama/ +``` + +### Run Drama + +Navigate to `/opt/Drama` + +``` +cd /opt/Drama +``` + +then run this command + +``` +docker-compose up +``` + +That's it! Visit `localhost` in your browser. diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..706d408ed --- /dev/null +++ b/requirements.txt @@ -0,0 +1,69 @@ +async-timeout +attrs +beautifulsoup4 +bleach +boto3 +botocore +certifi +chardet +click +cycler +eventlet +Flask +Flask-Caching==1.9.0 +Flask-Compress==1.9.0 +Flask-Limiter==1.1.0 +Flask-Markdown==0.3 +flask-socketio==5.1.0 +gevent +gevent-websocket +greenlet +gunicorn +idna +idna-ssl +ImageHash +importlib-metadata +itsdangerous +Jinja2 +jmespath +kiwisolver +libsass +limits +lockfile +Markdown +MarkupSafe +matplotlib +mistletoe +multidict +newrelic +numpy +piexif +Pillow +psutil +psycogreen +psycopg2-binary +py3socket +pyotp +pyparsing +python-daemon +python-dateutil +PyWavelets +qrcode +redis +requests +s3transfer +scipy +six +soupsieve +SQLAlchemy==1.3.19 +typing-extensions +urllib3 +webencodings +websockets +Werkzeug +yattag +yarl +zipp +pusher_push_notifications +youtube-dl +testresources \ No newline at end of file diff --git a/ruqqus/__main__.py b/ruqqus/__main__.py new file mode 100644 index 000000000..c5a30d082 --- /dev/null +++ b/ruqqus/__main__.py @@ -0,0 +1,352 @@ +import gevent.monkey +gevent.monkey.patch_all() + +import os +from os import environ +import secrets +from flask import * +from flask_caching import Cache +from flask_limiter import Limiter +from flask_limiter.util import get_remote_address +from flask_compress import Compress +from flask_socketio import SocketIO +from time import sleep +from collections import deque +import psycopg2 + +from flaskext.markdown import Markdown +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.exc import OperationalError, StatementError, InternalError +from sqlalchemy.orm import Session, sessionmaker, scoped_session, Query as _Query +from sqlalchemy import * +from sqlalchemy.pool import QueuePool +import threading +import requests +import random +import redis +import gevent +import sys + +from redis import BlockingConnectionPool, ConnectionPool + +from werkzeug.middleware.proxy_fix import ProxyFix + + +_version = "2.37.4" + +app = Flask(__name__, + template_folder='./templates', + static_folder='./static' + ) +app.wsgi_app = ProxyFix(app.wsgi_app, x_for=3) +app.url_map.strict_slashes = False + +app.config["SITE_NAME"]=environ.get("SITE_NAME", "Ruqqus").strip() + +app.config["SITE_COLOR"]=environ.get("SITE_COLOR", "805ad5").strip() + +app.config["RUQQUSPATH"]=environ.get("RUQQUSPATH", os.path.dirname(os.path.realpath(__file__))) + +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +app.config['DATABASE_URL'] = environ.get( + "DATABASE_CONNECTION_POOL_URL", + environ.get("DATABASE_URL")) + +app.config['SQLALCHEMY_READ_URIS'] = [ + environ.get("DATABASE_CONNECTION_READ_01_URL"), + environ.get("DATABASE_CONNECTION_READ_02_URL"), + environ.get("DATABASE_CONNECTION_READ_03_URL") +] + +app.config['SECRET_KEY'] = environ.get('MASTER_KEY') +app.config["SERVER_NAME"] = environ.get( + "domain", environ.get( + "SERVER_NAME", "")).strip() + +app.config["SHORT_DOMAIN"]=environ.get("SHORT_DOMAIN","").strip() +app.config["SESSION_COOKIE_NAME"] = "session_ruqqus" +app.config["VERSION"] = _version +app.config['MAX_CONTENT_LENGTH'] = 64 * 1024 * 1024 +app.config["SESSION_COOKIE_SECURE"] = bool(int(environ.get("FORCE_HTTPS", 1))) +app.config["SESSION_COOKIE_SAMESITE"] = "Lax" + +app.config["PERMANENT_SESSION_LIFETIME"] = 60 * 60 * 24 * 365 +app.config["SESSION_REFRESH_EACH_REQUEST"] = True + +app.config["FORCE_HTTPS"] = int(environ.get("FORCE_HTTPS", 1)) if ("localhost" not in app.config["SERVER_NAME"] and "127.0.0.1" not in app.config["SERVER_NAME"]) else 0 +app.config["DISABLE_SIGNUPS"]=int(environ.get("DISABLE_SIGNUPS",0)) + +app.jinja_env.cache = {} + +app.config["UserAgent"] = f"Content Aquisition for Pink message board v{_version}." + +if "localhost" in app.config["SERVER_NAME"]: + app.config["CACHE_TYPE"] = "null" +else: + app.config["CACHE_TYPE"] = environ.get("CACHE_TYPE", 'filesystem').strip() + +app.config["CACHE_DIR"] = environ.get("CACHE_DIR", "ruqquscache") + +# captcha configs +app.config["HCAPTCHA_SITEKEY"] = environ.get("HCAPTCHA_SITEKEY","").strip() +app.config["HCAPTCHA_SECRET"] = environ.get( + "HCAPTCHA_SECRET","").strip() +app.config["SIGNUP_HOURLY_LIMIT"]=int(environ.get("SIGNUP_HOURLY_LIMIT",0)) + +# antispam configs +app.config["SPAM_SIMILARITY_THRESHOLD"] = float( + environ.get("SPAM_SIMILARITY_THRESHOLD", 0.5)) +app.config["SPAM_SIMILAR_COUNT_THRESHOLD"] = int( + environ.get("SPAM_SIMILAR_COUNT_THRESHOLD", 5)) +app.config["SPAM_URL_SIMILARITY_THRESHOLD"] = float( + environ.get("SPAM_URL_SIMILARITY_THRESHOLD", 0.1)) +app.config["COMMENT_SPAM_SIMILAR_THRESHOLD"] = float( + environ.get("COMMENT_SPAM_SIMILAR_THRESHOLD", 0.5)) +app.config["COMMENT_SPAM_COUNT_THRESHOLD"] = int( + environ.get("COMMENT_SPAM_COUNT_THRESHOLD", 5)) + +app.config["CACHE_REDIS_URL"] = environ.get( + "REDIS_URL").strip().lstrip() if environ.get("REDIS_URL") else None +app.config["CACHE_DEFAULT_TIMEOUT"] = 60 +app.config["CACHE_KEY_PREFIX"] = "flask_caching_" + +app.config["S3_BUCKET"]=environ.get("S3_BUCKET_NAME","i.rdrama.net").strip() + +app.config["REDIS_POOL_SIZE"]=int(environ.get("REDIS_POOL_SIZE", 10)) + +redispool=ConnectionPool( + max_connections=app.config["REDIS_POOL_SIZE"], + host=app.config["CACHE_REDIS_URL"][8:] + ) if app.config["CACHE_TYPE"]=="redis" else None +app.config["CACHE_OPTIONS"]={'connection_pool':redispool} if app.config["CACHE_TYPE"]=="redis" else {} + +app.config["READ_ONLY"]=bool(int(environ.get("READ_ONLY", False))) +app.config["BOT_DISABLE"]=bool(int(environ.get("BOT_DISABLE", False))) + +app.config["TENOR_KEY"]=environ.get("TENOR_KEY",'').strip() + + +Markdown(app) +cache = Cache(app) +Compress(app) + +class CorsMatch(str): + + def __eq__(self, other): + if isinstance(other, str): + if other in ['https://rdrama.net', f'https://{app.config["SERVER_NAME"]}']: + return True + + elif other.endswith(".rdrama.net"): + return True + + elif isinstance(other, list): + if f'https://{app.config["SERVER_NAME"]}' in other: + return True + elif any([x.endswith(".rdrama.net") for x in other]): + return True + + return False + + + +app.config["RATELIMIT_STORAGE_URL"] = environ.get("REDIS_URL").strip() if environ.get("REDIS_URL") else 'memory://' +app.config["RATELIMIT_KEY_PREFIX"] = "flask_limiting_" +app.config["RATELIMIT_ENABLED"] = True +app.config["RATELIMIT_DEFAULTS_DEDUCT_WHEN"]=lambda:True +app.config["RATELIMIT_DEFAULTS_EXEMPT_WHEN"]=lambda:False +app.config["RATELIMIT_HEADERS_ENABLED"]=True + + +def limiter_key_func(): + return request.remote_addr + + +limiter = Limiter( + app, + key_func=limiter_key_func, + default_limits=["100/minute"], + headers_enabled=True, + strategy="fixed-window" +) + +_engine=create_engine( + app.config['DATABASE_URL'], + poolclass=QueuePool, + pool_size=int(environ.get("PG_POOL_SIZE",10)), + pool_use_lifo=True +) + +def retry(f): + + def wrapper(self, *args, **kwargs): + try: + return f(self, *args, **kwargs) + except OperationalError as e: + #self.session.rollback() + raise(DatabaseOverload) + except: + self.session.rollback() + return f(self, *args, **kwargs) + + wrapper.__name__=f.__name__ + return wrapper + + +class RetryingQuery(_Query): + + @retry + def all(self): + return super().all() + + @retry + def count(self): + return super().count() + + @retry + def first(self): + return super().first() + +db_session=scoped_session(sessionmaker(bind=_engine, query_cls=RetryingQuery)) + +Base = declarative_base() + + +#set the shared redis cache for misc stuff + +r=redis.Redis( + host=app.config["CACHE_REDIS_URL"][8:], + decode_responses=True, + ssl_cert_reqs=None, + connection_pool=redispool + ) if app.config["CACHE_REDIS_URL"] else None + +local_ban_cache={} + +UA_BAN_CACHE_TTL = int(environ.get("UA_BAN_CACHE_TTL", 3600)) + + + +# import and bind all routing functions +import ruqqus.classes +from ruqqus.routes import * +import ruqqus.helpers.jinja2 + +@cache.memoize(UA_BAN_CACHE_TTL) +def get_useragent_ban_response(user_agent_str): + """ + Given a user agent string, returns a tuple in the form of: + (is_user_agent_banned, (insult, status_code)) + """ + #if request.path.startswith("/socket.io/"): + # return False, (None, None) + + result = g.db.query( + ruqqus.classes.Agent).filter( + ruqqus.classes.Agent.kwd.in_( + user_agent_str.split())).first() + if result: + return True, (result.mock or "Follow the robots.txt, dumbass", + result.status_code or 418) + return False, (None, None) + +def drop_connection(): + + g.db.close() + gevent.getcurrent().kill() + + +# enforce https +@app.before_request +def before_request(): + + if request.method.lower() != "get" and app.config["READ_ONLY"]: + return jsonify({"error":f"{app.config['SITE_NAME']} is currently in read-only mode."}), 500 + + if app.config["BOT_DISABLE"] and request.headers.get("X-User-Type")=="Bot": + abort(503) + + g.db = db_session() + + if g.db.query(IP).filter_by(addr=request.remote_addr).first(): + abort(503) + + g.timestamp = int(time.time()) + + session.permanent = True + + ua_banned, response_tuple = get_useragent_ban_response( + request.headers.get("User-Agent", "NoAgent")) + if ua_banned and request.path != "/robots.txt": + return response_tuple + + if app.config["FORCE_HTTPS"] and request.url.startswith( + "http://") and "localhost" not in app.config["SERVER_NAME"]: + url = request.url.replace("http://", "https://", 1) + return redirect(url, code=301) + + if not session.get("session_id"): + session["session_id"] = secrets.token_hex(16) + + ua=request.headers.get("User-Agent","") + if "CriOS/" in ua: + g.system="ios/chrome" + elif "Version/" in ua: + g.system="android/webview" + elif "Mobile Safari/" in ua: + g.system="android/chrome" + elif "Safari/" in ua: + g.system="ios/safari" + elif "Mobile/" in ua: + g.system="ios/webview" + else: + g.system="other/other" + + +def log_event(name, link): + + x = requests.get(link) + + if x.status_code != 200: + return + + text = f'> **{name}**\r> {link}' + + url = os.environ.get("DISCORD_WEBHOOK") + headers = {"Content-Type": "application/json"} + data = {"username": "ruqqus", + "content": text + } + + x = requests.post(url, headers=headers, json=data) + print(x.status_code) + + +@app.after_request +def after_request(response): + + try: g.db.commit() + except: pass + g.db.close() + + response.headers.add('Access-Control-Allow-Headers', + "Origin, X-Requested-With, Content-Type, Accept, x-auth" + ) + response.headers.add("Cache-Control", + "maxage=600") + response.headers.add("Strict-Transport-Security", "max-age=31536000") + response.headers.add("Referrer-Policy", "same-origin") + # response.headers.add("X-Content-Type-Options","nosniff") + response.headers.add("Feature-Policy", + "geolocation 'none'; midi 'none'; notifications 'none'; push 'none'; sync-xhr 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; vibrate 'none'; fullscreen 'none'; payment 'none';") + if not request.path.startswith("/embed/"): + response.headers.add("X-Frame-Options", + "deny") + + return response + + +@app.route("/", subdomain="www") +def www_redirect(path): + + return redirect(f"https://{app.config['SERVER_NAME']}/{path}") \ No newline at end of file diff --git a/ruqqus/assets/Drama.apk b/ruqqus/assets/Drama.apk new file mode 100644 index 000000000..64450aa25 Binary files /dev/null and b/ruqqus/assets/Drama.apk differ diff --git a/ruqqus/assets/images/badges/agendaposter.png b/ruqqus/assets/images/badges/agendaposter.png new file mode 100644 index 000000000..70ea7214f Binary files /dev/null and b/ruqqus/assets/images/badges/agendaposter.png differ diff --git a/ruqqus/assets/images/badges/alpha.png b/ruqqus/assets/images/badges/alpha.png new file mode 100644 index 000000000..db3004109 Binary files /dev/null and b/ruqqus/assets/images/badges/alpha.png differ diff --git a/ruqqus/assets/images/badges/art.png b/ruqqus/assets/images/badges/art.png new file mode 100644 index 000000000..ca983a203 Binary files /dev/null and b/ruqqus/assets/images/badges/art.png differ diff --git a/ruqqus/assets/images/badges/baby.png b/ruqqus/assets/images/badges/baby.png new file mode 100644 index 000000000..90192fcb2 Binary files /dev/null and b/ruqqus/assets/images/badges/baby.png differ diff --git a/ruqqus/assets/images/badges/beta.png b/ruqqus/assets/images/badges/beta.png new file mode 100644 index 000000000..1859842b0 Binary files /dev/null and b/ruqqus/assets/images/badges/beta.png differ diff --git a/ruqqus/assets/images/badges/game-highfinish.png b/ruqqus/assets/images/badges/game-highfinish.png new file mode 100644 index 000000000..2cca03975 Binary files /dev/null and b/ruqqus/assets/images/badges/game-highfinish.png differ diff --git a/ruqqus/assets/images/badges/game-participant.png b/ruqqus/assets/images/badges/game-participant.png new file mode 100644 index 000000000..36cab25f4 Binary files /dev/null and b/ruqqus/assets/images/badges/game-participant.png differ diff --git a/ruqqus/assets/images/badges/git.png b/ruqqus/assets/images/badges/git.png new file mode 100644 index 000000000..ea4690d1c Binary files /dev/null and b/ruqqus/assets/images/badges/git.png differ diff --git a/ruqqus/assets/images/badges/idea.png b/ruqqus/assets/images/badges/idea.png new file mode 100644 index 000000000..46e4e2384 Binary files /dev/null and b/ruqqus/assets/images/badges/idea.png differ diff --git a/ruqqus/assets/images/badges/labrat.png b/ruqqus/assets/images/badges/labrat.png new file mode 100644 index 000000000..dd5c57e40 Binary files /dev/null and b/ruqqus/assets/images/badges/labrat.png differ diff --git a/ruqqus/assets/images/badges/lolcow.png b/ruqqus/assets/images/badges/lolcow.png new file mode 100644 index 000000000..c233ef4c1 Binary files /dev/null and b/ruqqus/assets/images/badges/lolcow.png differ diff --git a/ruqqus/assets/images/badges/mail.png b/ruqqus/assets/images/badges/mail.png new file mode 100644 index 000000000..ccffdbdd2 Binary files /dev/null and b/ruqqus/assets/images/badges/mail.png differ diff --git a/ruqqus/assets/images/badges/patreon-1.png b/ruqqus/assets/images/badges/patreon-1.png new file mode 100644 index 000000000..2caeba010 Binary files /dev/null and b/ruqqus/assets/images/badges/patreon-1.png differ diff --git a/ruqqus/assets/images/badges/patreon-2.png b/ruqqus/assets/images/badges/patreon-2.png new file mode 100644 index 000000000..89b615981 Binary files /dev/null and b/ruqqus/assets/images/badges/patreon-2.png differ diff --git a/ruqqus/assets/images/badges/patreon-3.png b/ruqqus/assets/images/badges/patreon-3.png new file mode 100644 index 000000000..759c943bd Binary files /dev/null and b/ruqqus/assets/images/badges/patreon-3.png differ diff --git a/ruqqus/assets/images/badges/patreon-4.png b/ruqqus/assets/images/badges/patreon-4.png new file mode 100644 index 000000000..8884adc4b Binary files /dev/null and b/ruqqus/assets/images/badges/patreon-4.png differ diff --git a/ruqqus/assets/images/badges/recruit-1.png b/ruqqus/assets/images/badges/recruit-1.png new file mode 100644 index 000000000..4b9873bd0 Binary files /dev/null and b/ruqqus/assets/images/badges/recruit-1.png differ diff --git a/ruqqus/assets/images/badges/recruit-10.png b/ruqqus/assets/images/badges/recruit-10.png new file mode 100644 index 000000000..c754a32b4 Binary files /dev/null and b/ruqqus/assets/images/badges/recruit-10.png differ diff --git a/ruqqus/assets/images/badges/recruit-100.png b/ruqqus/assets/images/badges/recruit-100.png new file mode 100644 index 000000000..694a11b84 Binary files /dev/null and b/ruqqus/assets/images/badges/recruit-100.png differ diff --git a/ruqqus/assets/images/badges/recruit-1000.png b/ruqqus/assets/images/badges/recruit-1000.png new file mode 100644 index 000000000..2000d2d5e Binary files /dev/null and b/ruqqus/assets/images/badges/recruit-1000.png differ diff --git a/ruqqus/assets/images/badges/sitebreaker.png b/ruqqus/assets/images/badges/sitebreaker.png new file mode 100644 index 000000000..c4d19f0ea Binary files /dev/null and b/ruqqus/assets/images/badges/sitebreaker.png differ diff --git a/ruqqus/assets/images/badges/unknowable.png b/ruqqus/assets/images/badges/unknowable.png new file mode 100644 index 000000000..63666bbd0 Binary files /dev/null and b/ruqqus/assets/images/badges/unknowable.png differ diff --git a/ruqqus/assets/images/badges/unsilenced.png b/ruqqus/assets/images/badges/unsilenced.png new file mode 100644 index 000000000..30ca8398c Binary files /dev/null and b/ruqqus/assets/images/badges/unsilenced.png differ diff --git a/ruqqus/assets/images/badges/whitehat.png b/ruqqus/assets/images/badges/whitehat.png new file mode 100644 index 000000000..6b4a23635 Binary files /dev/null and b/ruqqus/assets/images/badges/whitehat.png differ diff --git a/ruqqus/assets/images/badges/year-1.png b/ruqqus/assets/images/badges/year-1.png new file mode 100644 index 000000000..c8879eeae Binary files /dev/null and b/ruqqus/assets/images/badges/year-1.png differ diff --git a/ruqqus/assets/images/blm.png b/ruqqus/assets/images/blm.png new file mode 100644 index 000000000..45a93b03a Binary files /dev/null and b/ruqqus/assets/images/blm.png differ diff --git a/ruqqus/assets/images/browserconfig.xml b/ruqqus/assets/images/browserconfig.xml new file mode 100644 index 000000000..16c282da3 --- /dev/null +++ b/ruqqus/assets/images/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #FF66AC + + + diff --git a/ruqqus/assets/images/default_bg.png b/ruqqus/assets/images/default_bg.png new file mode 100644 index 000000000..133ff9e2b Binary files /dev/null and b/ruqqus/assets/images/default_bg.png differ diff --git a/ruqqus/assets/images/default_thumb_link.png b/ruqqus/assets/images/default_thumb_link.png new file mode 100644 index 000000000..43767287b Binary files /dev/null and b/ruqqus/assets/images/default_thumb_link.png differ diff --git a/ruqqus/assets/images/default_thumb_text.png b/ruqqus/assets/images/default_thumb_text.png new file mode 100644 index 000000000..cce8b65c7 Binary files /dev/null and b/ruqqus/assets/images/default_thumb_text.png differ diff --git a/ruqqus/assets/images/default_thumb_yt.png b/ruqqus/assets/images/default_thumb_yt.png new file mode 100644 index 000000000..1baf6df27 Binary files /dev/null and b/ruqqus/assets/images/default_thumb_yt.png differ diff --git a/ruqqus/assets/images/defaultpictures/1.png b/ruqqus/assets/images/defaultpictures/1.png new file mode 100644 index 000000000..a77762b47 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/1.png differ diff --git a/ruqqus/assets/images/defaultpictures/10.png b/ruqqus/assets/images/defaultpictures/10.png new file mode 100644 index 000000000..698a072cf Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/10.png differ diff --git a/ruqqus/assets/images/defaultpictures/11.png b/ruqqus/assets/images/defaultpictures/11.png new file mode 100644 index 000000000..419b7f234 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/11.png differ diff --git a/ruqqus/assets/images/defaultpictures/12.png b/ruqqus/assets/images/defaultpictures/12.png new file mode 100644 index 000000000..777eedd59 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/12.png differ diff --git a/ruqqus/assets/images/defaultpictures/13.png b/ruqqus/assets/images/defaultpictures/13.png new file mode 100644 index 000000000..888bb4cae Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/13.png differ diff --git a/ruqqus/assets/images/defaultpictures/14.png b/ruqqus/assets/images/defaultpictures/14.png new file mode 100644 index 000000000..e2249eff9 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/14.png differ diff --git a/ruqqus/assets/images/defaultpictures/15.png b/ruqqus/assets/images/defaultpictures/15.png new file mode 100644 index 000000000..56159cedd Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/15.png differ diff --git a/ruqqus/assets/images/defaultpictures/16.png b/ruqqus/assets/images/defaultpictures/16.png new file mode 100644 index 000000000..3069b6026 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/16.png differ diff --git a/ruqqus/assets/images/defaultpictures/17.png b/ruqqus/assets/images/defaultpictures/17.png new file mode 100644 index 000000000..ef25e384e Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/17.png differ diff --git a/ruqqus/assets/images/defaultpictures/18.png b/ruqqus/assets/images/defaultpictures/18.png new file mode 100644 index 000000000..e5a06d1e9 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/18.png differ diff --git a/ruqqus/assets/images/defaultpictures/19.png b/ruqqus/assets/images/defaultpictures/19.png new file mode 100644 index 000000000..5f49ed917 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/19.png differ diff --git a/ruqqus/assets/images/defaultpictures/2.png b/ruqqus/assets/images/defaultpictures/2.png new file mode 100644 index 000000000..e1980c877 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/2.png differ diff --git a/ruqqus/assets/images/defaultpictures/20.png b/ruqqus/assets/images/defaultpictures/20.png new file mode 100644 index 000000000..2bfa8e7b6 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/20.png differ diff --git a/ruqqus/assets/images/defaultpictures/21.png b/ruqqus/assets/images/defaultpictures/21.png new file mode 100644 index 000000000..8024fa868 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/21.png differ diff --git a/ruqqus/assets/images/defaultpictures/22.png b/ruqqus/assets/images/defaultpictures/22.png new file mode 100644 index 000000000..80b8e80af Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/22.png differ diff --git a/ruqqus/assets/images/defaultpictures/23.png b/ruqqus/assets/images/defaultpictures/23.png new file mode 100644 index 000000000..031630a76 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/23.png differ diff --git a/ruqqus/assets/images/defaultpictures/24.png b/ruqqus/assets/images/defaultpictures/24.png new file mode 100644 index 000000000..f99e8036d Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/24.png differ diff --git a/ruqqus/assets/images/defaultpictures/25.png b/ruqqus/assets/images/defaultpictures/25.png new file mode 100644 index 000000000..eb1862004 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/25.png differ diff --git a/ruqqus/assets/images/defaultpictures/26.png b/ruqqus/assets/images/defaultpictures/26.png new file mode 100644 index 000000000..7781359c3 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/26.png differ diff --git a/ruqqus/assets/images/defaultpictures/27.png b/ruqqus/assets/images/defaultpictures/27.png new file mode 100644 index 000000000..d8274efb5 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/27.png differ diff --git a/ruqqus/assets/images/defaultpictures/28.png b/ruqqus/assets/images/defaultpictures/28.png new file mode 100644 index 000000000..20d1dbe5e Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/28.png differ diff --git a/ruqqus/assets/images/defaultpictures/29.png b/ruqqus/assets/images/defaultpictures/29.png new file mode 100644 index 000000000..6214c4988 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/29.png differ diff --git a/ruqqus/assets/images/defaultpictures/3.png b/ruqqus/assets/images/defaultpictures/3.png new file mode 100644 index 000000000..36eadb73c Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/3.png differ diff --git a/ruqqus/assets/images/defaultpictures/30.png b/ruqqus/assets/images/defaultpictures/30.png new file mode 100644 index 000000000..09e4f1b3e Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/30.png differ diff --git a/ruqqus/assets/images/defaultpictures/31.png b/ruqqus/assets/images/defaultpictures/31.png new file mode 100644 index 000000000..d138f13c1 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/31.png differ diff --git a/ruqqus/assets/images/defaultpictures/32.png b/ruqqus/assets/images/defaultpictures/32.png new file mode 100644 index 000000000..3321c3011 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/32.png differ diff --git a/ruqqus/assets/images/defaultpictures/33.png b/ruqqus/assets/images/defaultpictures/33.png new file mode 100644 index 000000000..676ad5fa9 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/33.png differ diff --git a/ruqqus/assets/images/defaultpictures/34.png b/ruqqus/assets/images/defaultpictures/34.png new file mode 100644 index 000000000..bb1835caa Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/34.png differ diff --git a/ruqqus/assets/images/defaultpictures/35.png b/ruqqus/assets/images/defaultpictures/35.png new file mode 100644 index 000000000..f92aaf33b Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/35.png differ diff --git a/ruqqus/assets/images/defaultpictures/36.png b/ruqqus/assets/images/defaultpictures/36.png new file mode 100644 index 000000000..a3d9aa2aa Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/36.png differ diff --git a/ruqqus/assets/images/defaultpictures/37.png b/ruqqus/assets/images/defaultpictures/37.png new file mode 100644 index 000000000..d7793ac86 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/37.png differ diff --git a/ruqqus/assets/images/defaultpictures/38.png b/ruqqus/assets/images/defaultpictures/38.png new file mode 100644 index 000000000..8910ae252 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/38.png differ diff --git a/ruqqus/assets/images/defaultpictures/39.png b/ruqqus/assets/images/defaultpictures/39.png new file mode 100644 index 000000000..25263936b Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/39.png differ diff --git a/ruqqus/assets/images/defaultpictures/4.png b/ruqqus/assets/images/defaultpictures/4.png new file mode 100644 index 000000000..72439035d Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/4.png differ diff --git a/ruqqus/assets/images/defaultpictures/40.png b/ruqqus/assets/images/defaultpictures/40.png new file mode 100644 index 000000000..425f1421b Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/40.png differ diff --git a/ruqqus/assets/images/defaultpictures/41.png b/ruqqus/assets/images/defaultpictures/41.png new file mode 100644 index 000000000..b241d9f20 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/41.png differ diff --git a/ruqqus/assets/images/defaultpictures/42.png b/ruqqus/assets/images/defaultpictures/42.png new file mode 100644 index 000000000..0b35f4c85 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/42.png differ diff --git a/ruqqus/assets/images/defaultpictures/43.png b/ruqqus/assets/images/defaultpictures/43.png new file mode 100644 index 000000000..7e83fce7e Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/43.png differ diff --git a/ruqqus/assets/images/defaultpictures/44.png b/ruqqus/assets/images/defaultpictures/44.png new file mode 100644 index 000000000..fcaed67c8 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/44.png differ diff --git a/ruqqus/assets/images/defaultpictures/45.png b/ruqqus/assets/images/defaultpictures/45.png new file mode 100644 index 000000000..fe61cdad1 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/45.png differ diff --git a/ruqqus/assets/images/defaultpictures/46.png b/ruqqus/assets/images/defaultpictures/46.png new file mode 100644 index 000000000..24d41593e Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/46.png differ diff --git a/ruqqus/assets/images/defaultpictures/47.png b/ruqqus/assets/images/defaultpictures/47.png new file mode 100644 index 000000000..d8aa995ab Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/47.png differ diff --git a/ruqqus/assets/images/defaultpictures/48.png b/ruqqus/assets/images/defaultpictures/48.png new file mode 100644 index 000000000..391ee8f34 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/48.png differ diff --git a/ruqqus/assets/images/defaultpictures/49.png b/ruqqus/assets/images/defaultpictures/49.png new file mode 100644 index 000000000..8122f36d8 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/49.png differ diff --git a/ruqqus/assets/images/defaultpictures/5.png b/ruqqus/assets/images/defaultpictures/5.png new file mode 100644 index 000000000..2f6081f72 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/5.png differ diff --git a/ruqqus/assets/images/defaultpictures/50.png b/ruqqus/assets/images/defaultpictures/50.png new file mode 100644 index 000000000..03264a6a9 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/50.png differ diff --git a/ruqqus/assets/images/defaultpictures/6.png b/ruqqus/assets/images/defaultpictures/6.png new file mode 100644 index 000000000..15464de63 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/6.png differ diff --git a/ruqqus/assets/images/defaultpictures/7.png b/ruqqus/assets/images/defaultpictures/7.png new file mode 100644 index 000000000..e49589163 Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/7.png differ diff --git a/ruqqus/assets/images/defaultpictures/8.png b/ruqqus/assets/images/defaultpictures/8.png new file mode 100644 index 000000000..2d0b35bcd Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/8.png differ diff --git a/ruqqus/assets/images/defaultpictures/9.png b/ruqqus/assets/images/defaultpictures/9.png new file mode 100644 index 000000000..65078aa7b Binary files /dev/null and b/ruqqus/assets/images/defaultpictures/9.png differ diff --git a/ruqqus/assets/images/drama.gif b/ruqqus/assets/images/drama.gif new file mode 100644 index 000000000..334582395 Binary files /dev/null and b/ruqqus/assets/images/drama.gif differ diff --git a/ruqqus/assets/images/dramapreview.png b/ruqqus/assets/images/dramapreview.png new file mode 100644 index 000000000..0b153cfb3 Binary files /dev/null and b/ruqqus/assets/images/dramapreview.png differ diff --git a/ruqqus/assets/images/emojis/2thumbsup.gif b/ruqqus/assets/images/emojis/2thumbsup.gif new file mode 100644 index 000000000..a652a6676 Binary files /dev/null and b/ruqqus/assets/images/emojis/2thumbsup.gif differ diff --git a/ruqqus/assets/images/emojis/D.gif b/ruqqus/assets/images/emojis/D.gif new file mode 100644 index 000000000..0ac728a8c Binary files /dev/null and b/ruqqus/assets/images/emojis/D.gif differ diff --git a/ruqqus/assets/images/emojis/XD.gif b/ruqqus/assets/images/emojis/XD.gif new file mode 100644 index 000000000..58305a17c Binary files /dev/null and b/ruqqus/assets/images/emojis/XD.gif differ diff --git a/ruqqus/assets/images/emojis/abusivewife.gif b/ruqqus/assets/images/emojis/abusivewife.gif new file mode 100644 index 000000000..08ee2ae5c Binary files /dev/null and b/ruqqus/assets/images/emojis/abusivewife.gif differ diff --git a/ruqqus/assets/images/emojis/aliendj.gif b/ruqqus/assets/images/emojis/aliendj.gif new file mode 100644 index 000000000..400c8d8c3 Binary files /dev/null and b/ruqqus/assets/images/emojis/aliendj.gif differ diff --git a/ruqqus/assets/images/emojis/ambulance.gif b/ruqqus/assets/images/emojis/ambulance.gif new file mode 100644 index 000000000..127ffc8d4 Binary files /dev/null and b/ruqqus/assets/images/emojis/ambulance.gif differ diff --git a/ruqqus/assets/images/emojis/ancap.gif b/ruqqus/assets/images/emojis/ancap.gif new file mode 100644 index 000000000..37b1e5107 Binary files /dev/null and b/ruqqus/assets/images/emojis/ancap.gif differ diff --git a/ruqqus/assets/images/emojis/angry.gif b/ruqqus/assets/images/emojis/angry.gif new file mode 100644 index 000000000..08b5bda7b Binary files /dev/null and b/ruqqus/assets/images/emojis/angry.gif differ diff --git a/ruqqus/assets/images/emojis/angrywhip.gif b/ruqqus/assets/images/emojis/angrywhip.gif new file mode 100644 index 000000000..059ff58e2 Binary files /dev/null and b/ruqqus/assets/images/emojis/angrywhip.gif differ diff --git a/ruqqus/assets/images/emojis/animesexual.gif b/ruqqus/assets/images/emojis/animesexual.gif new file mode 100644 index 000000000..5d681f557 Binary files /dev/null and b/ruqqus/assets/images/emojis/animesexual.gif differ diff --git a/ruqqus/assets/images/emojis/argue.gif b/ruqqus/assets/images/emojis/argue.gif new file mode 100644 index 000000000..c579fa4d1 Binary files /dev/null and b/ruqqus/assets/images/emojis/argue.gif differ diff --git a/ruqqus/assets/images/emojis/aroused.gif b/ruqqus/assets/images/emojis/aroused.gif new file mode 100644 index 000000000..3d4f065d8 Binary files /dev/null and b/ruqqus/assets/images/emojis/aroused.gif differ diff --git a/ruqqus/assets/images/emojis/ashamed.gif b/ruqqus/assets/images/emojis/ashamed.gif new file mode 100644 index 000000000..5d7f33cf3 Binary files /dev/null and b/ruqqus/assets/images/emojis/ashamed.gif differ diff --git a/ruqqus/assets/images/emojis/badass.gif b/ruqqus/assets/images/emojis/badass.gif new file mode 100644 index 000000000..4e8b31ccc Binary files /dev/null and b/ruqqus/assets/images/emojis/badass.gif differ diff --git a/ruqqus/assets/images/emojis/banana.gif b/ruqqus/assets/images/emojis/banana.gif new file mode 100644 index 000000000..00766f865 Binary files /dev/null and b/ruqqus/assets/images/emojis/banana.gif differ diff --git a/ruqqus/assets/images/emojis/band.gif b/ruqqus/assets/images/emojis/band.gif new file mode 100644 index 000000000..83aa95869 Binary files /dev/null and b/ruqqus/assets/images/emojis/band.gif differ diff --git a/ruqqus/assets/images/emojis/banghead.gif b/ruqqus/assets/images/emojis/banghead.gif new file mode 100644 index 000000000..37b73e5c1 Binary files /dev/null and b/ruqqus/assets/images/emojis/banghead.gif differ diff --git a/ruqqus/assets/images/emojis/bardfinn.gif b/ruqqus/assets/images/emojis/bardfinn.gif new file mode 100644 index 000000000..7d3d5e9ce Binary files /dev/null and b/ruqqus/assets/images/emojis/bardfinn.gif differ diff --git a/ruqqus/assets/images/emojis/batman.gif b/ruqqus/assets/images/emojis/batman.gif new file mode 100644 index 000000000..34538e0fa Binary files /dev/null and b/ruqqus/assets/images/emojis/batman.gif differ diff --git a/ruqqus/assets/images/emojis/bigeyes.gif b/ruqqus/assets/images/emojis/bigeyes.gif new file mode 100644 index 000000000..78acb66ac Binary files /dev/null and b/ruqqus/assets/images/emojis/bigeyes.gif differ diff --git a/ruqqus/assets/images/emojis/bitchplease.gif b/ruqqus/assets/images/emojis/bitchplease.gif new file mode 100644 index 000000000..cbe4bfd8c Binary files /dev/null and b/ruqqus/assets/images/emojis/bitchplease.gif differ diff --git a/ruqqus/assets/images/emojis/bite.gif b/ruqqus/assets/images/emojis/bite.gif new file mode 100644 index 000000000..b7eedd0dc Binary files /dev/null and b/ruqqus/assets/images/emojis/bite.gif differ diff --git a/ruqqus/assets/images/emojis/blacknation.gif b/ruqqus/assets/images/emojis/blacknation.gif new file mode 100644 index 000000000..391f165c5 Binary files /dev/null and b/ruqqus/assets/images/emojis/blacknation.gif differ diff --git a/ruqqus/assets/images/emojis/blind.gif b/ruqqus/assets/images/emojis/blind.gif new file mode 100644 index 000000000..dbfb4d8ca Binary files /dev/null and b/ruqqus/assets/images/emojis/blind.gif differ diff --git a/ruqqus/assets/images/emojis/blm.gif b/ruqqus/assets/images/emojis/blm.gif new file mode 100644 index 000000000..b9d21c419 Binary files /dev/null and b/ruqqus/assets/images/emojis/blm.gif differ diff --git a/ruqqus/assets/images/emojis/bloomer.gif b/ruqqus/assets/images/emojis/bloomer.gif new file mode 100644 index 000000000..eba542514 Binary files /dev/null and b/ruqqus/assets/images/emojis/bloomer.gif differ diff --git a/ruqqus/assets/images/emojis/blowkiss.gif b/ruqqus/assets/images/emojis/blowkiss.gif new file mode 100644 index 000000000..fad790fcb Binary files /dev/null and b/ruqqus/assets/images/emojis/blowkiss.gif differ diff --git a/ruqqus/assets/images/emojis/blueline.gif b/ruqqus/assets/images/emojis/blueline.gif new file mode 100644 index 000000000..e82ac4719 Binary files /dev/null and b/ruqqus/assets/images/emojis/blueline.gif differ diff --git a/ruqqus/assets/images/emojis/blush.gif b/ruqqus/assets/images/emojis/blush.gif new file mode 100644 index 000000000..83c218efe Binary files /dev/null and b/ruqqus/assets/images/emojis/blush.gif differ diff --git a/ruqqus/assets/images/emojis/bong.gif b/ruqqus/assets/images/emojis/bong.gif new file mode 100644 index 000000000..493ad2faf Binary files /dev/null and b/ruqqus/assets/images/emojis/bong.gif differ diff --git a/ruqqus/assets/images/emojis/boomer.gif b/ruqqus/assets/images/emojis/boomer.gif new file mode 100644 index 000000000..63c9ccfdf Binary files /dev/null and b/ruqqus/assets/images/emojis/boomer.gif differ diff --git a/ruqqus/assets/images/emojis/boomermonster.gif b/ruqqus/assets/images/emojis/boomermonster.gif new file mode 100644 index 000000000..36d6d401e Binary files /dev/null and b/ruqqus/assets/images/emojis/boomermonster.gif differ diff --git a/ruqqus/assets/images/emojis/bounce.gif b/ruqqus/assets/images/emojis/bounce.gif new file mode 100644 index 000000000..c28569c80 Binary files /dev/null and b/ruqqus/assets/images/emojis/bounce.gif differ diff --git a/ruqqus/assets/images/emojis/bow.gif b/ruqqus/assets/images/emojis/bow.gif new file mode 100644 index 000000000..2f02a03f9 Binary files /dev/null and b/ruqqus/assets/images/emojis/bow.gif differ diff --git a/ruqqus/assets/images/emojis/brainletbush.gif b/ruqqus/assets/images/emojis/brainletbush.gif new file mode 100644 index 000000000..df7fce557 Binary files /dev/null and b/ruqqus/assets/images/emojis/brainletbush.gif differ diff --git a/ruqqus/assets/images/emojis/brainletcaved.gif b/ruqqus/assets/images/emojis/brainletcaved.gif new file mode 100644 index 000000000..7a71d60a7 Binary files /dev/null and b/ruqqus/assets/images/emojis/brainletcaved.gif differ diff --git a/ruqqus/assets/images/emojis/brainletchair.gif b/ruqqus/assets/images/emojis/brainletchair.gif new file mode 100644 index 000000000..07d36af43 Binary files /dev/null and b/ruqqus/assets/images/emojis/brainletchair.gif differ diff --git a/ruqqus/assets/images/emojis/brainletchest.gif b/ruqqus/assets/images/emojis/brainletchest.gif new file mode 100644 index 000000000..3dfc28a83 Binary files /dev/null and b/ruqqus/assets/images/emojis/brainletchest.gif differ diff --git a/ruqqus/assets/images/emojis/brainletmaga.gif b/ruqqus/assets/images/emojis/brainletmaga.gif new file mode 100644 index 000000000..aae73b500 Binary files /dev/null and b/ruqqus/assets/images/emojis/brainletmaga.gif differ diff --git a/ruqqus/assets/images/emojis/brainletpit.gif b/ruqqus/assets/images/emojis/brainletpit.gif new file mode 100644 index 000000000..a0371f29a Binary files /dev/null and b/ruqqus/assets/images/emojis/brainletpit.gif differ diff --git a/ruqqus/assets/images/emojis/breakheart.gif b/ruqqus/assets/images/emojis/breakheart.gif new file mode 100644 index 000000000..131d65bc7 Binary files /dev/null and b/ruqqus/assets/images/emojis/breakheart.gif differ diff --git a/ruqqus/assets/images/emojis/bs.gif b/ruqqus/assets/images/emojis/bs.gif new file mode 100644 index 000000000..cb22be60f Binary files /dev/null and b/ruqqus/assets/images/emojis/bs.gif differ diff --git a/ruqqus/assets/images/emojis/cartwheel.gif b/ruqqus/assets/images/emojis/cartwheel.gif new file mode 100644 index 000000000..e21bd83eb Binary files /dev/null and b/ruqqus/assets/images/emojis/cartwheel.gif differ diff --git a/ruqqus/assets/images/emojis/cat.gif b/ruqqus/assets/images/emojis/cat.gif new file mode 100644 index 000000000..2bf72a431 Binary files /dev/null and b/ruqqus/assets/images/emojis/cat.gif differ diff --git a/ruqqus/assets/images/emojis/celebrate.gif b/ruqqus/assets/images/emojis/celebrate.gif new file mode 100644 index 000000000..2acf290a4 Binary files /dev/null and b/ruqqus/assets/images/emojis/celebrate.gif differ diff --git a/ruqqus/assets/images/emojis/cerealguypart2.gif b/ruqqus/assets/images/emojis/cerealguypart2.gif new file mode 100644 index 000000000..730ab407c Binary files /dev/null and b/ruqqus/assets/images/emojis/cerealguypart2.gif differ diff --git a/ruqqus/assets/images/emojis/chad.gif b/ruqqus/assets/images/emojis/chad.gif new file mode 100644 index 000000000..fe319e3b5 Binary files /dev/null and b/ruqqus/assets/images/emojis/chad.gif differ diff --git a/ruqqus/assets/images/emojis/chadarab.gif b/ruqqus/assets/images/emojis/chadarab.gif new file mode 100644 index 000000000..2d42dfd12 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadarab.gif differ diff --git a/ruqqus/assets/images/emojis/chadasian.gif b/ruqqus/assets/images/emojis/chadasian.gif new file mode 100644 index 000000000..aacf0d2a8 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadasian.gif differ diff --git a/ruqqus/assets/images/emojis/chadblack.gif b/ruqqus/assets/images/emojis/chadblack.gif new file mode 100644 index 000000000..b1ab1edb7 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadblack.gif differ diff --git a/ruqqus/assets/images/emojis/chadjesus.gif b/ruqqus/assets/images/emojis/chadjesus.gif new file mode 100644 index 000000000..e42ef8ec3 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadjesus.gif differ diff --git a/ruqqus/assets/images/emojis/chadjew.gif b/ruqqus/assets/images/emojis/chadjew.gif new file mode 100644 index 000000000..9a59d2876 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadjew.gif differ diff --git a/ruqqus/assets/images/emojis/chadjihadi.gif b/ruqqus/assets/images/emojis/chadjihadi.gif new file mode 100644 index 000000000..24440adbb Binary files /dev/null and b/ruqqus/assets/images/emojis/chadjihadi.gif differ diff --git a/ruqqus/assets/images/emojis/chadlatino.gif b/ruqqus/assets/images/emojis/chadlatino.gif new file mode 100644 index 000000000..3072b15d4 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadlatino.gif differ diff --git a/ruqqus/assets/images/emojis/chadlibleft.gif b/ruqqus/assets/images/emojis/chadlibleft.gif new file mode 100644 index 000000000..a36d0cc24 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadlibleft.gif differ diff --git a/ruqqus/assets/images/emojis/chadnordic.gif b/ruqqus/assets/images/emojis/chadnordic.gif new file mode 100644 index 000000000..d24011b58 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadnordic.gif differ diff --git a/ruqqus/assets/images/emojis/chadsikh.gif b/ruqqus/assets/images/emojis/chadsikh.gif new file mode 100644 index 000000000..28ae09b51 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadsikh.gif differ diff --git a/ruqqus/assets/images/emojis/chadusa.gif b/ruqqus/assets/images/emojis/chadusa.gif new file mode 100644 index 000000000..0176ad8c6 Binary files /dev/null and b/ruqqus/assets/images/emojis/chadusa.gif differ diff --git a/ruqqus/assets/images/emojis/chainsaw.gif b/ruqqus/assets/images/emojis/chainsaw.gif new file mode 100644 index 000000000..ca2e66930 Binary files /dev/null and b/ruqqus/assets/images/emojis/chainsaw.gif differ diff --git a/ruqqus/assets/images/emojis/challengeaccepted.gif b/ruqqus/assets/images/emojis/challengeaccepted.gif new file mode 100644 index 000000000..1c78d3e51 Binary files /dev/null and b/ruqqus/assets/images/emojis/challengeaccepted.gif differ diff --git a/ruqqus/assets/images/emojis/cheers.gif b/ruqqus/assets/images/emojis/cheers.gif new file mode 100644 index 000000000..7602c4436 Binary files /dev/null and b/ruqqus/assets/images/emojis/cheers.gif differ diff --git a/ruqqus/assets/images/emojis/clap.gif b/ruqqus/assets/images/emojis/clap.gif new file mode 100644 index 000000000..e64a1620a Binary files /dev/null and b/ruqqus/assets/images/emojis/clap.gif differ diff --git a/ruqqus/assets/images/emojis/cold.gif b/ruqqus/assets/images/emojis/cold.gif new file mode 100644 index 000000000..67567a138 Binary files /dev/null and b/ruqqus/assets/images/emojis/cold.gif differ diff --git a/ruqqus/assets/images/emojis/confused.gif b/ruqqus/assets/images/emojis/confused.gif new file mode 100644 index 000000000..01a24b354 Binary files /dev/null and b/ruqqus/assets/images/emojis/confused.gif differ diff --git a/ruqqus/assets/images/emojis/contentiouscereal.gif b/ruqqus/assets/images/emojis/contentiouscereal.gif new file mode 100644 index 000000000..4e361289f Binary files /dev/null and b/ruqqus/assets/images/emojis/contentiouscereal.gif differ diff --git a/ruqqus/assets/images/emojis/coomer.gif b/ruqqus/assets/images/emojis/coomer.gif new file mode 100644 index 000000000..c98938c69 Binary files /dev/null and b/ruqqus/assets/images/emojis/coomer.gif differ diff --git a/ruqqus/assets/images/emojis/crazyeyes.gif b/ruqqus/assets/images/emojis/crazyeyes.gif new file mode 100644 index 000000000..cb88a531b Binary files /dev/null and b/ruqqus/assets/images/emojis/crazyeyes.gif differ diff --git a/ruqqus/assets/images/emojis/cry.gif b/ruqqus/assets/images/emojis/cry.gif new file mode 100644 index 000000000..697c0a1b6 Binary files /dev/null and b/ruqqus/assets/images/emojis/cry.gif differ diff --git a/ruqqus/assets/images/emojis/cryingatcuteness.gif b/ruqqus/assets/images/emojis/cryingatcuteness.gif new file mode 100644 index 000000000..3d6e89459 Binary files /dev/null and b/ruqqus/assets/images/emojis/cryingatcuteness.gif differ diff --git a/ruqqus/assets/images/emojis/cthulhu.gif b/ruqqus/assets/images/emojis/cthulhu.gif new file mode 100644 index 000000000..ce128fefa Binary files /dev/null and b/ruqqus/assets/images/emojis/cthulhu.gif differ diff --git a/ruqqus/assets/images/emojis/cute.gif b/ruqqus/assets/images/emojis/cute.gif new file mode 100644 index 000000000..a8633acce Binary files /dev/null and b/ruqqus/assets/images/emojis/cute.gif differ diff --git a/ruqqus/assets/images/emojis/daydream.gif b/ruqqus/assets/images/emojis/daydream.gif new file mode 100644 index 000000000..e89eb8def Binary files /dev/null and b/ruqqus/assets/images/emojis/daydream.gif differ diff --git a/ruqqus/assets/images/emojis/ddr.gif b/ruqqus/assets/images/emojis/ddr.gif new file mode 100644 index 000000000..c1ff6291b Binary files /dev/null and b/ruqqus/assets/images/emojis/ddr.gif differ diff --git a/ruqqus/assets/images/emojis/deadpool.gif b/ruqqus/assets/images/emojis/deadpool.gif new file mode 100644 index 000000000..646953975 Binary files /dev/null and b/ruqqus/assets/images/emojis/deadpool.gif differ diff --git a/ruqqus/assets/images/emojis/derp.gif b/ruqqus/assets/images/emojis/derp.gif new file mode 100644 index 000000000..8e203f112 Binary files /dev/null and b/ruqqus/assets/images/emojis/derp.gif differ diff --git a/ruqqus/assets/images/emojis/derpcornsyrup.gif b/ruqqus/assets/images/emojis/derpcornsyrup.gif new file mode 100644 index 000000000..ada4b904e Binary files /dev/null and b/ruqqus/assets/images/emojis/derpcornsyrup.gif differ diff --git a/ruqqus/assets/images/emojis/derpcrying.gif b/ruqqus/assets/images/emojis/derpcrying.gif new file mode 100644 index 000000000..0aa5b2a7c Binary files /dev/null and b/ruqqus/assets/images/emojis/derpcrying.gif differ diff --git a/ruqqus/assets/images/emojis/derpcute.gif b/ruqqus/assets/images/emojis/derpcute.gif new file mode 100644 index 000000000..4b3634268 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpcute.gif differ diff --git a/ruqqus/assets/images/emojis/derpdumb.gif b/ruqqus/assets/images/emojis/derpdumb.gif new file mode 100644 index 000000000..4ae569791 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpdumb.gif differ diff --git a/ruqqus/assets/images/emojis/derpeuphoria.gif b/ruqqus/assets/images/emojis/derpeuphoria.gif new file mode 100644 index 000000000..02f2af711 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpeuphoria.gif differ diff --git a/ruqqus/assets/images/emojis/derpinahd.gif b/ruqqus/assets/images/emojis/derpinahd.gif new file mode 100644 index 000000000..b85bc67f9 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpinahd.gif differ diff --git a/ruqqus/assets/images/emojis/derpinapokerface.gif b/ruqqus/assets/images/emojis/derpinapokerface.gif new file mode 100644 index 000000000..b0d1d851f Binary files /dev/null and b/ruqqus/assets/images/emojis/derpinapokerface.gif differ diff --git a/ruqqus/assets/images/emojis/derpinasnickering.gif b/ruqqus/assets/images/emojis/derpinasnickering.gif new file mode 100644 index 000000000..ee4c254fe Binary files /dev/null and b/ruqqus/assets/images/emojis/derpinasnickering.gif differ diff --git a/ruqqus/assets/images/emojis/derpprocessing.gif b/ruqqus/assets/images/emojis/derpprocessing.gif new file mode 100644 index 000000000..6ed343930 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpprocessing.gif differ diff --git a/ruqqus/assets/images/emojis/derprealization.gif b/ruqqus/assets/images/emojis/derprealization.gif new file mode 100644 index 000000000..695190799 Binary files /dev/null and b/ruqqus/assets/images/emojis/derprealization.gif differ diff --git a/ruqqus/assets/images/emojis/derpsnickering.gif b/ruqqus/assets/images/emojis/derpsnickering.gif new file mode 100644 index 000000000..f6cf8b170 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpsnickering.gif differ diff --git a/ruqqus/assets/images/emojis/derptalking.gif b/ruqqus/assets/images/emojis/derptalking.gif new file mode 100644 index 000000000..ee9d7c10e Binary files /dev/null and b/ruqqus/assets/images/emojis/derptalking.gif differ diff --git a/ruqqus/assets/images/emojis/derpthinking.gif b/ruqqus/assets/images/emojis/derpthinking.gif new file mode 100644 index 000000000..99b3842fa Binary files /dev/null and b/ruqqus/assets/images/emojis/derpthinking.gif differ diff --git a/ruqqus/assets/images/emojis/derpthumbsup.gif b/ruqqus/assets/images/emojis/derpthumbsup.gif new file mode 100644 index 000000000..2ea199d83 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpthumbsup.gif differ diff --git a/ruqqus/assets/images/emojis/derpunimpressed.gif b/ruqqus/assets/images/emojis/derpunimpressed.gif new file mode 100644 index 000000000..c4729d96f Binary files /dev/null and b/ruqqus/assets/images/emojis/derpunimpressed.gif differ diff --git a/ruqqus/assets/images/emojis/derpwhy.gif b/ruqqus/assets/images/emojis/derpwhy.gif new file mode 100644 index 000000000..b58d0bb00 Binary files /dev/null and b/ruqqus/assets/images/emojis/derpwhy.gif differ diff --git a/ruqqus/assets/images/emojis/devilsmile.gif b/ruqqus/assets/images/emojis/devilsmile.gif new file mode 100644 index 000000000..8c386ebfc Binary files /dev/null and b/ruqqus/assets/images/emojis/devilsmile.gif differ diff --git a/ruqqus/assets/images/emojis/diddle.gif b/ruqqus/assets/images/emojis/diddle.gif new file mode 100644 index 000000000..6ab74996d Binary files /dev/null and b/ruqqus/assets/images/emojis/diddle.gif differ diff --git a/ruqqus/assets/images/emojis/die.gif b/ruqqus/assets/images/emojis/die.gif new file mode 100644 index 000000000..dd0d55fa4 Binary files /dev/null and b/ruqqus/assets/images/emojis/die.gif differ diff --git a/ruqqus/assets/images/emojis/distress.gif b/ruqqus/assets/images/emojis/distress.gif new file mode 100644 index 000000000..bb28be7de Binary files /dev/null and b/ruqqus/assets/images/emojis/distress.gif differ diff --git a/ruqqus/assets/images/emojis/disturbing.gif b/ruqqus/assets/images/emojis/disturbing.gif new file mode 100644 index 000000000..9160c50fc Binary files /dev/null and b/ruqqus/assets/images/emojis/disturbing.gif differ diff --git a/ruqqus/assets/images/emojis/dizzy.gif b/ruqqus/assets/images/emojis/dizzy.gif new file mode 100644 index 000000000..476e5885b Binary files /dev/null and b/ruqqus/assets/images/emojis/dizzy.gif differ diff --git a/ruqqus/assets/images/emojis/domo.gif b/ruqqus/assets/images/emojis/domo.gif new file mode 100644 index 000000000..7f5cfa9db Binary files /dev/null and b/ruqqus/assets/images/emojis/domo.gif differ diff --git a/ruqqus/assets/images/emojis/donotwant.gif b/ruqqus/assets/images/emojis/donotwant.gif new file mode 100644 index 000000000..fa12dcff6 Binary files /dev/null and b/ruqqus/assets/images/emojis/donotwant.gif differ diff --git a/ruqqus/assets/images/emojis/doomer.gif b/ruqqus/assets/images/emojis/doomer.gif new file mode 100644 index 000000000..3a235f8bf Binary files /dev/null and b/ruqqus/assets/images/emojis/doomer.gif differ diff --git a/ruqqus/assets/images/emojis/doomerfront.gif b/ruqqus/assets/images/emojis/doomerfront.gif new file mode 100644 index 000000000..f7977f4be Binary files /dev/null and b/ruqqus/assets/images/emojis/doomerfront.gif differ diff --git a/ruqqus/assets/images/emojis/doomergirl.gif b/ruqqus/assets/images/emojis/doomergirl.gif new file mode 100644 index 000000000..c08d6b6e1 Binary files /dev/null and b/ruqqus/assets/images/emojis/doomergirl.gif differ diff --git a/ruqqus/assets/images/emojis/doughboy.gif b/ruqqus/assets/images/emojis/doughboy.gif new file mode 100644 index 000000000..d5f48ad80 Binary files /dev/null and b/ruqqus/assets/images/emojis/doughboy.gif differ diff --git a/ruqqus/assets/images/emojis/dreamgender.gif b/ruqqus/assets/images/emojis/dreamgender.gif new file mode 100644 index 000000000..4f7233d76 Binary files /dev/null and b/ruqqus/assets/images/emojis/dreamgender.gif differ diff --git a/ruqqus/assets/images/emojis/drink.gif b/ruqqus/assets/images/emojis/drink.gif new file mode 100644 index 000000000..ea540a8ad Binary files /dev/null and b/ruqqus/assets/images/emojis/drink.gif differ diff --git a/ruqqus/assets/images/emojis/drool.gif b/ruqqus/assets/images/emojis/drool.gif new file mode 100644 index 000000000..8060dab77 Binary files /dev/null and b/ruqqus/assets/images/emojis/drool.gif differ diff --git a/ruqqus/assets/images/emojis/dudeweedlmao.gif b/ruqqus/assets/images/emojis/dudeweedlmao.gif new file mode 100644 index 000000000..3774616b6 Binary files /dev/null and b/ruqqus/assets/images/emojis/dudeweedlmao.gif differ diff --git a/ruqqus/assets/images/emojis/edward.gif b/ruqqus/assets/images/emojis/edward.gif new file mode 100644 index 000000000..2f3c56c5b Binary files /dev/null and b/ruqqus/assets/images/emojis/edward.gif differ diff --git a/ruqqus/assets/images/emojis/electro.gif b/ruqqus/assets/images/emojis/electro.gif new file mode 100644 index 000000000..766452380 Binary files /dev/null and b/ruqqus/assets/images/emojis/electro.gif differ diff --git a/ruqqus/assets/images/emojis/elephant.gif b/ruqqus/assets/images/emojis/elephant.gif new file mode 100644 index 000000000..5d0b222ce Binary files /dev/null and b/ruqqus/assets/images/emojis/elephant.gif differ diff --git a/ruqqus/assets/images/emojis/embarrassed.gif b/ruqqus/assets/images/emojis/embarrassed.gif new file mode 100644 index 000000000..c529f2521 Binary files /dev/null and b/ruqqus/assets/images/emojis/embarrassed.gif differ diff --git a/ruqqus/assets/images/emojis/emo.gif b/ruqqus/assets/images/emojis/emo.gif new file mode 100644 index 000000000..92421b932 Binary files /dev/null and b/ruqqus/assets/images/emojis/emo.gif differ diff --git a/ruqqus/assets/images/emojis/emo2.gif b/ruqqus/assets/images/emojis/emo2.gif new file mode 100644 index 000000000..6ab5f9656 Binary files /dev/null and b/ruqqus/assets/images/emojis/emo2.gif differ diff --git a/ruqqus/assets/images/emojis/epicfacefeatures.gif b/ruqqus/assets/images/emojis/epicfacefeatures.gif new file mode 100644 index 000000000..ba5607881 Binary files /dev/null and b/ruqqus/assets/images/emojis/epicfacefeatures.gif differ diff --git a/ruqqus/assets/images/emojis/ethot.gif b/ruqqus/assets/images/emojis/ethot.gif new file mode 100644 index 000000000..0b514f65e Binary files /dev/null and b/ruqqus/assets/images/emojis/ethot.gif differ diff --git a/ruqqus/assets/images/emojis/evil.gif b/ruqqus/assets/images/emojis/evil.gif new file mode 100644 index 000000000..983c209b2 Binary files /dev/null and b/ruqqus/assets/images/emojis/evil.gif differ diff --git a/ruqqus/assets/images/emojis/evilclown.gif b/ruqqus/assets/images/emojis/evilclown.gif new file mode 100644 index 000000000..cf5ae3e46 Binary files /dev/null and b/ruqqus/assets/images/emojis/evilclown.gif differ diff --git a/ruqqus/assets/images/emojis/evilgrin.gif b/ruqqus/assets/images/emojis/evilgrin.gif new file mode 100644 index 000000000..88aef1685 Binary files /dev/null and b/ruqqus/assets/images/emojis/evilgrin.gif differ diff --git a/ruqqus/assets/images/emojis/facepalm.gif b/ruqqus/assets/images/emojis/facepalm.gif new file mode 100644 index 000000000..8a094bdff Binary files /dev/null and b/ruqqus/assets/images/emojis/facepalm.gif differ diff --git a/ruqqus/assets/images/emojis/fancywithwine.gif b/ruqqus/assets/images/emojis/fancywithwine.gif new file mode 100644 index 000000000..a82c2bdd4 Binary files /dev/null and b/ruqqus/assets/images/emojis/fancywithwine.gif differ diff --git a/ruqqus/assets/images/emojis/fap.gif b/ruqqus/assets/images/emojis/fap.gif new file mode 100644 index 000000000..a7943f850 Binary files /dev/null and b/ruqqus/assets/images/emojis/fap.gif differ diff --git a/ruqqus/assets/images/emojis/fatbrain.gif b/ruqqus/assets/images/emojis/fatbrain.gif new file mode 100644 index 000000000..6fea68352 Binary files /dev/null and b/ruqqus/assets/images/emojis/fatbrain.gif differ diff --git a/ruqqus/assets/images/emojis/fatpride.gif b/ruqqus/assets/images/emojis/fatpride.gif new file mode 100644 index 000000000..3c6ea11d3 Binary files /dev/null and b/ruqqus/assets/images/emojis/fatpride.gif differ diff --git a/ruqqus/assets/images/emojis/fatpriest.gif b/ruqqus/assets/images/emojis/fatpriest.gif new file mode 100644 index 000000000..03f125f69 Binary files /dev/null and b/ruqqus/assets/images/emojis/fatpriest.gif differ diff --git a/ruqqus/assets/images/emojis/femboy.gif b/ruqqus/assets/images/emojis/femboy.gif new file mode 100644 index 000000000..89493afb9 Binary files /dev/null and b/ruqqus/assets/images/emojis/femboy.gif differ diff --git a/ruqqus/assets/images/emojis/fffffffuuuuuuuuuuuu.gif b/ruqqus/assets/images/emojis/fffffffuuuuuuuuuuuu.gif new file mode 100644 index 000000000..6484ffb20 Binary files /dev/null and b/ruqqus/assets/images/emojis/fffffffuuuuuuuuuuuu.gif differ diff --git a/ruqqus/assets/images/emojis/flamethrower.gif b/ruqqus/assets/images/emojis/flamethrower.gif new file mode 100644 index 000000000..cf50e4690 Binary files /dev/null and b/ruqqus/assets/images/emojis/flamethrower.gif differ diff --git a/ruqqus/assets/images/emojis/flipbird.gif b/ruqqus/assets/images/emojis/flipbird.gif new file mode 100644 index 000000000..383125c76 Binary files /dev/null and b/ruqqus/assets/images/emojis/flipbird.gif differ diff --git a/ruqqus/assets/images/emojis/flipthetable.gif b/ruqqus/assets/images/emojis/flipthetable.gif new file mode 100644 index 000000000..0db642f2c Binary files /dev/null and b/ruqqus/assets/images/emojis/flipthetable.gif differ diff --git a/ruqqus/assets/images/emojis/flirt.gif b/ruqqus/assets/images/emojis/flirt.gif new file mode 100644 index 000000000..05de60c4c Binary files /dev/null and b/ruqqus/assets/images/emojis/flirt.gif differ diff --git a/ruqqus/assets/images/emojis/foreveralone.gif b/ruqqus/assets/images/emojis/foreveralone.gif new file mode 100644 index 000000000..4d770e5b4 Binary files /dev/null and b/ruqqus/assets/images/emojis/foreveralone.gif differ diff --git a/ruqqus/assets/images/emojis/foreveralonehappy.gif b/ruqqus/assets/images/emojis/foreveralonehappy.gif new file mode 100644 index 000000000..7a2be02b1 Binary files /dev/null and b/ruqqus/assets/images/emojis/foreveralonehappy.gif differ diff --git a/ruqqus/assets/images/emojis/frown.gif b/ruqqus/assets/images/emojis/frown.gif new file mode 100644 index 000000000..55ceeb497 Binary files /dev/null and b/ruqqus/assets/images/emojis/frown.gif differ diff --git a/ruqqus/assets/images/emojis/gasp.gif b/ruqqus/assets/images/emojis/gasp.gif new file mode 100644 index 000000000..fff268f8a Binary files /dev/null and b/ruqqus/assets/images/emojis/gasp.gif differ diff --git a/ruqqus/assets/images/emojis/glomp.gif b/ruqqus/assets/images/emojis/glomp.gif new file mode 100644 index 000000000..c8d578f43 Binary files /dev/null and b/ruqqus/assets/images/emojis/glomp.gif differ diff --git a/ruqqus/assets/images/emojis/go.gif b/ruqqus/assets/images/emojis/go.gif new file mode 100644 index 000000000..62a09254e Binary files /dev/null and b/ruqqus/assets/images/emojis/go.gif differ diff --git a/ruqqus/assets/images/emojis/gogetter.gif b/ruqqus/assets/images/emojis/gogetter.gif new file mode 100644 index 000000000..4b11aa61a Binary files /dev/null and b/ruqqus/assets/images/emojis/gogetter.gif differ diff --git a/ruqqus/assets/images/emojis/gooby.gif b/ruqqus/assets/images/emojis/gooby.gif new file mode 100644 index 000000000..935454957 Binary files /dev/null and b/ruqqus/assets/images/emojis/gooby.gif differ diff --git a/ruqqus/assets/images/emojis/grr.gif b/ruqqus/assets/images/emojis/grr.gif new file mode 100644 index 000000000..09c3507d2 Binary files /dev/null and b/ruqqus/assets/images/emojis/grr.gif differ diff --git a/ruqqus/assets/images/emojis/grug.gif b/ruqqus/assets/images/emojis/grug.gif new file mode 100644 index 000000000..a795021a2 Binary files /dev/null and b/ruqqus/assets/images/emojis/grug.gif differ diff --git a/ruqqus/assets/images/emojis/gtfo.gif b/ruqqus/assets/images/emojis/gtfo.gif new file mode 100644 index 000000000..fccc60d18 Binary files /dev/null and b/ruqqus/assets/images/emojis/gtfo.gif differ diff --git a/ruqqus/assets/images/emojis/guitar.gif b/ruqqus/assets/images/emojis/guitar.gif new file mode 100644 index 000000000..496372a95 Binary files /dev/null and b/ruqqus/assets/images/emojis/guitar.gif differ diff --git a/ruqqus/assets/images/emojis/haha.gif b/ruqqus/assets/images/emojis/haha.gif new file mode 100644 index 000000000..bf491df05 Binary files /dev/null and b/ruqqus/assets/images/emojis/haha.gif differ diff --git a/ruqqus/assets/images/emojis/handshake.gif b/ruqqus/assets/images/emojis/handshake.gif new file mode 100644 index 000000000..4e90eda20 Binary files /dev/null and b/ruqqus/assets/images/emojis/handshake.gif differ diff --git a/ruqqus/assets/images/emojis/happydance.gif b/ruqqus/assets/images/emojis/happydance.gif new file mode 100644 index 000000000..a13466706 Binary files /dev/null and b/ruqqus/assets/images/emojis/happydance.gif differ diff --git a/ruqqus/assets/images/emojis/headbang.gif b/ruqqus/assets/images/emojis/headbang.gif new file mode 100644 index 000000000..fb3bc2038 Binary files /dev/null and b/ruqqus/assets/images/emojis/headbang.gif differ diff --git a/ruqqus/assets/images/emojis/heart.gif b/ruqqus/assets/images/emojis/heart.gif new file mode 100644 index 000000000..b63b61066 Binary files /dev/null and b/ruqqus/assets/images/emojis/heart.gif differ diff --git a/ruqqus/assets/images/emojis/heartbeat.gif b/ruqqus/assets/images/emojis/heartbeat.gif new file mode 100644 index 000000000..b7eeac5a9 Binary files /dev/null and b/ruqqus/assets/images/emojis/heartbeat.gif differ diff --git a/ruqqus/assets/images/emojis/hearts.gif b/ruqqus/assets/images/emojis/hearts.gif new file mode 100644 index 000000000..636d8d2a0 Binary files /dev/null and b/ruqqus/assets/images/emojis/hearts.gif differ diff --git a/ruqqus/assets/images/emojis/hewillnever.gif b/ruqqus/assets/images/emojis/hewillnever.gif new file mode 100644 index 000000000..ba235251c Binary files /dev/null and b/ruqqus/assets/images/emojis/hewillnever.gif differ diff --git a/ruqqus/assets/images/emojis/highfive.gif b/ruqqus/assets/images/emojis/highfive.gif new file mode 100644 index 000000000..f8a28fc8b Binary files /dev/null and b/ruqqus/assets/images/emojis/highfive.gif differ diff --git a/ruqqus/assets/images/emojis/hmm.gif b/ruqqus/assets/images/emojis/hmm.gif new file mode 100644 index 000000000..c40b01107 Binary files /dev/null and b/ruqqus/assets/images/emojis/hmm.gif differ diff --git a/ruqqus/assets/images/emojis/hmph.gif b/ruqqus/assets/images/emojis/hmph.gif new file mode 100644 index 000000000..1b0c8f41b Binary files /dev/null and b/ruqqus/assets/images/emojis/hmph.gif differ diff --git a/ruqqus/assets/images/emojis/holdhands.gif b/ruqqus/assets/images/emojis/holdhands.gif new file mode 100644 index 000000000..b14312e78 Binary files /dev/null and b/ruqqus/assets/images/emojis/holdhands.gif differ diff --git a/ruqqus/assets/images/emojis/horny.gif b/ruqqus/assets/images/emojis/horny.gif new file mode 100644 index 000000000..8f7fb6b60 Binary files /dev/null and b/ruqqus/assets/images/emojis/horny.gif differ diff --git a/ruqqus/assets/images/emojis/hug.gif b/ruqqus/assets/images/emojis/hug.gif new file mode 100644 index 000000000..f3d237bce Binary files /dev/null and b/ruqqus/assets/images/emojis/hug.gif differ diff --git a/ruqqus/assets/images/emojis/hugging.gif b/ruqqus/assets/images/emojis/hugging.gif new file mode 100644 index 000000000..58c5bbed8 Binary files /dev/null and b/ruqqus/assets/images/emojis/hugging.gif differ diff --git a/ruqqus/assets/images/emojis/hugs.gif b/ruqqus/assets/images/emojis/hugs.gif new file mode 100644 index 000000000..aa15fdbb5 Binary files /dev/null and b/ruqqus/assets/images/emojis/hugs.gif differ diff --git a/ruqqus/assets/images/emojis/hump.gif b/ruqqus/assets/images/emojis/hump.gif new file mode 100644 index 000000000..426eaf487 Binary files /dev/null and b/ruqqus/assets/images/emojis/hump.gif differ diff --git a/ruqqus/assets/images/emojis/humpbed.gif b/ruqqus/assets/images/emojis/humpbed.gif new file mode 100644 index 000000000..d8da1a2fb Binary files /dev/null and b/ruqqus/assets/images/emojis/humpbed.gif differ diff --git a/ruqqus/assets/images/emojis/hysterical.gif b/ruqqus/assets/images/emojis/hysterical.gif new file mode 100644 index 000000000..39f7fa6b7 Binary files /dev/null and b/ruqqus/assets/images/emojis/hysterical.gif differ diff --git a/ruqqus/assets/images/emojis/idontknow.gif b/ruqqus/assets/images/emojis/idontknow.gif new file mode 100644 index 000000000..d73b90ce3 Binary files /dev/null and b/ruqqus/assets/images/emojis/idontknow.gif differ diff --git a/ruqqus/assets/images/emojis/ily.gif b/ruqqus/assets/images/emojis/ily.gif new file mode 100644 index 000000000..475ed1534 Binary files /dev/null and b/ruqqus/assets/images/emojis/ily.gif differ diff --git a/ruqqus/assets/images/emojis/incelpride.gif b/ruqqus/assets/images/emojis/incelpride.gif new file mode 100644 index 000000000..06aeec135 Binary files /dev/null and b/ruqqus/assets/images/emojis/incelpride.gif differ diff --git a/ruqqus/assets/images/emojis/inlove.gif b/ruqqus/assets/images/emojis/inlove.gif new file mode 100644 index 000000000..b7309e523 Binary files /dev/null and b/ruqqus/assets/images/emojis/inlove.gif differ diff --git a/ruqqus/assets/images/emojis/interuptedreading.gif b/ruqqus/assets/images/emojis/interuptedreading.gif new file mode 100644 index 000000000..03a9a4266 Binary files /dev/null and b/ruqqus/assets/images/emojis/interuptedreading.gif differ diff --git a/ruqqus/assets/images/emojis/iseewhatyoudidthere.gif b/ruqqus/assets/images/emojis/iseewhatyoudidthere.gif new file mode 100644 index 000000000..ecb9a01e1 Binary files /dev/null and b/ruqqus/assets/images/emojis/iseewhatyoudidthere.gif differ diff --git a/ruqqus/assets/images/emojis/israel.gif b/ruqqus/assets/images/emojis/israel.gif new file mode 100644 index 000000000..3068fcfad Binary files /dev/null and b/ruqqus/assets/images/emojis/israel.gif differ diff --git a/ruqqus/assets/images/emojis/jason.gif b/ruqqus/assets/images/emojis/jason.gif new file mode 100644 index 000000000..73ccd2077 Binary files /dev/null and b/ruqqus/assets/images/emojis/jason.gif differ diff --git a/ruqqus/assets/images/emojis/jawdrop.gif b/ruqqus/assets/images/emojis/jawdrop.gif new file mode 100644 index 000000000..6c42bf4f6 Binary files /dev/null and b/ruqqus/assets/images/emojis/jawdrop.gif differ diff --git a/ruqqus/assets/images/emojis/jedi.gif b/ruqqus/assets/images/emojis/jedi.gif new file mode 100644 index 000000000..8f1e14e6c Binary files /dev/null and b/ruqqus/assets/images/emojis/jedi.gif differ diff --git a/ruqqus/assets/images/emojis/jester.gif b/ruqqus/assets/images/emojis/jester.gif new file mode 100644 index 000000000..8f651d992 Binary files /dev/null and b/ruqqus/assets/images/emojis/jester.gif differ diff --git a/ruqqus/assets/images/emojis/kaboom.gif b/ruqqus/assets/images/emojis/kaboom.gif new file mode 100644 index 000000000..8f44e0a9a Binary files /dev/null and b/ruqqus/assets/images/emojis/kaboom.gif differ diff --git a/ruqqus/assets/images/emojis/kick.gif b/ruqqus/assets/images/emojis/kick.gif new file mode 100644 index 000000000..a6f4f960f Binary files /dev/null and b/ruqqus/assets/images/emojis/kick.gif differ diff --git a/ruqqus/assets/images/emojis/killherkillher.gif b/ruqqus/assets/images/emojis/killherkillher.gif new file mode 100644 index 000000000..24bf9a1ee Binary files /dev/null and b/ruqqus/assets/images/emojis/killherkillher.gif differ diff --git a/ruqqus/assets/images/emojis/kiss.gif b/ruqqus/assets/images/emojis/kiss.gif new file mode 100644 index 000000000..f08d157c3 Binary files /dev/null and b/ruqqus/assets/images/emojis/kiss.gif differ diff --git a/ruqqus/assets/images/emojis/kitty.gif b/ruqqus/assets/images/emojis/kitty.gif new file mode 100644 index 000000000..873ec8fc6 Binary files /dev/null and b/ruqqus/assets/images/emojis/kitty.gif differ diff --git a/ruqqus/assets/images/emojis/landlordlove.gif b/ruqqus/assets/images/emojis/landlordlove.gif new file mode 100644 index 000000000..2dd3c880f Binary files /dev/null and b/ruqqus/assets/images/emojis/landlordlove.gif differ diff --git a/ruqqus/assets/images/emojis/laughchair.gif b/ruqqus/assets/images/emojis/laughchair.gif new file mode 100644 index 000000000..b633f48fe Binary files /dev/null and b/ruqqus/assets/images/emojis/laughchair.gif differ diff --git a/ruqqus/assets/images/emojis/ledesire.gif b/ruqqus/assets/images/emojis/ledesire.gif new file mode 100644 index 000000000..1fa268917 Binary files /dev/null and b/ruqqus/assets/images/emojis/ledesire.gif differ diff --git a/ruqqus/assets/images/emojis/leexcited.gif b/ruqqus/assets/images/emojis/leexcited.gif new file mode 100644 index 000000000..2e5cefe4e Binary files /dev/null and b/ruqqus/assets/images/emojis/leexcited.gif differ diff --git a/ruqqus/assets/images/emojis/legenius.gif b/ruqqus/assets/images/emojis/legenius.gif new file mode 100644 index 000000000..b9a9da5cc Binary files /dev/null and b/ruqqus/assets/images/emojis/legenius.gif differ diff --git a/ruqqus/assets/images/emojis/lelolidk.gif b/ruqqus/assets/images/emojis/lelolidk.gif new file mode 100644 index 000000000..56dc4ba09 Binary files /dev/null and b/ruqqus/assets/images/emojis/lelolidk.gif differ diff --git a/ruqqus/assets/images/emojis/lemiddlefinger.gif b/ruqqus/assets/images/emojis/lemiddlefinger.gif new file mode 100644 index 000000000..4b1b1c783 Binary files /dev/null and b/ruqqus/assets/images/emojis/lemiddlefinger.gif differ diff --git a/ruqqus/assets/images/emojis/lemindblown.gif b/ruqqus/assets/images/emojis/lemindblown.gif new file mode 100644 index 000000000..e9718303e Binary files /dev/null and b/ruqqus/assets/images/emojis/lemindblown.gif differ diff --git a/ruqqus/assets/images/emojis/leokay.gif b/ruqqus/assets/images/emojis/leokay.gif new file mode 100644 index 000000000..50d10e131 Binary files /dev/null and b/ruqqus/assets/images/emojis/leokay.gif differ diff --git a/ruqqus/assets/images/emojis/lepanicrunning.gif b/ruqqus/assets/images/emojis/lepanicrunning.gif new file mode 100644 index 000000000..bb67d6481 Binary files /dev/null and b/ruqqus/assets/images/emojis/lepanicrunning.gif differ diff --git a/ruqqus/assets/images/emojis/lepokerface.gif b/ruqqus/assets/images/emojis/lepokerface.gif new file mode 100644 index 000000000..12a0de74f Binary files /dev/null and b/ruqqus/assets/images/emojis/lepokerface.gif differ diff --git a/ruqqus/assets/images/emojis/lepokerface2.gif b/ruqqus/assets/images/emojis/lepokerface2.gif new file mode 100644 index 000000000..2f9f6b4da Binary files /dev/null and b/ruqqus/assets/images/emojis/lepokerface2.gif differ diff --git a/ruqqus/assets/images/emojis/lerageface.gif b/ruqqus/assets/images/emojis/lerageface.gif new file mode 100644 index 000000000..6e3f8aa76 Binary files /dev/null and b/ruqqus/assets/images/emojis/lerageface.gif differ diff --git a/ruqqus/assets/images/emojis/leseriousface.gif b/ruqqus/assets/images/emojis/leseriousface.gif new file mode 100644 index 000000000..baffe582c Binary files /dev/null and b/ruqqus/assets/images/emojis/leseriousface.gif differ diff --git a/ruqqus/assets/images/emojis/lick.gif b/ruqqus/assets/images/emojis/lick.gif new file mode 100644 index 000000000..0e40150ba Binary files /dev/null and b/ruqqus/assets/images/emojis/lick.gif differ diff --git a/ruqqus/assets/images/emojis/likeaboss.gif b/ruqqus/assets/images/emojis/likeaboss.gif new file mode 100644 index 000000000..62cb3fe1a Binary files /dev/null and b/ruqqus/assets/images/emojis/likeaboss.gif differ diff --git a/ruqqus/assets/images/emojis/link.gif b/ruqqus/assets/images/emojis/link.gif new file mode 100644 index 000000000..d31548ade Binary files /dev/null and b/ruqqus/assets/images/emojis/link.gif differ diff --git a/ruqqus/assets/images/emojis/lol.gif b/ruqqus/assets/images/emojis/lol.gif new file mode 100644 index 000000000..1d7b66c7a Binary files /dev/null and b/ruqqus/assets/images/emojis/lol.gif differ diff --git a/ruqqus/assets/images/emojis/lolbeat.gif b/ruqqus/assets/images/emojis/lolbeat.gif new file mode 100644 index 000000000..dbebfdda6 Binary files /dev/null and b/ruqqus/assets/images/emojis/lolbeat.gif differ diff --git a/ruqqus/assets/images/emojis/lolface.gif b/ruqqus/assets/images/emojis/lolface.gif new file mode 100644 index 000000000..e485c53e0 Binary files /dev/null and b/ruqqus/assets/images/emojis/lolface.gif differ diff --git a/ruqqus/assets/images/emojis/longwhiskers.gif b/ruqqus/assets/images/emojis/longwhiskers.gif new file mode 100644 index 000000000..77054a43e Binary files /dev/null and b/ruqqus/assets/images/emojis/longwhiskers.gif differ diff --git a/ruqqus/assets/images/emojis/loving.gif b/ruqqus/assets/images/emojis/loving.gif new file mode 100644 index 000000000..d14f0c8ba Binary files /dev/null and b/ruqqus/assets/images/emojis/loving.gif differ diff --git a/ruqqus/assets/images/emojis/makeout.gif b/ruqqus/assets/images/emojis/makeout.gif new file mode 100644 index 000000000..f3d9becf0 Binary files /dev/null and b/ruqqus/assets/images/emojis/makeout.gif differ diff --git a/ruqqus/assets/images/emojis/manymiddlefingers.gif b/ruqqus/assets/images/emojis/manymiddlefingers.gif new file mode 100644 index 000000000..db76c7277 Binary files /dev/null and b/ruqqus/assets/images/emojis/manymiddlefingers.gif differ diff --git a/ruqqus/assets/images/emojis/marsey69.gif b/ruqqus/assets/images/emojis/marsey69.gif new file mode 100644 index 000000000..329042199 Binary files /dev/null and b/ruqqus/assets/images/emojis/marsey69.gif differ diff --git a/ruqqus/assets/images/emojis/marseyangel.gif b/ruqqus/assets/images/emojis/marseyangel.gif new file mode 100644 index 000000000..7163bfda3 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyangel.gif differ diff --git a/ruqqus/assets/images/emojis/marseybingus.gif b/ruqqus/assets/images/emojis/marseybingus.gif new file mode 100644 index 000000000..fb27bf8a9 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseybingus.gif differ diff --git a/ruqqus/assets/images/emojis/marseyblowkiss.gif b/ruqqus/assets/images/emojis/marseyblowkiss.gif new file mode 100644 index 000000000..d0aa3a0a1 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyblowkiss.gif differ diff --git a/ruqqus/assets/images/emojis/marseycomrade.gif b/ruqqus/assets/images/emojis/marseycomrade.gif new file mode 100644 index 000000000..3f44133b4 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseycomrade.gif differ diff --git a/ruqqus/assets/images/emojis/marseycowboy.gif b/ruqqus/assets/images/emojis/marseycowboy.gif new file mode 100644 index 000000000..293c0c464 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseycowboy.gif differ diff --git a/ruqqus/assets/images/emojis/marseycry.gif b/ruqqus/assets/images/emojis/marseycry.gif new file mode 100644 index 000000000..ef7766928 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseycry.gif differ diff --git a/ruqqus/assets/images/emojis/marseydead.gif b/ruqqus/assets/images/emojis/marseydead.gif new file mode 100644 index 000000000..90943a9ed Binary files /dev/null and b/ruqqus/assets/images/emojis/marseydead.gif differ diff --git a/ruqqus/assets/images/emojis/marseydepressed.gif b/ruqqus/assets/images/emojis/marseydepressed.gif new file mode 100644 index 000000000..a77f083e1 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseydepressed.gif differ diff --git a/ruqqus/assets/images/emojis/marseyexcited.gif b/ruqqus/assets/images/emojis/marseyexcited.gif new file mode 100644 index 000000000..2bd295c92 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyexcited.gif differ diff --git a/ruqqus/assets/images/emojis/marseygift.gif b/ruqqus/assets/images/emojis/marseygift.gif new file mode 100644 index 000000000..6ef06967e Binary files /dev/null and b/ruqqus/assets/images/emojis/marseygift.gif differ diff --git a/ruqqus/assets/images/emojis/marseyglam.gif b/ruqqus/assets/images/emojis/marseyglam.gif new file mode 100644 index 000000000..d51f49b38 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyglam.gif differ diff --git a/ruqqus/assets/images/emojis/marseyinabox.gif b/ruqqus/assets/images/emojis/marseyinabox.gif new file mode 100644 index 000000000..05e36ac03 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyinabox.gif differ diff --git a/ruqqus/assets/images/emojis/marseyira.gif b/ruqqus/assets/images/emojis/marseyira.gif new file mode 100644 index 000000000..efab50dfd Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyira.gif differ diff --git a/ruqqus/assets/images/emojis/marseyisis.gif b/ruqqus/assets/images/emojis/marseyisis.gif new file mode 100644 index 000000000..9a7ab71ec Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyisis.gif differ diff --git a/ruqqus/assets/images/emojis/marseyjamming.gif b/ruqqus/assets/images/emojis/marseyjamming.gif new file mode 100644 index 000000000..42ccebc65 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyjamming.gif differ diff --git a/ruqqus/assets/images/emojis/marseylaugh.gif b/ruqqus/assets/images/emojis/marseylaugh.gif new file mode 100644 index 000000000..57fdccf71 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseylaugh.gif differ diff --git a/ruqqus/assets/images/emojis/marseylove.gif b/ruqqus/assets/images/emojis/marseylove.gif new file mode 100644 index 000000000..c553bb8f1 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseylove.gif differ diff --git a/ruqqus/assets/images/emojis/marseymad.gif b/ruqqus/assets/images/emojis/marseymad.gif new file mode 100644 index 000000000..4fc2525e1 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseymad.gif differ diff --git a/ruqqus/assets/images/emojis/marseymerchant.gif b/ruqqus/assets/images/emojis/marseymerchant.gif new file mode 100644 index 000000000..6dfc50daf Binary files /dev/null and b/ruqqus/assets/images/emojis/marseymerchant.gif differ diff --git a/ruqqus/assets/images/emojis/marseynut.gif b/ruqqus/assets/images/emojis/marseynut.gif new file mode 100644 index 000000000..19aa8926a Binary files /dev/null and b/ruqqus/assets/images/emojis/marseynut.gif differ diff --git a/ruqqus/assets/images/emojis/marseypanties.gif b/ruqqus/assets/images/emojis/marseypanties.gif new file mode 100644 index 000000000..293a062d1 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseypanties.gif differ diff --git a/ruqqus/assets/images/emojis/marseyparty.gif b/ruqqus/assets/images/emojis/marseyparty.gif new file mode 100644 index 000000000..d84764b31 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyparty.gif differ diff --git a/ruqqus/assets/images/emojis/marseypat.gif b/ruqqus/assets/images/emojis/marseypat.gif new file mode 100644 index 000000000..4e725f7be Binary files /dev/null and b/ruqqus/assets/images/emojis/marseypat.gif differ diff --git a/ruqqus/assets/images/emojis/marseyrain.gif b/ruqqus/assets/images/emojis/marseyrain.gif new file mode 100644 index 000000000..e3a8a441b Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyrain.gif differ diff --git a/ruqqus/assets/images/emojis/marseyreading.gif b/ruqqus/assets/images/emojis/marseyreading.gif new file mode 100644 index 000000000..76c6af0cb Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyreading.gif differ diff --git a/ruqqus/assets/images/emojis/marseyready.gif b/ruqqus/assets/images/emojis/marseyready.gif new file mode 100644 index 000000000..75c61ca04 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyready.gif differ diff --git a/ruqqus/assets/images/emojis/marseyreich.gif b/ruqqus/assets/images/emojis/marseyreich.gif new file mode 100644 index 000000000..27d136b10 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyreich.gif differ diff --git a/ruqqus/assets/images/emojis/marseysad.gif b/ruqqus/assets/images/emojis/marseysad.gif new file mode 100644 index 000000000..1fe4ad2b0 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseysad.gif differ diff --git a/ruqqus/assets/images/emojis/marseyscarf.gif b/ruqqus/assets/images/emojis/marseyscarf.gif new file mode 100644 index 000000000..272dd8f39 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyscarf.gif differ diff --git a/ruqqus/assets/images/emojis/marseyshook.gif b/ruqqus/assets/images/emojis/marseyshook.gif new file mode 100644 index 000000000..87e4d90a9 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseyshook.gif differ diff --git a/ruqqus/assets/images/emojis/marseysipping.gif b/ruqqus/assets/images/emojis/marseysipping.gif new file mode 100644 index 000000000..5b4017cb3 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseysipping.gif differ diff --git a/ruqqus/assets/images/emojis/marseysleep.gif b/ruqqus/assets/images/emojis/marseysleep.gif new file mode 100644 index 000000000..97afafb48 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseysleep.gif differ diff --git a/ruqqus/assets/images/emojis/marseythumbsup.gif b/ruqqus/assets/images/emojis/marseythumbsup.gif new file mode 100644 index 000000000..503c1c426 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseythumbsup.gif differ diff --git a/ruqqus/assets/images/emojis/marseywave.gif b/ruqqus/assets/images/emojis/marseywave.gif new file mode 100644 index 000000000..7d5738ed9 Binary files /dev/null and b/ruqqus/assets/images/emojis/marseywave.gif differ diff --git a/ruqqus/assets/images/emojis/medal.gif b/ruqqus/assets/images/emojis/medal.gif new file mode 100644 index 000000000..790414b40 Binary files /dev/null and b/ruqqus/assets/images/emojis/medal.gif differ diff --git a/ruqqus/assets/images/emojis/megaman.gif b/ruqqus/assets/images/emojis/megaman.gif new file mode 100644 index 000000000..23c75a708 Binary files /dev/null and b/ruqqus/assets/images/emojis/megaman.gif differ diff --git a/ruqqus/assets/images/emojis/megamanguitar.gif b/ruqqus/assets/images/emojis/megamanguitar.gif new file mode 100644 index 000000000..27954d143 Binary files /dev/null and b/ruqqus/assets/images/emojis/megamanguitar.gif differ diff --git a/ruqqus/assets/images/emojis/megusta.gif b/ruqqus/assets/images/emojis/megusta.gif new file mode 100644 index 000000000..13efa0ef4 Binary files /dev/null and b/ruqqus/assets/images/emojis/megusta.gif differ diff --git a/ruqqus/assets/images/emojis/meow.gif b/ruqqus/assets/images/emojis/meow.gif new file mode 100644 index 000000000..cd7c76cf5 Binary files /dev/null and b/ruqqus/assets/images/emojis/meow.gif differ diff --git a/ruqqus/assets/images/emojis/metime.gif b/ruqqus/assets/images/emojis/metime.gif new file mode 100644 index 000000000..b9050bc62 Binary files /dev/null and b/ruqqus/assets/images/emojis/metime.gif differ diff --git a/ruqqus/assets/images/emojis/monke.gif b/ruqqus/assets/images/emojis/monke.gif new file mode 100644 index 000000000..7ac44a981 Binary files /dev/null and b/ruqqus/assets/images/emojis/monke.gif differ diff --git a/ruqqus/assets/images/emojis/mooning.gif b/ruqqus/assets/images/emojis/mooning.gif new file mode 100644 index 000000000..4bb0b8222 Binary files /dev/null and b/ruqqus/assets/images/emojis/mooning.gif differ diff --git a/ruqqus/assets/images/emojis/motherfucker.gif b/ruqqus/assets/images/emojis/motherfucker.gif new file mode 100644 index 000000000..0b419b3d9 Binary files /dev/null and b/ruqqus/assets/images/emojis/motherfucker.gif differ diff --git a/ruqqus/assets/images/emojis/motherofgod.gif b/ruqqus/assets/images/emojis/motherofgod.gif new file mode 100644 index 000000000..57247e38f Binary files /dev/null and b/ruqqus/assets/images/emojis/motherofgod.gif differ diff --git a/ruqqus/assets/images/emojis/mummy.gif b/ruqqus/assets/images/emojis/mummy.gif new file mode 100644 index 000000000..d1058a244 Binary files /dev/null and b/ruqqus/assets/images/emojis/mummy.gif differ diff --git a/ruqqus/assets/images/emojis/mysides.gif b/ruqqus/assets/images/emojis/mysides.gif new file mode 100644 index 000000000..f3baa05e6 Binary files /dev/null and b/ruqqus/assets/images/emojis/mysides.gif differ diff --git a/ruqqus/assets/images/emojis/na.gif b/ruqqus/assets/images/emojis/na.gif new file mode 100644 index 000000000..e528bb791 Binary files /dev/null and b/ruqqus/assets/images/emojis/na.gif differ diff --git a/ruqqus/assets/images/emojis/nauseous.gif b/ruqqus/assets/images/emojis/nauseous.gif new file mode 100644 index 000000000..67404349b Binary files /dev/null and b/ruqqus/assets/images/emojis/nauseous.gif differ diff --git a/ruqqus/assets/images/emojis/nazijak.gif b/ruqqus/assets/images/emojis/nazijak.gif new file mode 100644 index 000000000..b9e98ddf8 Binary files /dev/null and b/ruqqus/assets/images/emojis/nazijak.gif differ diff --git a/ruqqus/assets/images/emojis/nervous.gif b/ruqqus/assets/images/emojis/nervous.gif new file mode 100644 index 000000000..3655d65f8 Binary files /dev/null and b/ruqqus/assets/images/emojis/nervous.gif differ diff --git a/ruqqus/assets/images/emojis/ninja.gif b/ruqqus/assets/images/emojis/ninja.gif new file mode 100644 index 000000000..b4e561a7e Binary files /dev/null and b/ruqqus/assets/images/emojis/ninja.gif differ diff --git a/ruqqus/assets/images/emojis/nod.gif b/ruqqus/assets/images/emojis/nod.gif new file mode 100644 index 000000000..54f17eb28 Binary files /dev/null and b/ruqqus/assets/images/emojis/nod.gif differ diff --git a/ruqqus/assets/images/emojis/nono.gif b/ruqqus/assets/images/emojis/nono.gif new file mode 100644 index 000000000..c043b701b Binary files /dev/null and b/ruqqus/assets/images/emojis/nono.gif differ diff --git a/ruqqus/assets/images/emojis/npc.gif b/ruqqus/assets/images/emojis/npc.gif new file mode 100644 index 000000000..ae773ff2e Binary files /dev/null and b/ruqqus/assets/images/emojis/npc.gif differ diff --git a/ruqqus/assets/images/emojis/npcfront.gif b/ruqqus/assets/images/emojis/npcfront.gif new file mode 100644 index 000000000..c0c55758b Binary files /dev/null and b/ruqqus/assets/images/emojis/npcfront.gif differ diff --git a/ruqqus/assets/images/emojis/npcmaga.gif b/ruqqus/assets/images/emojis/npcmaga.gif new file mode 100644 index 000000000..b21587fc1 Binary files /dev/null and b/ruqqus/assets/images/emojis/npcmaga.gif differ diff --git a/ruqqus/assets/images/emojis/ohgodwhy.gif b/ruqqus/assets/images/emojis/ohgodwhy.gif new file mode 100644 index 000000000..33b564377 Binary files /dev/null and b/ruqqus/assets/images/emojis/ohgodwhy.gif differ diff --git a/ruqqus/assets/images/emojis/omg.gif b/ruqqus/assets/images/emojis/omg.gif new file mode 100644 index 000000000..fcd825462 Binary files /dev/null and b/ruqqus/assets/images/emojis/omg.gif differ diff --git a/ruqqus/assets/images/emojis/onfire.gif b/ruqqus/assets/images/emojis/onfire.gif new file mode 100644 index 000000000..3a907f9e7 Binary files /dev/null and b/ruqqus/assets/images/emojis/onfire.gif differ diff --git a/ruqqus/assets/images/emojis/ooo.gif b/ruqqus/assets/images/emojis/ooo.gif new file mode 100644 index 000000000..e4f42ef58 Binary files /dev/null and b/ruqqus/assets/images/emojis/ooo.gif differ diff --git a/ruqqus/assets/images/emojis/orly.gif b/ruqqus/assets/images/emojis/orly.gif new file mode 100644 index 000000000..ae9f1f8f7 Binary files /dev/null and b/ruqqus/assets/images/emojis/orly.gif differ diff --git a/ruqqus/assets/images/emojis/p.gif b/ruqqus/assets/images/emojis/p.gif new file mode 100644 index 000000000..c7c630b85 Binary files /dev/null and b/ruqqus/assets/images/emojis/p.gif differ diff --git a/ruqqus/assets/images/emojis/paddle.gif b/ruqqus/assets/images/emojis/paddle.gif new file mode 100644 index 000000000..6a0475ca6 Binary files /dev/null and b/ruqqus/assets/images/emojis/paddle.gif differ diff --git a/ruqqus/assets/images/emojis/panda.gif b/ruqqus/assets/images/emojis/panda.gif new file mode 100644 index 000000000..9b10e0975 Binary files /dev/null and b/ruqqus/assets/images/emojis/panda.gif differ diff --git a/ruqqus/assets/images/emojis/pandabutt.gif b/ruqqus/assets/images/emojis/pandabutt.gif new file mode 100644 index 000000000..68d733997 Binary files /dev/null and b/ruqqus/assets/images/emojis/pandabutt.gif differ diff --git a/ruqqus/assets/images/emojis/paranoid.gif b/ruqqus/assets/images/emojis/paranoid.gif new file mode 100644 index 000000000..71c9f4eec Binary files /dev/null and b/ruqqus/assets/images/emojis/paranoid.gif differ diff --git a/ruqqus/assets/images/emojis/party.gif b/ruqqus/assets/images/emojis/party.gif new file mode 100644 index 000000000..3d1323798 Binary files /dev/null and b/ruqqus/assets/images/emojis/party.gif differ diff --git a/ruqqus/assets/images/emojis/pat.gif b/ruqqus/assets/images/emojis/pat.gif new file mode 100644 index 000000000..7650f5672 Binary files /dev/null and b/ruqqus/assets/images/emojis/pat.gif differ diff --git a/ruqqus/assets/images/emojis/peek.gif b/ruqqus/assets/images/emojis/peek.gif new file mode 100644 index 000000000..7f01890c8 Binary files /dev/null and b/ruqqus/assets/images/emojis/peek.gif differ diff --git a/ruqqus/assets/images/emojis/pervertedspiderman.gif b/ruqqus/assets/images/emojis/pervertedspiderman.gif new file mode 100644 index 000000000..b184e4427 Binary files /dev/null and b/ruqqus/assets/images/emojis/pervertedspiderman.gif differ diff --git a/ruqqus/assets/images/emojis/picard.gif b/ruqqus/assets/images/emojis/picard.gif new file mode 100644 index 000000000..94afacf75 Binary files /dev/null and b/ruqqus/assets/images/emojis/picard.gif differ diff --git a/ruqqus/assets/images/emojis/pikachu.gif b/ruqqus/assets/images/emojis/pikachu.gif new file mode 100644 index 000000000..9ddaed5fe Binary files /dev/null and b/ruqqus/assets/images/emojis/pikachu.gif differ diff --git a/ruqqus/assets/images/emojis/pimp.gif b/ruqqus/assets/images/emojis/pimp.gif new file mode 100644 index 000000000..e37be6561 Binary files /dev/null and b/ruqqus/assets/images/emojis/pimp.gif differ diff --git a/ruqqus/assets/images/emojis/platyblush.gif b/ruqqus/assets/images/emojis/platyblush.gif new file mode 100644 index 000000000..0d93aeafe Binary files /dev/null and b/ruqqus/assets/images/emojis/platyblush.gif differ diff --git a/ruqqus/assets/images/emojis/platybruh.gif b/ruqqus/assets/images/emojis/platybruh.gif new file mode 100644 index 000000000..205752186 Binary files /dev/null and b/ruqqus/assets/images/emojis/platybruh.gif differ diff --git a/ruqqus/assets/images/emojis/platycaveman.gif b/ruqqus/assets/images/emojis/platycaveman.gif new file mode 100644 index 000000000..b70ae0135 Binary files /dev/null and b/ruqqus/assets/images/emojis/platycaveman.gif differ diff --git a/ruqqus/assets/images/emojis/platycheer.gif b/ruqqus/assets/images/emojis/platycheer.gif new file mode 100644 index 000000000..5c1a4e85b Binary files /dev/null and b/ruqqus/assets/images/emojis/platycheer.gif differ diff --git a/ruqqus/assets/images/emojis/platydown.gif b/ruqqus/assets/images/emojis/platydown.gif new file mode 100644 index 000000000..19887f547 Binary files /dev/null and b/ruqqus/assets/images/emojis/platydown.gif differ diff --git a/ruqqus/assets/images/emojis/platyeyes.gif b/ruqqus/assets/images/emojis/platyeyes.gif new file mode 100644 index 000000000..cb4a4881e Binary files /dev/null and b/ruqqus/assets/images/emojis/platyeyes.gif differ diff --git a/ruqqus/assets/images/emojis/platyheart.gif b/ruqqus/assets/images/emojis/platyheart.gif new file mode 100644 index 000000000..169c82c83 Binary files /dev/null and b/ruqqus/assets/images/emojis/platyheart.gif differ diff --git a/ruqqus/assets/images/emojis/platylol.gif b/ruqqus/assets/images/emojis/platylol.gif new file mode 100644 index 000000000..480c6a54b Binary files /dev/null and b/ruqqus/assets/images/emojis/platylol.gif differ diff --git a/ruqqus/assets/images/emojis/platymicdrop.gif b/ruqqus/assets/images/emojis/platymicdrop.gif new file mode 100644 index 000000000..1c96f58f0 Binary files /dev/null and b/ruqqus/assets/images/emojis/platymicdrop.gif differ diff --git a/ruqqus/assets/images/emojis/platynooo.gif b/ruqqus/assets/images/emojis/platynooo.gif new file mode 100644 index 000000000..f4bae0cb4 Binary files /dev/null and b/ruqqus/assets/images/emojis/platynooo.gif differ diff --git a/ruqqus/assets/images/emojis/platysalute.gif b/ruqqus/assets/images/emojis/platysalute.gif new file mode 100644 index 000000000..aa2ce169a Binary files /dev/null and b/ruqqus/assets/images/emojis/platysalute.gif differ diff --git a/ruqqus/assets/images/emojis/platyseethe.gif b/ruqqus/assets/images/emojis/platyseethe.gif new file mode 100644 index 000000000..eefe2610e Binary files /dev/null and b/ruqqus/assets/images/emojis/platyseethe.gif differ diff --git a/ruqqus/assets/images/emojis/platythumbsup.gif b/ruqqus/assets/images/emojis/platythumbsup.gif new file mode 100644 index 000000000..c2b62089a Binary files /dev/null and b/ruqqus/assets/images/emojis/platythumbsup.gif differ diff --git a/ruqqus/assets/images/emojis/platywave.gif b/ruqqus/assets/images/emojis/platywave.gif new file mode 100644 index 000000000..b324d13ee Binary files /dev/null and b/ruqqus/assets/images/emojis/platywave.gif differ diff --git a/ruqqus/assets/images/emojis/plzdie.gif b/ruqqus/assets/images/emojis/plzdie.gif new file mode 100644 index 000000000..1c3def603 Binary files /dev/null and b/ruqqus/assets/images/emojis/plzdie.gif differ diff --git a/ruqqus/assets/images/emojis/poke.gif b/ruqqus/assets/images/emojis/poke.gif new file mode 100644 index 000000000..965edd282 Binary files /dev/null and b/ruqqus/assets/images/emojis/poke.gif differ diff --git a/ruqqus/assets/images/emojis/popcorn.gif b/ruqqus/assets/images/emojis/popcorn.gif new file mode 100644 index 000000000..b09503b3f Binary files /dev/null and b/ruqqus/assets/images/emojis/popcorn.gif differ diff --git a/ruqqus/assets/images/emojis/pout.gif b/ruqqus/assets/images/emojis/pout.gif new file mode 100644 index 000000000..548d9d50c Binary files /dev/null and b/ruqqus/assets/images/emojis/pout.gif differ diff --git a/ruqqus/assets/images/emojis/probe.gif b/ruqqus/assets/images/emojis/probe.gif new file mode 100644 index 000000000..0f10925d3 Binary files /dev/null and b/ruqqus/assets/images/emojis/probe.gif differ diff --git a/ruqqus/assets/images/emojis/psychojak.gif b/ruqqus/assets/images/emojis/psychojak.gif new file mode 100644 index 000000000..af8a6d17e Binary files /dev/null and b/ruqqus/assets/images/emojis/psychojak.gif differ diff --git a/ruqqus/assets/images/emojis/puke.gif b/ruqqus/assets/images/emojis/puke.gif new file mode 100644 index 000000000..3b027d4a7 Binary files /dev/null and b/ruqqus/assets/images/emojis/puke.gif differ diff --git a/ruqqus/assets/images/emojis/punch.gif b/ruqqus/assets/images/emojis/punch.gif new file mode 100644 index 000000000..5e3262e59 Binary files /dev/null and b/ruqqus/assets/images/emojis/punch.gif differ diff --git a/ruqqus/assets/images/emojis/quote.gif b/ruqqus/assets/images/emojis/quote.gif new file mode 100644 index 000000000..e41ed7ce8 Binary files /dev/null and b/ruqqus/assets/images/emojis/quote.gif differ diff --git a/ruqqus/assets/images/emojis/raccoon.gif b/ruqqus/assets/images/emojis/raccoon.gif new file mode 100644 index 000000000..aeed20983 Binary files /dev/null and b/ruqqus/assets/images/emojis/raccoon.gif differ diff --git a/ruqqus/assets/images/emojis/ragejak.gif b/ruqqus/assets/images/emojis/ragejak.gif new file mode 100644 index 000000000..9f48b0ad7 Binary files /dev/null and b/ruqqus/assets/images/emojis/ragejak.gif differ diff --git a/ruqqus/assets/images/emojis/ragemask.gif b/ruqqus/assets/images/emojis/ragemask.gif new file mode 100644 index 000000000..6d42fea66 Binary files /dev/null and b/ruqqus/assets/images/emojis/ragemask.gif differ diff --git a/ruqqus/assets/images/emojis/ragestrangle.gif b/ruqqus/assets/images/emojis/ragestrangle.gif new file mode 100644 index 000000000..a11084612 Binary files /dev/null and b/ruqqus/assets/images/emojis/ragestrangle.gif differ diff --git a/ruqqus/assets/images/emojis/ramonajak.gif b/ruqqus/assets/images/emojis/ramonajak.gif new file mode 100644 index 000000000..76897bbe1 Binary files /dev/null and b/ruqqus/assets/images/emojis/ramonajak.gif differ diff --git a/ruqqus/assets/images/emojis/roar.gif b/ruqqus/assets/images/emojis/roar.gif new file mode 100644 index 000000000..0bb30a991 Binary files /dev/null and b/ruqqus/assets/images/emojis/roar.gif differ diff --git a/ruqqus/assets/images/emojis/rofl.gif b/ruqqus/assets/images/emojis/rofl.gif new file mode 100644 index 000000000..f6885c3eb Binary files /dev/null and b/ruqqus/assets/images/emojis/rofl.gif differ diff --git a/ruqqus/assets/images/emojis/roflmao.gif b/ruqqus/assets/images/emojis/roflmao.gif new file mode 100644 index 000000000..30bd61a87 Binary files /dev/null and b/ruqqus/assets/images/emojis/roflmao.gif differ diff --git a/ruqqus/assets/images/emojis/rolleyes.gif b/ruqqus/assets/images/emojis/rolleyes.gif new file mode 100644 index 000000000..1ee836928 Binary files /dev/null and b/ruqqus/assets/images/emojis/rolleyes.gif differ diff --git a/ruqqus/assets/images/emojis/rukiddingme.gif b/ruqqus/assets/images/emojis/rukiddingme.gif new file mode 100644 index 000000000..bc32ab140 Binary files /dev/null and b/ruqqus/assets/images/emojis/rukiddingme.gif differ diff --git a/ruqqus/assets/images/emojis/sad.gif b/ruqqus/assets/images/emojis/sad.gif new file mode 100644 index 000000000..056a72242 Binary files /dev/null and b/ruqqus/assets/images/emojis/sad.gif differ diff --git a/ruqqus/assets/images/emojis/sadeyes.gif b/ruqqus/assets/images/emojis/sadeyes.gif new file mode 100644 index 000000000..48c334d69 Binary files /dev/null and b/ruqqus/assets/images/emojis/sadeyes.gif differ diff --git a/ruqqus/assets/images/emojis/sadhug.gif b/ruqqus/assets/images/emojis/sadhug.gif new file mode 100644 index 000000000..a508ac63d Binary files /dev/null and b/ruqqus/assets/images/emojis/sadhug.gif differ diff --git a/ruqqus/assets/images/emojis/samurai.gif b/ruqqus/assets/images/emojis/samurai.gif new file mode 100644 index 000000000..1ddc7a013 Binary files /dev/null and b/ruqqus/assets/images/emojis/samurai.gif differ diff --git a/ruqqus/assets/images/emojis/sarcasm.gif b/ruqqus/assets/images/emojis/sarcasm.gif new file mode 100644 index 000000000..4d4186af4 Binary files /dev/null and b/ruqqus/assets/images/emojis/sarcasm.gif differ diff --git a/ruqqus/assets/images/emojis/scalperpride.gif b/ruqqus/assets/images/emojis/scalperpride.gif new file mode 100644 index 000000000..52f18ba43 Binary files /dev/null and b/ruqqus/assets/images/emojis/scalperpride.gif differ diff --git a/ruqqus/assets/images/emojis/scoot.gif b/ruqqus/assets/images/emojis/scoot.gif new file mode 100644 index 000000000..fd2bcbb8e Binary files /dev/null and b/ruqqus/assets/images/emojis/scoot.gif differ diff --git a/ruqqus/assets/images/emojis/scream.gif b/ruqqus/assets/images/emojis/scream.gif new file mode 100644 index 000000000..91d005494 Binary files /dev/null and b/ruqqus/assets/images/emojis/scream.gif differ diff --git a/ruqqus/assets/images/emojis/shmoopy.gif b/ruqqus/assets/images/emojis/shmoopy.gif new file mode 100644 index 000000000..1e1da2f51 Binary files /dev/null and b/ruqqus/assets/images/emojis/shmoopy.gif differ diff --git a/ruqqus/assets/images/emojis/shrug.gif b/ruqqus/assets/images/emojis/shrug.gif new file mode 100644 index 000000000..0a3b63098 Binary files /dev/null and b/ruqqus/assets/images/emojis/shrug.gif differ diff --git a/ruqqus/assets/images/emojis/skull.gif b/ruqqus/assets/images/emojis/skull.gif new file mode 100644 index 000000000..4066a3749 Binary files /dev/null and b/ruqqus/assets/images/emojis/skull.gif differ diff --git a/ruqqus/assets/images/emojis/slap.gif b/ruqqus/assets/images/emojis/slap.gif new file mode 100644 index 000000000..209082173 Binary files /dev/null and b/ruqqus/assets/images/emojis/slap.gif differ diff --git a/ruqqus/assets/images/emojis/slapfight.gif b/ruqqus/assets/images/emojis/slapfight.gif new file mode 100644 index 000000000..5bf7ddebc Binary files /dev/null and b/ruqqus/assets/images/emojis/slapfight.gif differ diff --git a/ruqqus/assets/images/emojis/sleepy.gif b/ruqqus/assets/images/emojis/sleepy.gif new file mode 100644 index 000000000..d55420be2 Binary files /dev/null and b/ruqqus/assets/images/emojis/sleepy.gif differ diff --git a/ruqqus/assets/images/emojis/smackfish.gif b/ruqqus/assets/images/emojis/smackfish.gif new file mode 100644 index 000000000..3877b1b06 Binary files /dev/null and b/ruqqus/assets/images/emojis/smackfish.gif differ diff --git a/ruqqus/assets/images/emojis/smackhead.gif b/ruqqus/assets/images/emojis/smackhead.gif new file mode 100644 index 000000000..393723785 Binary files /dev/null and b/ruqqus/assets/images/emojis/smackhead.gif differ diff --git a/ruqqus/assets/images/emojis/smh.gif b/ruqqus/assets/images/emojis/smh.gif new file mode 100644 index 000000000..dc994b03e Binary files /dev/null and b/ruqqus/assets/images/emojis/smh.gif differ diff --git a/ruqqus/assets/images/emojis/smile.gif b/ruqqus/assets/images/emojis/smile.gif new file mode 100644 index 000000000..8c54e8d5e Binary files /dev/null and b/ruqqus/assets/images/emojis/smile.gif differ diff --git a/ruqqus/assets/images/emojis/smoke.gif b/ruqqus/assets/images/emojis/smoke.gif new file mode 100644 index 000000000..741217580 Binary files /dev/null and b/ruqqus/assets/images/emojis/smoke.gif differ diff --git a/ruqqus/assets/images/emojis/sonic.gif b/ruqqus/assets/images/emojis/sonic.gif new file mode 100644 index 000000000..7103b6edb Binary files /dev/null and b/ruqqus/assets/images/emojis/sonic.gif differ diff --git a/ruqqus/assets/images/emojis/soyjackwow.gif b/ruqqus/assets/images/emojis/soyjackwow.gif new file mode 100644 index 000000000..936da5e99 Binary files /dev/null and b/ruqqus/assets/images/emojis/soyjackwow.gif differ diff --git a/ruqqus/assets/images/emojis/soyjak.gif b/ruqqus/assets/images/emojis/soyjak.gif new file mode 100644 index 000000000..4920ce211 Binary files /dev/null and b/ruqqus/assets/images/emojis/soyjak.gif differ diff --git a/ruqqus/assets/images/emojis/soyjakfront.gif b/ruqqus/assets/images/emojis/soyjakfront.gif new file mode 100644 index 000000000..a08cd60d2 Binary files /dev/null and b/ruqqus/assets/images/emojis/soyjakfront.gif differ diff --git a/ruqqus/assets/images/emojis/soyjakhipster.gif b/ruqqus/assets/images/emojis/soyjakhipster.gif new file mode 100644 index 000000000..f6391698c Binary files /dev/null and b/ruqqus/assets/images/emojis/soyjakhipster.gif differ diff --git a/ruqqus/assets/images/emojis/soyjakmaga.gif b/ruqqus/assets/images/emojis/soyjakmaga.gif new file mode 100644 index 000000000..ad0d2ad01 Binary files /dev/null and b/ruqqus/assets/images/emojis/soyjakmaga.gif differ diff --git a/ruqqus/assets/images/emojis/soyjakyell.gif b/ruqqus/assets/images/emojis/soyjakyell.gif new file mode 100644 index 000000000..cc9511e5b Binary files /dev/null and b/ruqqus/assets/images/emojis/soyjakyell.gif differ diff --git a/ruqqus/assets/images/emojis/spank.gif b/ruqqus/assets/images/emojis/spank.gif new file mode 100644 index 000000000..57460d47a Binary files /dev/null and b/ruqqus/assets/images/emojis/spank.gif differ diff --git a/ruqqus/assets/images/emojis/sparta.gif b/ruqqus/assets/images/emojis/sparta.gif new file mode 100644 index 000000000..41336656c Binary files /dev/null and b/ruqqus/assets/images/emojis/sparta.gif differ diff --git a/ruqqus/assets/images/emojis/sperm.gif b/ruqqus/assets/images/emojis/sperm.gif new file mode 100644 index 000000000..9c23c0aac Binary files /dev/null and b/ruqqus/assets/images/emojis/sperm.gif differ diff --git a/ruqqus/assets/images/emojis/spiderman.gif b/ruqqus/assets/images/emojis/spiderman.gif new file mode 100644 index 000000000..d6ee521d9 Binary files /dev/null and b/ruqqus/assets/images/emojis/spiderman.gif differ diff --git a/ruqqus/assets/images/emojis/stab.gif b/ruqqus/assets/images/emojis/stab.gif new file mode 100644 index 000000000..d37209b95 Binary files /dev/null and b/ruqqus/assets/images/emojis/stab.gif differ diff --git a/ruqqus/assets/images/emojis/star.gif b/ruqqus/assets/images/emojis/star.gif new file mode 100644 index 000000000..17414398b Binary files /dev/null and b/ruqqus/assets/images/emojis/star.gif differ diff --git a/ruqqus/assets/images/emojis/stare.gif b/ruqqus/assets/images/emojis/stare.gif new file mode 100644 index 000000000..ca222d0aa Binary files /dev/null and b/ruqqus/assets/images/emojis/stare.gif differ diff --git a/ruqqus/assets/images/emojis/stfu.gif b/ruqqus/assets/images/emojis/stfu.gif new file mode 100644 index 000000000..0edc58346 Binary files /dev/null and b/ruqqus/assets/images/emojis/stfu.gif differ diff --git a/ruqqus/assets/images/emojis/suicide.gif b/ruqqus/assets/images/emojis/suicide.gif new file mode 100644 index 000000000..4039b6990 Binary files /dev/null and b/ruqqus/assets/images/emojis/suicide.gif differ diff --git a/ruqqus/assets/images/emojis/superstraight.gif b/ruqqus/assets/images/emojis/superstraight.gif new file mode 100644 index 000000000..fe5f94cb5 Binary files /dev/null and b/ruqqus/assets/images/emojis/superstraight.gif differ diff --git a/ruqqus/assets/images/emojis/surprisehug.gif b/ruqqus/assets/images/emojis/surprisehug.gif new file mode 100644 index 000000000..1430b5e0e Binary files /dev/null and b/ruqqus/assets/images/emojis/surprisehug.gif differ diff --git a/ruqqus/assets/images/emojis/suspicious.gif b/ruqqus/assets/images/emojis/suspicious.gif new file mode 100644 index 000000000..9832e8e0f Binary files /dev/null and b/ruqqus/assets/images/emojis/suspicious.gif differ diff --git a/ruqqus/assets/images/emojis/sweat.gif b/ruqqus/assets/images/emojis/sweat.gif new file mode 100644 index 000000000..e1cfb4305 Binary files /dev/null and b/ruqqus/assets/images/emojis/sweat.gif differ diff --git a/ruqqus/assets/images/emojis/swordfight.gif b/ruqqus/assets/images/emojis/swordfight.gif new file mode 100644 index 000000000..5e85fab85 Binary files /dev/null and b/ruqqus/assets/images/emojis/swordfight.gif differ diff --git a/ruqqus/assets/images/emojis/taco.gif b/ruqqus/assets/images/emojis/taco.gif new file mode 100644 index 000000000..24b3a9090 Binary files /dev/null and b/ruqqus/assets/images/emojis/taco.gif differ diff --git a/ruqqus/assets/images/emojis/talk2hand.gif b/ruqqus/assets/images/emojis/talk2hand.gif new file mode 100644 index 000000000..f52c5de7e Binary files /dev/null and b/ruqqus/assets/images/emojis/talk2hand.gif differ diff --git a/ruqqus/assets/images/emojis/tantrum.gif b/ruqqus/assets/images/emojis/tantrum.gif new file mode 100644 index 000000000..7cb92307a Binary files /dev/null and b/ruqqus/assets/images/emojis/tantrum.gif differ diff --git a/ruqqus/assets/images/emojis/tayaaa.gif b/ruqqus/assets/images/emojis/tayaaa.gif new file mode 100644 index 000000000..76163077a Binary files /dev/null and b/ruqqus/assets/images/emojis/tayaaa.gif differ diff --git a/ruqqus/assets/images/emojis/tayaaaa.gif b/ruqqus/assets/images/emojis/tayaaaa.gif new file mode 100644 index 000000000..c600b47e1 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayaaaa.gif differ diff --git a/ruqqus/assets/images/emojis/tayadmire.gif b/ruqqus/assets/images/emojis/tayadmire.gif new file mode 100644 index 000000000..f8dbd6682 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayadmire.gif differ diff --git a/ruqqus/assets/images/emojis/taycat.gif b/ruqqus/assets/images/emojis/taycat.gif new file mode 100644 index 000000000..56c00971a Binary files /dev/null and b/ruqqus/assets/images/emojis/taycat.gif differ diff --git a/ruqqus/assets/images/emojis/taycelebrate.gif b/ruqqus/assets/images/emojis/taycelebrate.gif new file mode 100644 index 000000000..db4cbf36b Binary files /dev/null and b/ruqqus/assets/images/emojis/taycelebrate.gif differ diff --git a/ruqqus/assets/images/emojis/taychefkiss.gif b/ruqqus/assets/images/emojis/taychefkiss.gif new file mode 100644 index 000000000..4b1fe00ad Binary files /dev/null and b/ruqqus/assets/images/emojis/taychefkiss.gif differ diff --git a/ruqqus/assets/images/emojis/taychristmas.gif b/ruqqus/assets/images/emojis/taychristmas.gif new file mode 100644 index 000000000..35c80abe6 Binary files /dev/null and b/ruqqus/assets/images/emojis/taychristmas.gif differ diff --git a/ruqqus/assets/images/emojis/tayclap.gif b/ruqqus/assets/images/emojis/tayclap.gif new file mode 100644 index 000000000..2af61c12d Binary files /dev/null and b/ruqqus/assets/images/emojis/tayclap.gif differ diff --git a/ruqqus/assets/images/emojis/taycold.gif b/ruqqus/assets/images/emojis/taycold.gif new file mode 100644 index 000000000..84981397a Binary files /dev/null and b/ruqqus/assets/images/emojis/taycold.gif differ diff --git a/ruqqus/assets/images/emojis/taycrown.gif b/ruqqus/assets/images/emojis/taycrown.gif new file mode 100644 index 000000000..ff6e815ab Binary files /dev/null and b/ruqqus/assets/images/emojis/taycrown.gif differ diff --git a/ruqqus/assets/images/emojis/tayflex.gif b/ruqqus/assets/images/emojis/tayflex.gif new file mode 100644 index 000000000..9e0a8a09c Binary files /dev/null and b/ruqqus/assets/images/emojis/tayflex.gif differ diff --git a/ruqqus/assets/images/emojis/tayflirt.gif b/ruqqus/assets/images/emojis/tayflirt.gif new file mode 100644 index 000000000..09c5d66bc Binary files /dev/null and b/ruqqus/assets/images/emojis/tayflirt.gif differ diff --git a/ruqqus/assets/images/emojis/taygrimacing.gif b/ruqqus/assets/images/emojis/taygrimacing.gif new file mode 100644 index 000000000..f8352ac0f Binary files /dev/null and b/ruqqus/assets/images/emojis/taygrimacing.gif differ diff --git a/ruqqus/assets/images/emojis/tayhappy.gif b/ruqqus/assets/images/emojis/tayhappy.gif new file mode 100644 index 000000000..031cd717d Binary files /dev/null and b/ruqqus/assets/images/emojis/tayhappy.gif differ diff --git a/ruqqus/assets/images/emojis/tayheart.gif b/ruqqus/assets/images/emojis/tayheart.gif new file mode 100644 index 000000000..473c92ab5 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayheart.gif differ diff --git a/ruqqus/assets/images/emojis/tayhmm.gif b/ruqqus/assets/images/emojis/tayhmm.gif new file mode 100644 index 000000000..93dd094a0 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayhmm.gif differ diff --git a/ruqqus/assets/images/emojis/tayhuh.gif b/ruqqus/assets/images/emojis/tayhuh.gif new file mode 100644 index 000000000..78d1670bd Binary files /dev/null and b/ruqqus/assets/images/emojis/tayhuh.gif differ diff --git a/ruqqus/assets/images/emojis/tayhyperdab.gif b/ruqqus/assets/images/emojis/tayhyperdab.gif new file mode 100644 index 000000000..68508ffec Binary files /dev/null and b/ruqqus/assets/images/emojis/tayhyperdab.gif differ diff --git a/ruqqus/assets/images/emojis/tayjammin.gif b/ruqqus/assets/images/emojis/tayjammin.gif new file mode 100644 index 000000000..b3e6e9741 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayjammin.gif differ diff --git a/ruqqus/assets/images/emojis/taylaugh.gif b/ruqqus/assets/images/emojis/taylaugh.gif new file mode 100644 index 000000000..c892a6b1f Binary files /dev/null and b/ruqqus/assets/images/emojis/taylaugh.gif differ diff --git a/ruqqus/assets/images/emojis/taymindblown.gif b/ruqqus/assets/images/emojis/taymindblown.gif new file mode 100644 index 000000000..268b01af9 Binary files /dev/null and b/ruqqus/assets/images/emojis/taymindblown.gif differ diff --git a/ruqqus/assets/images/emojis/tayno.gif b/ruqqus/assets/images/emojis/tayno.gif new file mode 100644 index 000000000..930030331 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayno.gif differ diff --git a/ruqqus/assets/images/emojis/taynod.gif b/ruqqus/assets/images/emojis/taynod.gif new file mode 100644 index 000000000..d09b45d91 Binary files /dev/null and b/ruqqus/assets/images/emojis/taynod.gif differ diff --git a/ruqqus/assets/images/emojis/taypeace.gif b/ruqqus/assets/images/emojis/taypeace.gif new file mode 100644 index 000000000..ffa9ffce9 Binary files /dev/null and b/ruqqus/assets/images/emojis/taypeace.gif differ diff --git a/ruqqus/assets/images/emojis/taypray.gif b/ruqqus/assets/images/emojis/taypray.gif new file mode 100644 index 000000000..1e8410408 Binary files /dev/null and b/ruqqus/assets/images/emojis/taypray.gif differ diff --git a/ruqqus/assets/images/emojis/tayrun.gif b/ruqqus/assets/images/emojis/tayrun.gif new file mode 100644 index 000000000..fc8cd866a Binary files /dev/null and b/ruqqus/assets/images/emojis/tayrun.gif differ diff --git a/ruqqus/assets/images/emojis/tayscrunch.gif b/ruqqus/assets/images/emojis/tayscrunch.gif new file mode 100644 index 000000000..e9f99b2f4 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayscrunch.gif differ diff --git a/ruqqus/assets/images/emojis/tayshake.gif b/ruqqus/assets/images/emojis/tayshake.gif new file mode 100644 index 000000000..8981e2fa7 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayshake.gif differ diff --git a/ruqqus/assets/images/emojis/tayshrug.gif b/ruqqus/assets/images/emojis/tayshrug.gif new file mode 100644 index 000000000..bf97844f4 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayshrug.gif differ diff --git a/ruqqus/assets/images/emojis/taysilly.gif b/ruqqus/assets/images/emojis/taysilly.gif new file mode 100644 index 000000000..0909f6934 Binary files /dev/null and b/ruqqus/assets/images/emojis/taysilly.gif differ diff --git a/ruqqus/assets/images/emojis/tayslide.gif b/ruqqus/assets/images/emojis/tayslide.gif new file mode 100644 index 000000000..a21701f5b Binary files /dev/null and b/ruqqus/assets/images/emojis/tayslide.gif differ diff --git a/ruqqus/assets/images/emojis/taysmart.gif b/ruqqus/assets/images/emojis/taysmart.gif new file mode 100644 index 000000000..1e6b7416b Binary files /dev/null and b/ruqqus/assets/images/emojis/taysmart.gif differ diff --git a/ruqqus/assets/images/emojis/taystop.gif b/ruqqus/assets/images/emojis/taystop.gif new file mode 100644 index 000000000..3edf4f8e2 Binary files /dev/null and b/ruqqus/assets/images/emojis/taystop.gif differ diff --git a/ruqqus/assets/images/emojis/taytantrum.gif b/ruqqus/assets/images/emojis/taytantrum.gif new file mode 100644 index 000000000..0e392fc6c Binary files /dev/null and b/ruqqus/assets/images/emojis/taytantrum.gif differ diff --git a/ruqqus/assets/images/emojis/taytea.gif b/ruqqus/assets/images/emojis/taytea.gif new file mode 100644 index 000000000..ccb7ec1f8 Binary files /dev/null and b/ruqqus/assets/images/emojis/taytea.gif differ diff --git a/ruqqus/assets/images/emojis/taythink.gif b/ruqqus/assets/images/emojis/taythink.gif new file mode 100644 index 000000000..829d0b02c Binary files /dev/null and b/ruqqus/assets/images/emojis/taythink.gif differ diff --git a/ruqqus/assets/images/emojis/tayvibin.gif b/ruqqus/assets/images/emojis/tayvibin.gif new file mode 100644 index 000000000..841d96959 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayvibin.gif differ diff --git a/ruqqus/assets/images/emojis/taywhat.gif b/ruqqus/assets/images/emojis/taywhat.gif new file mode 100644 index 000000000..cb73d41e8 Binary files /dev/null and b/ruqqus/assets/images/emojis/taywhat.gif differ diff --git a/ruqqus/assets/images/emojis/taywine.gif b/ruqqus/assets/images/emojis/taywine.gif new file mode 100644 index 000000000..f8836da82 Binary files /dev/null and b/ruqqus/assets/images/emojis/taywine.gif differ diff --git a/ruqqus/assets/images/emojis/taywine2.gif b/ruqqus/assets/images/emojis/taywine2.gif new file mode 100644 index 000000000..5cdb5b49f Binary files /dev/null and b/ruqqus/assets/images/emojis/taywine2.gif differ diff --git a/ruqqus/assets/images/emojis/taywink.gif b/ruqqus/assets/images/emojis/taywink.gif new file mode 100644 index 000000000..6cd79eda3 Binary files /dev/null and b/ruqqus/assets/images/emojis/taywink.gif differ diff --git a/ruqqus/assets/images/emojis/tayyes.gif b/ruqqus/assets/images/emojis/tayyes.gif new file mode 100644 index 000000000..564871f71 Binary files /dev/null and b/ruqqus/assets/images/emojis/tayyes.gif differ diff --git a/ruqqus/assets/images/emojis/teehee.gif b/ruqqus/assets/images/emojis/teehee.gif new file mode 100644 index 000000000..de904bec7 Binary files /dev/null and b/ruqqus/assets/images/emojis/teehee.gif differ diff --git a/ruqqus/assets/images/emojis/tfwyougettrolled.gif b/ruqqus/assets/images/emojis/tfwyougettrolled.gif new file mode 100644 index 000000000..d658fc5f7 Binary files /dev/null and b/ruqqus/assets/images/emojis/tfwyougettrolled.gif differ diff --git a/ruqqus/assets/images/emojis/thinking.gif b/ruqqus/assets/images/emojis/thinking.gif new file mode 100644 index 000000000..8e8ea9b9f Binary files /dev/null and b/ruqqus/assets/images/emojis/thinking.gif differ diff --git a/ruqqus/assets/images/emojis/threesome.gif b/ruqqus/assets/images/emojis/threesome.gif new file mode 100644 index 000000000..5929c0ef7 Binary files /dev/null and b/ruqqus/assets/images/emojis/threesome.gif differ diff --git a/ruqqus/assets/images/emojis/throw.gif b/ruqqus/assets/images/emojis/throw.gif new file mode 100644 index 000000000..c1c5fd4ef Binary files /dev/null and b/ruqqus/assets/images/emojis/throw.gif differ diff --git a/ruqqus/assets/images/emojis/throwaway.gif b/ruqqus/assets/images/emojis/throwaway.gif new file mode 100644 index 000000000..5b9d050a2 Binary files /dev/null and b/ruqqus/assets/images/emojis/throwaway.gif differ diff --git a/ruqqus/assets/images/emojis/tickle.gif b/ruqqus/assets/images/emojis/tickle.gif new file mode 100644 index 000000000..3af0194a6 Binary files /dev/null and b/ruqqus/assets/images/emojis/tickle.gif differ diff --git a/ruqqus/assets/images/emojis/tomboy.gif b/ruqqus/assets/images/emojis/tomboy.gif new file mode 100644 index 000000000..0b8c1ee85 Binary files /dev/null and b/ruqqus/assets/images/emojis/tomboy.gif differ diff --git a/ruqqus/assets/images/emojis/trans.gif b/ruqqus/assets/images/emojis/trans.gif new file mode 100644 index 000000000..4c95fb627 Binary files /dev/null and b/ruqqus/assets/images/emojis/trans.gif differ diff --git a/ruqqus/assets/images/emojis/translord.gif b/ruqqus/assets/images/emojis/translord.gif new file mode 100644 index 000000000..767da3442 Binary files /dev/null and b/ruqqus/assets/images/emojis/translord.gif differ diff --git a/ruqqus/assets/images/emojis/transracial.gif b/ruqqus/assets/images/emojis/transracial.gif new file mode 100644 index 000000000..175e6a99e Binary files /dev/null and b/ruqqus/assets/images/emojis/transracial.gif differ diff --git a/ruqqus/assets/images/emojis/trollolol.gif b/ruqqus/assets/images/emojis/trollolol.gif new file mode 100644 index 000000000..1db001ee9 Binary files /dev/null and b/ruqqus/assets/images/emojis/trollolol.gif differ diff --git a/ruqqus/assets/images/emojis/truestorybro.gif b/ruqqus/assets/images/emojis/truestorybro.gif new file mode 100644 index 000000000..d67423c12 Binary files /dev/null and b/ruqqus/assets/images/emojis/truestorybro.gif differ diff --git a/ruqqus/assets/images/emojis/typing.gif b/ruqqus/assets/images/emojis/typing.gif new file mode 100644 index 000000000..9af51764f Binary files /dev/null and b/ruqqus/assets/images/emojis/typing.gif differ diff --git a/ruqqus/assets/images/emojis/uhuh.gif b/ruqqus/assets/images/emojis/uhuh.gif new file mode 100644 index 000000000..a4cd2dd62 Binary files /dev/null and b/ruqqus/assets/images/emojis/uhuh.gif differ diff --git a/ruqqus/assets/images/emojis/usa.gif b/ruqqus/assets/images/emojis/usa.gif new file mode 100644 index 000000000..475cdb3f7 Binary files /dev/null and b/ruqqus/assets/images/emojis/usa.gif differ diff --git a/ruqqus/assets/images/emojis/vampbat.gif b/ruqqus/assets/images/emojis/vampbat.gif new file mode 100644 index 000000000..7b8df7cb5 Binary files /dev/null and b/ruqqus/assets/images/emojis/vampbat.gif differ diff --git a/ruqqus/assets/images/emojis/viking.gif b/ruqqus/assets/images/emojis/viking.gif new file mode 100644 index 000000000..93591e747 Binary files /dev/null and b/ruqqus/assets/images/emojis/viking.gif differ diff --git a/ruqqus/assets/images/emojis/violin.gif b/ruqqus/assets/images/emojis/violin.gif new file mode 100644 index 000000000..ba2f4072d Binary files /dev/null and b/ruqqus/assets/images/emojis/violin.gif differ diff --git a/ruqqus/assets/images/emojis/vulgar.gif b/ruqqus/assets/images/emojis/vulgar.gif new file mode 100644 index 000000000..675974923 Binary files /dev/null and b/ruqqus/assets/images/emojis/vulgar.gif differ diff --git a/ruqqus/assets/images/emojis/wah.gif b/ruqqus/assets/images/emojis/wah.gif new file mode 100644 index 000000000..1c0617bbd Binary files /dev/null and b/ruqqus/assets/images/emojis/wah.gif differ diff --git a/ruqqus/assets/images/emojis/wat.gif b/ruqqus/assets/images/emojis/wat.gif new file mode 100644 index 000000000..72b255ac1 Binary files /dev/null and b/ruqqus/assets/images/emojis/wat.gif differ diff --git a/ruqqus/assets/images/emojis/whip.gif b/ruqqus/assets/images/emojis/whip.gif new file mode 100644 index 000000000..60ee5ae3e Binary files /dev/null and b/ruqqus/assets/images/emojis/whip.gif differ diff --git a/ruqqus/assets/images/emojis/whipping.gif b/ruqqus/assets/images/emojis/whipping.gif new file mode 100644 index 000000000..ed64f5267 Binary files /dev/null and b/ruqqus/assets/images/emojis/whipping.gif differ diff --git a/ruqqus/assets/images/emojis/wink.gif b/ruqqus/assets/images/emojis/wink.gif new file mode 100644 index 000000000..4b0e9e7a1 Binary files /dev/null and b/ruqqus/assets/images/emojis/wink.gif differ diff --git a/ruqqus/assets/images/emojis/witch.gif b/ruqqus/assets/images/emojis/witch.gif new file mode 100644 index 000000000..32b1cccc1 Binary files /dev/null and b/ruqqus/assets/images/emojis/witch.gif differ diff --git a/ruqqus/assets/images/emojis/wizard.gif b/ruqqus/assets/images/emojis/wizard.gif new file mode 100644 index 000000000..c5a73c50d Binary files /dev/null and b/ruqqus/assets/images/emojis/wizard.gif differ diff --git a/ruqqus/assets/images/emojis/woah.gif b/ruqqus/assets/images/emojis/woah.gif new file mode 100644 index 000000000..53836b14c Binary files /dev/null and b/ruqqus/assets/images/emojis/woah.gif differ diff --git a/ruqqus/assets/images/emojis/woo.gif b/ruqqus/assets/images/emojis/woo.gif new file mode 100644 index 000000000..ab611130b Binary files /dev/null and b/ruqqus/assets/images/emojis/woo.gif differ diff --git a/ruqqus/assets/images/emojis/work.gif b/ruqqus/assets/images/emojis/work.gif new file mode 100644 index 000000000..11e628892 Binary files /dev/null and b/ruqqus/assets/images/emojis/work.gif differ diff --git a/ruqqus/assets/images/emojis/worm.gif b/ruqqus/assets/images/emojis/worm.gif new file mode 100644 index 000000000..9eb80942b Binary files /dev/null and b/ruqqus/assets/images/emojis/worm.gif differ diff --git a/ruqqus/assets/images/emojis/worship.gif b/ruqqus/assets/images/emojis/worship.gif new file mode 100644 index 000000000..52e69df4c Binary files /dev/null and b/ruqqus/assets/images/emojis/worship.gif differ diff --git a/ruqqus/assets/images/emojis/wow.gif b/ruqqus/assets/images/emojis/wow.gif new file mode 100644 index 000000000..4b27f01d5 Binary files /dev/null and b/ruqqus/assets/images/emojis/wow.gif differ diff --git a/ruqqus/assets/images/emojis/xallthey.gif b/ruqqus/assets/images/emojis/xallthey.gif new file mode 100644 index 000000000..bec2859d6 Binary files /dev/null and b/ruqqus/assets/images/emojis/xallthey.gif differ diff --git a/ruqqus/assets/images/emojis/yay.gif b/ruqqus/assets/images/emojis/yay.gif new file mode 100644 index 000000000..970268cb5 Binary files /dev/null and b/ruqqus/assets/images/emojis/yay.gif differ diff --git a/ruqqus/assets/images/emojis/yuno.gif b/ruqqus/assets/images/emojis/yuno.gif new file mode 100644 index 000000000..9f4456030 Binary files /dev/null and b/ruqqus/assets/images/emojis/yuno.gif differ diff --git a/ruqqus/assets/images/emojis/zoomer.gif b/ruqqus/assets/images/emojis/zoomer.gif new file mode 100644 index 000000000..69220eeb1 Binary files /dev/null and b/ruqqus/assets/images/emojis/zoomer.gif differ diff --git a/ruqqus/assets/images/emojis/zoomersoy.gif b/ruqqus/assets/images/emojis/zoomersoy.gif new file mode 100644 index 000000000..5f92db30b Binary files /dev/null and b/ruqqus/assets/images/emojis/zoomersoy.gif differ diff --git a/ruqqus/assets/images/emojis/zzz.gif b/ruqqus/assets/images/emojis/zzz.gif new file mode 100644 index 000000000..5b7e2e57b Binary files /dev/null and b/ruqqus/assets/images/emojis/zzz.gif differ diff --git a/ruqqus/assets/images/favicon.png b/ruqqus/assets/images/favicon.png new file mode 100644 index 000000000..cfd55ab5e Binary files /dev/null and b/ruqqus/assets/images/favicon.png differ diff --git a/ruqqus/assets/images/nsfw.png b/ruqqus/assets/images/nsfw.png new file mode 100644 index 000000000..2d32aa768 Binary files /dev/null and b/ruqqus/assets/images/nsfw.png differ diff --git a/ruqqus/assets/images/platy.jpg b/ruqqus/assets/images/platy.jpg new file mode 100644 index 000000000..4f305cee6 Binary files /dev/null and b/ruqqus/assets/images/platy.jpg differ diff --git a/ruqqus/assets/images/preview.png b/ruqqus/assets/images/preview.png new file mode 100644 index 000000000..7783082e6 Binary files /dev/null and b/ruqqus/assets/images/preview.png differ diff --git a/ruqqus/assets/images/ruckus.png b/ruqqus/assets/images/ruckus.png new file mode 100644 index 000000000..e3cb809ff Binary files /dev/null and b/ruqqus/assets/images/ruckus.png differ diff --git a/ruqqus/assets/images/seized.png b/ruqqus/assets/images/seized.png new file mode 100644 index 000000000..2616b1b37 Binary files /dev/null and b/ruqqus/assets/images/seized.png differ diff --git a/ruqqus/assets/js/all_js.js b/ruqqus/assets/js/all_js.js new file mode 100644 index 000000000..29decacc0 --- /dev/null +++ b/ruqqus/assets/js/all_js.js @@ -0,0 +1,1487 @@ +// Using mouse + +document.body.addEventListener('mousedown', function() { + document.body.classList.add('using-mouse'); +}); + +document.body.addEventListener('keydown', function(event) { + if (event.keyCode === 9) { + document.body.classList.remove('using-mouse'); + } +}); + +// 2FA toggle modal + +$('#2faModal').on('hidden.bs.modal', function () { + + var box = document.getElementById("2faToggle"); + + box.checked = !box.checked; + +}); + +//email change + +// Show confirm password field when user clicks email box + +$('#new_email').on('input', function () { + + var id = document.getElementById("email-password"); + var id2 = document.getElementById("email-password-label"); + var id3 = document.getElementById("emailpasswordRequired"); + + id.classList.remove("d-none"); + id2.classList.remove("d-none"); + id3.classList.remove("d-none"); + +}); + +//GIFS + + // Identify which comment form to insert GIF into + + var commentFormID; + + function commentForm(form) { + commentFormID = form; + }; + + + // Insert EMOJI markdown into comment box function + + function getEmoji(searchTerm, form) { + + var emoji = ' :'+searchTerm+': ' + + var commentBox = document.getElementById(form); + + var old = commentBox.value; + + commentBox.value = old + emoji; + + } + + function loadEmojis(form) { + + const emojis = [ + { + type:'platy', + emojis: ['platyblush','platybruh','platycaveman','platycheer','platydown','platyeyes','platyheart','platylol','platymicdrop','platynooo','platysalute','platyseethe','platythumbsup','platywave'] + }, + { + type:'marsey', + emojis: ['marseysipping', 'marseyjamming','marseyangel','marseyblowkiss','marseycry','marseydead','marseyexcited','marseygift','marseyinabox','marseylaugh','marseylove','marseymad','marseyparty','marseyrain','marseyreading','marseyready','marseysad','marseyscarf','marseyshook','marseysleep','marseythumbsup','marseywave', 'marsey69', 'marseycomrade', 'marseyira', 'marseyisis', 'marseymerchant', 'marseynut', 'marseyreich', 'marseyglam', 'marseycowboy', 'marseypat', 'marseypanties', 'marseybingus', 'marseydepressed', 'marseygift'] + }, + { + type:'tay', + emojis: ['tayaaa','tayadmire','taycat','taycelebrate','taychefkiss','taychristmas','tayclap','taycold','taycrown','tayflex','tayflirt','taygrimacing','tayhappy','tayheart','tayhmm','tayhuh','tayhyperdab','tayjammin','taylaugh','taymindblown','tayno','taynod','taypeace','taypray','tayrun','tayscrunch','tayshake','tayshrug','taysilly','tayslide','taysmart','taystop','taytantrum','taytea','taythink','tayvibin','taywhat','taywine','taywine2','taywink','tayyes'] + }, + { + type:'classic', + emojis: ['2thumbsup','aliendj','ambulance','angry','angrywhip','argue','aroused','ashamed','badass','banana','band','banghead','batman','bigeyes','bite','blind','blowkiss','blush','bong','bounce','bow','breakheart','bs','cartwheel','cat','celebrate','chainsaw','cheers','clap','cold','confused','crazyeyes','cry','cthulhu','cute','D','daydream','ddr','deadpool','devilsmile','diddle','die','distress','disturbing','dizzy','domo','doughboy','drink','drool','dudeweedlmao','edward','electro','elephant','embarrassed','emo','emo2','evil','evilclown','evilgrin','facepalm','fap','flamethrower','flipbird','flirt','frown','gasp','glomp','go','gooby','grr','gtfo','guitar','haha','handshake','happydance','headbang','heart','heartbeat','hearts','highfive','hmm','hmph','holdhands','horny','hug','hugging','hugs','hump','humpbed','hysterical','ily','inlove','jason','jawdrop','jedi','jester','kaboom','kick','kiss','kitty','laughchair','lick','link','lol','lolbeat','loving','makeout','medal','megaman','megamanguitar','meow','metime','mooning','mummy','na','nauseous','nervous','ninja','nod','nono','omg','onfire','ooo','orly','p','paddle','panda','pandabutt','paranoid','party','pat','peek','pikachu','pimp','plzdie','poke','popcorn','pout','probe','puke','punch','quote','raccoon','roar','rofl','roflmao','rolleyes','sad','sadeyes','sadhug','samurai','sarcasm','scoot','scream','shmoopy','shrug','skull','slap','slapfight','sleepy','smackfish','smackhead','smh','smile','smoke','sonic','spank','sparta','sperm','spiderman','stab','star','stare','stfu','suicide','surprisehug','suspicious','sweat','swordfight','taco','talk2hand','tantrum','teehee','thinking','threesome','throw','throwaway','tickle','typing','uhuh','vampbat','viking','violin','vulgar','wah','wat','whip','whipping','wink','witch','wizard','woah','worm','woo','work','worship','wow','XD','yay','zzz'] + }, + { + type:'rage', + emojis: ['bitchplease','cerealguypart2','challengeaccepted','contentiouscereal','cryingatcuteness','derp','derpcornsyrup','derpcrying','derpcute','derpdumb','derpeuphoria','derpinahd','derpinapokerface','derpinasnickering','derpprocessing','derprealization','derpsnickering','derptalking','derpthinking','derpthumbsup','derpunimpressed','derpwhy','donotwant','epicfacefeatures','fancywithwine','fffffffuuuuuuuuuuuu','flipthetable','foreveralone','foreveralonehappy','hewillnever','idontknow','interuptedreading','iseewhatyoudidthere','killherkillher','ledesire','leexcited','legenius','lelolidk','lemiddlefinger','lemindblown','leokay','lepanicrunning','lepokerface','lepokerface2','lerageface','leseriousface','likeaboss','lolface','longwhiskers','manymiddlefingers','megusta','motherfucker','motherofgod','mysides','ohgodwhy','pervertedspiderman','picard','ragestrangle','rukiddingme','tfwyougettrolled','trollolol','truestorybro','xallthey','yuno'] + }, + { + type:'wojak', + emojis: ['abusivewife','ancap','bardfinn','bloomer','boomer','boomermonster','brainletbush','brainletcaved','brainletchair','brainletchest','brainletmaga','brainletpit','chad','chadarab','chadasian','chadblack','chadjesus','chadjew','chadjihadi','chadlatino','chadlibleft','chadnordic','chadsikh','chadusa','coomer','doomer','doomerfront','doomergirl','ethot','fatbrain','fatpriest','femboy','gogetter','grug','monke','nazijak','npc','npcfront','npcmaga','psychojak','ragejak','ragemask','ramonajak','soyjackwow','soyjak','soyjakfront','soyjakhipster','soyjakmaga','soyjakyell','tomboy','zoomer','zoomersoy'] + }, + { + type:'flags', + emojis: ['animesexual','blacknation','blm','blueline','dreamgender','fatpride','incelpride','israel','landlordlove','scalperpride','superstraight','trans','translord','transracial','usa'] + } + ] + + for (i=0; i < emojis.length; i++) { + + let container = document.getElementById(`EMOJIS_${emojis[i].type}`) + let str = '' + let arr = emojis[i].emojis + + for (j=0; j < arr.length; j++) { + str += ``; + } + + container.innerHTML = str + } + } + + + function getGif(searchTerm) { + + if (searchTerm !== undefined) { + document.getElementById('gifSearch').value = searchTerm; + } + else { + document.getElementById('gifSearch').value = null; + } + + // load more gifs div + var loadGIFs = document.getElementById('gifs-load-more'); + + // error message div + var noGIFs = document.getElementById('no-gifs-found'); + + // categories div + var cats = document.getElementById('GIFcats'); + + // container div + var container = document.getElementById('GIFs'); + + // modal body div + var modalBody = document.getElementById('gif-modal-body') + + // UI buttons + var backBtn = document.getElementById('gifs-back-btn'); + var cancelBtn = document.getElementById('gifs-cancel-btn'); + + container.innerHTML = ''; + + if (searchTerm == undefined) { + container.innerHTML = '
Agree
Laugh
Confused
Sad
Happy
Awesome
Yes
No
Love
Please
Scared
Angry
Awkward
Cringe
OMG
Why
Gross
Meh
' + backBtn.innerHTML = null; + cancelBtn.innerHTML = null; + noGIFs.innerHTML = null; + loadGIFs.innerHTML = null; + } else { + backBtn.innerHTML = ''; + + cancelBtn.innerHTML = ''; + + let gifs = []; + let apiKey = tenor_api_key(); + let lmt = 25; + let url = "https://g.tenor.com/v1/search/?q=" + searchTerm + "&key=" + apiKey + "&limit=" + lmt; + fetch(url) + .then(response => { + return response.json(); + }) + .then(json => { + let results = json.results.map(function(obj) { + return { + id: obj.id, + preview: obj.media[0].tinygif.url, + url: obj.media[0].gif.url, + source: obj.url, + bgColor: obj.bg_color + } + }); + + gifs = results + + // loop for fetching mutliple GIFs and creating the card divs + if (gifs.length) { + for (var i = 0; i < gifs.length; i++) { + container.innerHTML += ('
'); + noGIFs.innerHTML = null; + loadGIFs.innerHTML = '

Thou've reached the end of the list!

'; + } + } else { + noGIFs.innerHTML = '

Aw shucks. No GIFs found...

'; + container.innerHTML = null; + loadGIFs.innerHTML = null; + } + }) + .catch(err => alert(err)); + }; + } + // Insert GIF markdown into comment box function + + function insertGIF(url,form) { + + var gif = "![](" + url +")"; + + var commentBox = document.getElementById(form); + + var old = commentBox.value; + + commentBox.value = old + gif; + + } + + // When GIF keyboard is hidden, hide all GIFs + + $('#gifModal').on('hidden.bs.modal', function (e) { + + document.getElementById('gifSearch').value = null; + + // load more gifs div + + var loadGIFs = document.getElementById('gifs-load-more'); + + // no GIFs div + + var noGIFs = document.getElementById('no-gifs-found'); + + // container div + + var container = document.getElementById('GIFs'); + + // UI buttons + + var backBtn = document.getElementById('gifs-back-btn'); + + var cancelBtn = document.getElementById('gifs-cancel-btn'); + + // Remove inner HTML from container var + + container.innerHTML = '
Agree
Laugh
Confused
Sad
Happy
Awesome
Yes
No
Love
Please
Scared
Angry
Awkward
Cringe
OMG
Why
Gross
Meh
' + + // Hide UI buttons + + backBtn.innerHTML = null; + + cancelBtn.innerHTML = null; + + // Remove inner HTML from no gifs div + + noGIFs.innerHTML = null; + + // Hide no more gifs div + + loadGIFs.innerHTML = null; + + }); + +// comment collapse + +// Toggle comment collapse + +function collapse_comment(comment_id) { + + var comment = "comment-" + comment_id; + + document.getElementById(comment).classList.toggle("collapsed"); + +}; + +//Commenting form + +// Expand comment box on focus, hide otherwise + +$('.comment-box').focus(function (event) { + event.preventDefault(); + + $(this).parent().parent().addClass("collapsed"); + +}); + +// Comment edit form + +toggleEdit=function(id){ + comment=document.getElementById("comment-text-"+id); + form=document.getElementById("comment-edit-"+id); + box=document.getElementById('edit-box-comment-'+id); + actions = document.getElementById('comment-' + id +'-actions'); + + comment.classList.toggle("d-none"); + form.classList.toggle("d-none"); + actions.classList.toggle("d-none"); + autoExpand(box); +}; + +// Post edit form + +togglePostEdit=function(id){ + + body=document.getElementById("post-body"); + title=document.getElementById("post-title"); + form=document.getElementById("edit-post-body-"+id); + box=document.getElementById("post-edit-box-"+id); + box2=document.getElementById("post-edit-box2-"+id); + + body.classList.toggle("d-none"); + title.classList.toggle("d-none"); + form.classList.toggle("d-none"); + autoExpand(box); + autoExpand(box2); +}; + +//comment modding +function removeComment(post_id) { + url="/api/ban_comment/"+post_id + + callback=function(){ + document.getElementById("comment-"+post_id+"-only").classList.add("banned"); + + button=document.getElementById("moderate-"+post_id); + button.onclick=function(){approveComment(post_id)}; + button.innerHTML='Approve' + } + post(url, callback, "Comment has been removed.") +}; + +function approveComment(post_id) { + url="/api/unban_comment/"+post_id + + callback=function(){ + document.getElementById("comment-"+post_id+"-only").classList.remove("banned"); + + button=document.getElementById("moderate-"+post_id); + button.onclick=function(){removeComment(post_id)}; + button.innerHTML='Remove' + } + + post(url, callback, "Comment has been approved.") +} + +admin_comment=function(cid){ + + + var xhr = new XMLHttpRequest(); + xhr.open("post", "/api/distinguish_comment/"+cid); + + var form = new FormData(); + + form.append('formkey', formkey()); + + xhr.withCredentials=true; + xhr.onload=function(){ + if (xhr.status==200) { + comment=document.getElementById('comment-'+cid+'-only'); + comment.innerHTML=JSON.parse(xhr.response)["html"]; + } + else { + var commentError = document.getElementById("comment-error-text"); + $('#toast-comment-success').toast('dispose'); + $('#toast-comment-error').toast('dispose'); + $('#toast-comment-error').toast('show'); + commentError.textContent = JSON.parse(xhr.response)["error"]; + } + } + xhr.send(form) +} + +//Autoexpand textedit comments + +function autoExpand (field) { + + //get current scroll position + xpos=window.scrollX; + ypos=window.scrollY; + + // Reset field height + field.style.height = 'inherit'; + + // Get the computed styles for the element + var computed = window.getComputedStyle(field); + + // Calculate the height + var height = parseInt(computed.getPropertyValue('border-top-width'), 10) + + parseInt(computed.getPropertyValue('padding-top'), 10) + + field.scrollHeight + + parseInt(computed.getPropertyValue('padding-bottom'), 10) + + parseInt(computed.getPropertyValue('border-bottom-width'), 10) + + 32; + + field.style.height = height + 'px'; + + //keep window position from changing + window.scrollTo(xpos,ypos); + +}; + +document.addEventListener('input', function (event) { + if (event.target.tagName.toLowerCase() !== 'textarea') return; + autoExpand(event.target); +}, false); + +// Delete Post + +function delete_postModal(id) { + + // Passed data for modal + + document.getElementById("deletePostButton-mobile").addEventListener("click", delete_post); + + document.getElementById("deletePostButton").addEventListener("click", delete_post); + + function delete_post(){ + + this.innerHTML='Deleting post'; + this.disabled = true; + post('/delete_post/' + id, + callback = function() { + + location.reload(); + } + ) + } + +}; + +// Delete Comment + +function delete_commentModal(id) { + + // Passed data for modal + + document.getElementById("deleteCommentButton").onclick = function() { + + this.innerHTML='Deleting comment'; + this.disabled = true; + post('/delete/comment/' + id, + callback = function() { + + location.reload(); + } + ) + } + +}; + +//Email verification text + +function emailVerifyText() { + + document.getElementById("email-verify-text").innerHTML = "Verification email sent! Please check your inbox."; + +} + +//flagging +// Flag Comment + +report_commentModal = function(id, author) { + + document.getElementById("comment-author").textContent = author; + + //offtopic.disabled=true; + + document.getElementById("reportCommentButton").onclick = function() { + + this.innerHTML='Reporting comment'; + this.disabled = true; + post('/api/flag/comment/' + id, + callback = function() { + + document.getElementById("reportCommentFormBefore").classList.add('d-none'); + document.getElementById("reportCommentFormAfter").classList.remove('d-none'); + } + ) + } + +}; + +$('#reportCommentModal').on('hidden.bs.modal', function () { + + var button = document.getElementById("reportCommentButton"); + + var beforeModal = document.getElementById("reportCommentFormBefore"); + var afterModal = document.getElementById("reportCommentFormAfter"); + + button.innerHTML='Report comment'; + button.disabled= false; + afterModal.classList.add('d-none'); + + if ( beforeModal.classList.contains('d-none') ) { + beforeModal.classList.remove('d-none'); + } + +}); + + +// Flag Submission + +report_postModal = function(id, author, board) { + + document.getElementById("post-author").textContent = author; + + selectbox=document.getElementById('report-type-dropdown'); + selectbox.value='reason_not_selected'; + + submitbutton=document.getElementById("reportPostButton"); + submitbutton.disabled=true; + + submitbutton.onclick = function() { + + this.innerHTML='Reporting post'; + this.disabled = true; + + var xhr = new XMLHttpRequest(); + xhr.open("POST", '/api/flag/post/'+id, true); + var form = new FormData() + form.append("formkey", formkey()); + + dropdown=document.getElementById("report-type-dropdown"); + form.append("report_type", dropdown.options[dropdown.selectedIndex].value); + + xhr.withCredentials=true; + + xhr.onload=function() { + document.getElementById("reportPostFormBefore").classList.add('d-none'); + document.getElementById("reportPostFormAfter").classList.remove('d-none'); + }; + + xhr.onerror=function(){alert(errortext)}; + xhr.send(form); + + } +}; + +$('#reportPostModal').on('hidden.bs.modal', function () { + + var button = document.getElementById("reportPostButton"); + + var beforeModal = document.getElementById("reportPostFormBefore"); + var afterModal = document.getElementById("reportPostFormAfter"); + + button.innerHTML='Report post'; + button.disabled= false; + + afterModal.classList.add('d-none'); + + if ( beforeModal.classList.contains('d-none') ) { + beforeModal.classList.remove('d-none'); + } + +}); + +//enlarge thumbs +// Enlarge submissionlisting thumbnail + +enlarge_thumb = function(post_id) { + + document.getElementById(post_id).classList.toggle("enlarged"); + +}; + +//iOS webapp stuff + +(function(document,navigator,standalone) { + // prevents links from apps from oppening in mobile safari + // this javascript must be the first script in your + if ((standalone in navigator) && navigator[standalone]) { + var curnode, location=document.location, stop=/^(a|html)$/i; + document.addEventListener('click', function(e) { + curnode=e.target; + while (!(stop).test(curnode.nodeName)) { + curnode=curnode.parentNode; + } + // Condidions to do this only on links to your own app + // if you want all links, use if('href' in curnode) instead. + if('href' in curnode && ( curnode.href.indexOf('http') || ~curnode.href.indexOf(location.host) ) ) { + e.preventDefault(); + location.href = curnode.href; + } + },false); + } + })(document,window.navigator,'standalone'); + +//POST + +function post(url, callback, errortext) { + var xhr = new XMLHttpRequest(); + xhr.open("POST", url, true); + var form = new FormData() + form.append("formkey", formkey()); + xhr.withCredentials=true; + xhr.onerror=function() { alert(errortext); }; + xhr.onload = function() { + if (xhr.status >= 200 && xhr.status < 300) { + callback(); + } else { + xhr.onerror(); + } + }; + xhr.send(form); +}; + +function post_toast(url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open("POST", url, true); + var form = new FormData() + form.append("formkey", formkey()); + xhr.withCredentials=true; + + xhr.onload = function() { + if (xhr.status==204) {} + else if (xhr.status >= 200 && xhr.status < 300) { + $('#toast-post-success').toast('dispose'); + $('#toast-post-success').toast('show'); + document.getElementById('toast-post-success-text').innerText = JSON.parse(xhr.response)["message"]; + callback(xhr) + return true + + } else if (xhr.status >= 300 && xhr.status < 400) { + window.location.href = JSON.parse(xhr.response)["redirect"] + } else { + data=JSON.parse(xhr.response); + + $('#toast-post-error').toast('dispose'); + $('#toast-post-error').toast('show'); + document.getElementById('toast-post-error-text').innerText = data["error"]; + return false + + } + }; + + xhr.send(form); + + } + +//Element deleter + +function deleteElement(eid) { + x=document.getElementById(eid) + x.parentElement.removeChild(x) + +} + + +//Signup js +// Display username and password requirements on input + +$('#password-register').on('input', function () { + + var charCount = document.getElementById("password-register").value; + var id = document.getElementById("passwordHelpRegister"); + var successID = document.getElementById("passwordHelpSuccess"); + + if (charCount.length >= 8) { + id.classList.add("d-none"); + successID.classList.remove("d-none"); + } + else { + id.classList.remove("d-none"); + successID.classList.add("d-none"); + }; + +}); + +// Check username length, special chars + +$('#username-register').on('input', function () { + + var charCount = document.getElementById("username-register").value; + var id = document.getElementById("usernameHelpRegister"); + var successID = document.getElementById("usernameHelpSuccess"); + + var ruqqusAPI = '/api/is_available/' + charCount; + + if (charCount.length >= 3) { + + $.getJSON(ruqqusAPI, function(result) { + $.each(result, function(i, field) { + if (field == false) { + id.innerHTML = 'Username already taken :('; + } + }); + }); + + } + + if (!/[^a-zA-Z0-9_\-$]/.test(charCount)) { + // Change alert text + id.innerHTML = 'Username is a-okay!'; + + if (charCount.length < 3) { + id.innerHTML = 'Username must be at least 3 characters long.'; + } + else if (charCount.length > 25) { + id.innerHTML = 'Username must be 25 characters or less.'; + } + } + else { + id.innerHTML = 'No special characters or spaces allowed.'; + }; + +}); + +// Search Icon +// Change navbar search icon when form is in focus, active states + +$(".form-control").focus(function () { + $(this).prev('.input-group-append').removeClass().addClass('input-group-append-focus'); + $(this).next('.input-group-append').removeClass().addClass('input-group-append-focus'); +}); + +$(".form-control").focusout(function () { + $(this).prev('.input-group-append-focus').removeClass().addClass('input-group-append'); + $(this).next('.input-group-append-focus').removeClass().addClass('input-group-append'); +}); + +//spinner effect + +$(document).ready(function() { + $('#login').submit(function() { + // disable button + $("#login_button").prop("disabled", true); + // add spinner to button + $("#login_button").html('Signing in'); + }); +}); + +$(document).ready(function() { + $('#signup').submit(function() { + // disable button + $("#register_button").prop("disabled", true); + // add spinner to button + $("#register_button").html('Registering'); + }); +}); + +$(document).ready(function() { + $('#submitform').submit(function() { + // disable button + $("#create_button").prop("disabled", true); + // add spinner to button + $("#create_button").html('Creating post'); + }); +}); + +// Voting + +var upvote = function(event) { + + var type = event.target.dataset.contentType; + var id = event.target.dataset.idUp; + + var downvoteButton = document.getElementsByClassName(type + '-' + id + '-down'); + var upvoteButton = document.getElementsByClassName(type + '-' + id + '-up'); + var scoreText = document.getElementsByClassName(type + '-score-' + id); + + for (var j = 0; j < upvoteButton.length && j < downvoteButton.length && j < scoreText.length; j++) { + + var thisUpvoteButton = upvoteButton[j]; + var thisDownvoteButton = downvoteButton[j]; + var thisScoreText = scoreText[j]; + var thisScore = Number(thisScoreText.textContent); + + if (thisUpvoteButton.classList.contains('active')) { + thisUpvoteButton.classList.remove('active') + thisScoreText.textContent = thisScore - 1 + voteDirection = "0" + } else if (thisDownvoteButton.classList.contains('active')) { + thisUpvoteButton.classList.add('active') + thisDownvoteButton.classList.remove('active') + thisScoreText.textContent = thisScore + 2 + voteDirection = "1" + } else { + thisUpvoteButton.classList.add('active') + thisScoreText.textContent = thisScore + 1 + voteDirection = "1" + } + + if (thisUpvoteButton.classList.contains('active')) { + thisScoreText.classList.add('score-up') + thisScoreText.classList.remove('score-down') + thisScoreText.classList.remove('score') + } else if (thisDownvoteButton.classList.contains('active')) { + thisScoreText.classList.add('score-down') + thisScoreText.classList.remove('score-up') + thisScoreText.classList.remove('score') + } else { + thisScoreText.classList.add('score') + thisScoreText.classList.remove('score-up') + thisScoreText.classList.remove('score-down') + } + } + + post_toast("/api/vote/" + type + "/" + id + "/" + voteDirection); + +} + +var downvote = function(event) { + + var type = event.target.dataset.contentType; + var id = event.target.dataset.idDown; + + var downvoteButton = document.getElementsByClassName(type + '-' + id + '-down'); + var upvoteButton = document.getElementsByClassName(type + '-' + id + '-up'); + var scoreText = document.getElementsByClassName(type + '-score-' + id); + + for (var j = 0; j < upvoteButton.length && j < downvoteButton.length && j < scoreText.length; j++) { + + var thisUpvoteButton = upvoteButton[j]; + var thisDownvoteButton = downvoteButton[j]; + var thisScoreText = scoreText[j]; + var thisScore = Number(thisScoreText.textContent); + + if (thisDownvoteButton.classList.contains('active')) { + thisDownvoteButton.classList.remove('active') + thisScoreText.textContent = thisScore + 1 + voteDirection = "0" + } else if (thisUpvoteButton.classList.contains('active')) { + thisDownvoteButton.classList.add('active') + thisUpvoteButton.classList.remove('active') + thisScoreText.textContent = thisScore - 2 + voteDirection = "-1" + } else { + thisDownvoteButton.classList.add('active') + thisScoreText.textContent = thisScore - 1 + voteDirection = "-1" + } + + if (thisUpvoteButton.classList.contains('active')) { + thisScoreText.classList.add('score-up') + thisScoreText.classList.remove('score-down') + thisScoreText.classList.remove('score') + } else if (thisDownvoteButton.classList.contains('active')) { + thisScoreText.classList.add('score-down') + thisScoreText.classList.remove('score-up') + thisScoreText.classList.remove('score') + } else { + thisScoreText.classList.add('score') + thisScoreText.classList.remove('score-up') + thisScoreText.classList.remove('score-down') + } + } + + post_toast("/api/vote/" + type + "/" + id + "/" + voteDirection); + +} + + +var register_votes = function() { + var upvoteButtons = document.getElementsByClassName('upvote-button') + + var downvoteButtons = document.getElementsByClassName('downvote-button') + + var voteDirection = 0 + + for (var i = 0; i < upvoteButtons.length; i++) { + upvoteButtons[i].addEventListener('click', upvote, false); + upvoteButtons[i].addEventListener('keydown', function(event) { + if (event.keyCode === 13) { + upvote(event) + } + }, false) + }; + + for (var i = 0; i < downvoteButtons.length; i++) { + downvoteButtons[i].addEventListener('click', downvote, false); + downvoteButtons[i].addEventListener('keydown', function(event) { + if (event.keyCode === 13) { + downvote(event) + } + }, false) + }; +} + +register_votes() + +function vote_comment(comment_id, direction) { + url="/api/vote/comment/"+ comment_id +"/"+direction; + + callback=function(){ + thing = document.getElementById("comment-"+ comment_id+"-actions"); + uparrow1=document.getElementById("comment-"+ comment_id +"-up"); + downarrow1=document.getElementById("comment-"+ comment_id +"-down"); + scoreup1=document.getElementById("comment-"+ comment_id +"-score-up"); + scorenone1=document.getElementById("comment-"+ comment_id +"-score-none"); + scoredown1=document.getElementById("comment-"+ comment_id +"-score-down"); + + if (direction=="1") { + thing.classList.add("upvoted"); + thing.classList.remove("downvoted"); + uparrow1.onclick=function(){vote_comment(comment_id, 0)}; + downarrow1.onclick=function(){vote_comment(comment_id, -1)}; + scoreup1.classList.remove("d-none"); + scorenone1.classList.add("d-none"); + scoredown1.classList.add("d-none"); + } + else if (direction=="-1"){ + thing.classList.remove("upvoted"); + thing.classList.add("downvoted"); + uparrow1.onclick=function(){vote_comment(comment_id, 1)}; + downarrow1.onclick=function(){vote_comment(comment_id, 0)}; + scoreup1.classList.add("d-none"); + scorenone1.classList.add("d-none"); + scoredown1.classList.remove("d-none"); + } + else if (direction=="0"){ + thing.classList.remove("upvoted"); + thing.classList.remove("downvoted"); + uparrow1.onclick=function(){vote_comment(comment_id, 1)}; + downarrow1.onclick=function(){vote_comment(comment_id, -1)}; + scoreup1.classList.add("d-none"); + scorenone1.classList.remove("d-none"); + scoredown1.classList.add("d-none"); + } + } + + post(url, callback, "Unable to vote at this time. Please try again later."); +} + +//yt embed + +function getId(url) { + var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/; + var match = url.match(regExp); + + if (match && match[2].length == 11) { + return match[2]; + } else { + return 'error'; + } +} + +var myUrl = $('#embedURL').text(); + +myId = getId(myUrl); + +$('#ytEmbed').html(''); + + +// Expand Images on Desktop + +function expandDesktopImage(image, link) { + +// Link text + +var linkText = document.getElementById("desktop-expanded-image-link"); +var imgLink = document.getElementById("desktop-expanded-image-wrap-link"); + +var inlineImage = document.getElementById("desktop-expanded-image"); + +inlineImage.src = image.replace("100w.gif", "giphy.gif"); +linkText.href = image; +imgLink.href=image; + +if (image.includes("i.ruqqus.ga")) { + linkText.textContent = 'Go to website'; +} +else { + linkText.textContent = 'View original'; +} +}; + +// When image modal is closed + +$('#expandImageModal').on('hidden.bs.modal', function (e) { + + // remove image src and link + + document.getElementById("desktop-expanded-image").src = ''; + + document.getElementById("desktop-expanded-image-link").href = ''; + +}); + +// Text Formatting + +// Bold Text + +makeBold = function (form) { + var text = document.getElementById(form); + var startIndex = text.selectionStart, + endIndex = text.selectionEnd; + var selectedText = text.value.substring(startIndex, endIndex); + + var format = '**' + + if (selectedText.includes('**')) { + text.value = selectedText.replace(/\*/g, ''); + + } + else if (selectedText.length == 0) { + text.value = text.value.substring(0, startIndex) + selectedText + text.value.substring(endIndex); + } + else { + text.value = text.value.substring(0, startIndex) + format + selectedText + format + text.value.substring(endIndex); + } +} + +// Italicize Comment Text + +makeItalics = function (form) { + var text = document.getElementById(form); + var startIndex = text.selectionStart, + endIndex = text.selectionEnd; + var selectedText = text.value.substring(startIndex, endIndex); + + var format = '*' + + if (selectedText.includes('*')) { + text.value = selectedText.replace(/\*/g, ''); + + } + else if (selectedText.length == 0) { + text.value = text.value.substring(0, startIndex) + selectedText + text.value.substring(endIndex); + } + else { + text.value = text.value.substring(0, startIndex) + format + selectedText + format + text.value.substring(endIndex); + } +} + +// Quote Comment Text + +makeQuote = function (form) { + var text = document.getElementById(form); + var startIndex = text.selectionStart, + endIndex = text.selectionEnd; + var selectedText = text.value.substring(startIndex, endIndex); + + var format = '>' + + if (selectedText.includes('>')) { + text.value = text.value.substring(0, startIndex) + selectedText.replace(/\>/g, '') + text.value.substring(endIndex); + + } + else if (selectedText.length == 0) { + text.value = text.value.substring(0, startIndex) + selectedText + text.value.substring(endIndex); + } + else { + text.value = text.value.substring(0, startIndex) + format + selectedText + text.value.substring(endIndex); + } +} + +// Character Count + +function charLimit(form, text) { + + var input = document.getElementById(form); + + var text = document.getElementById(text); + + var length = input.value.length; + + var maxLength = input.getAttribute("maxlength"); + + if (length >= maxLength) { + text.style.color = "#E53E3E"; + } + else if (length >= maxLength * .72){ + text.style.color = "#FFC107"; + } + else { + text.style.color = "#A0AEC0"; + } + + text.innerText = maxLength - length; + +} + +// Mobile bottom navigation bar + +window.onload = function () { + var prevScrollpos = window.pageYOffset; + window.onscroll = function () { + var currentScrollPos = window.pageYOffset; + + var topBar = document.getElementById("fixed-bar-mobile"); + + var bottomBar = document.getElementById("mobile-bottom-navigation-bar"); + + var dropdown = document.getElementById("mobileSortDropdown"); + + var navbar = document.getElementById("navbar"); + + if (bottomBar != null) { + if (prevScrollpos > currentScrollPos && (window.innerHeight + currentScrollPos) < (document.body.offsetHeight - 65)) { + bottomBar.style.bottom = "0px"; + } + else if (currentScrollPos <= 125 && (window.innerHeight + currentScrollPos) < (document.body.offsetHeight - 65)) { + bottomBar.style.bottom = "0px"; + } + else if (prevScrollpos > currentScrollPos && (window.innerHeight + currentScrollPos) >= (document.body.offsetHeight - 65)) { + bottomBar.style.bottom = "-50px"; + } + else { + bottomBar.style.bottom = "-50px"; + } + } + + // Execute if bottomBar exists + + if (topBar != null && dropdown != null) { + if (prevScrollpos > currentScrollPos) { + topBar.style.top = "48px"; + navbar.classList.remove("shadow"); + } + else if (currentScrollPos <= 125) { + topBar.style.top = "48px"; + navbar.classList.remove("shadow"); + } + else { + topBar.style.top = "-48px"; + dropdown.classList.remove('show'); + navbar.classList.add("shadow"); + } + } + prevScrollpos = currentScrollPos; +} +} + +// Tooltips + +$(document).ready(function(){ + $('[data-toggle="tooltip"]').tooltip(); +}); + +// Paste to create submission + +document.addEventListener('paste', function (event) { + + var nothingFocused = document.activeElement === document.body; + + if (nothingFocused) { + + if (document.getElementById('guild-name-reference')) { + var guild = document.getElementById('guild-name-reference').innerText; + } + + var clipText = event.clipboardData.getData('Text'); + + var url = new RegExp('^(?:[a-z]+:)?//', 'i'); + + if (url.test(clipText) && window.location.pathname !== '/submit' && guild == undefined) { + window.location.href = '/submit?url=' + clipText; + } + else if (url.test(clipText) && window.location.pathname !== '/submit' && guild !== undefined) { + window.location.href = '/submit?url=' + clipText + '&guild=' + guild; + } + else if (url.test(clipText) && window.location.pathname == '/submit' && guild == undefined) { + + document.getElementById("post-URL").value = clipText; + + autoSuggestTitle() + + } + } +}); + +// Submit Page Front-end Validation + +function checkForRequired() { + +// Divs + +var title = document.getElementById("post-title"); + +var url = document.getElementById("post-URL"); + +var text = document.getElementById("post-text"); + +var button = document.getElementById("create_button"); + +var image = document.getElementById("file-upload"); + +// Toggle reuqired attribute + +if (url.value.length > 0 || image.value.length > 0) { + text.required = false; + url.required=false; +} else if (text.value.length > 0 || image.value.length > 0) { + url.required = false; +} else { + text.required = true; + url.required = true; +} + +// Validity check + +var isValidTitle = title.checkValidity(); + +var isValidURL = url.checkValidity(); + +var isValidText = text.checkValidity(); + +// Disable submit button if invalid inputs + +if (isValidTitle && (isValidURL || image.value.length>0)) { + button.disabled = false; +} else if (isValidTitle && isValidText) { + button.disabled = false; +} else { + button.disabled = true; +} + +} + +// Auto-suggest title given URL + +function autoSuggestTitle() { + + var urlField = document.getElementById("post-URL"); + + var titleField = document.getElementById("post-title"); + + var isValidURL = urlField.checkValidity(); + + if (isValidURL && urlField.value.length > 0 && titleField.value === "") { + + var x = new XMLHttpRequest(); + x.withCredentials=true; + x.onreadystatechange = function() { + if (x.readyState == 4 && x.status == 200) { + + title=JSON.parse(x.responseText)["title"]; + titleField.value=title; + + checkForRequired() + } + } + x.open('get','/submit/title?url=' + urlField.value); + x.send(null); + + }; + +}; + +// Run AutoSuggestTitle function on load + +if (window.location.pathname=='/submit') { + window.onload = autoSuggestTitle(); +} + +// Invite user to mod +function invite_mod_to_guild(boardid) { + + var inviteForm = document.getElementById("invite-form"); + + var inviteError = document.getElementById("toast-error-message"); + + var usernameField = document.getElementById("invite-username"); + + var isValidUsername = usernameField.checkValidity(); + + username = usernameField.value; + + if (isValidUsername) { + + var xhr = new XMLHttpRequest(); + xhr.open("post", "/mod/invite_mod/"+boardid); + xhr.withCredentials=true; + f=new FormData(); + f.append("username", username); + f.append("formkey", formkey()); + xhr.onload=function(){ + if (xhr.status==204) { + window.location.reload(true); + } + else { + $('#toast-invite-error').toast('dispose'); + $('#toast-invite-error').toast('show'); + inviteError.textContent = JSON.parse(xhr.response)["error"]; + } + } + xhr.send(f) + } + +} + +block_user=function() { + + var exileForm = document.getElementById("exile-form"); + + var exileError = document.getElementById("toast-error-message"); + + var usernameField = document.getElementById("exile-username"); + + var isValidUsername = usernameField.checkValidity(); + + username = usernameField.value; + + if (isValidUsername) { + + var xhr = new XMLHttpRequest(); + xhr.open("post", "/settings/block"); + xhr.withCredentials=true; + f=new FormData(); + f.append("username", username); + f.append("formkey", formkey()); + xhr.onload=function(){ + if (xhr.status<300) { + window.location.reload(true); + } + else { + $('#toast-exile-error').toast('dispose'); + $('#toast-exile-error').toast('show'); + exileError.textContent = JSON.parse(xhr.response)["error"]; + } + } + xhr.send(f) + } + +} + +post_comment=function(fullname){ + + + var form = new FormData(); + + form.append('formkey', formkey()); + form.append('parent_fullname', fullname); + form.append('submission', document.getElementById('reply-form-submission-'+fullname).value); + form.append('body', document.getElementById('reply-form-body-'+fullname).value); + form.append('file', document.getElementById('file-upload-reply-'+fullname).files[0]); + var xhr = new XMLHttpRequest(); + xhr.open("post", "/api/comment"); + xhr.withCredentials=true; + xhr.onload=function(){ + if (xhr.status==200) { + commentForm=document.getElementById('comment-form-space-'+fullname); + commentForm.innerHTML=JSON.parse(xhr.response)["html"]; + $('#toast-comment-success').toast('dispose'); + $('#toast-comment-error').toast('dispose'); + $('#toast-comment-success').toast('show'); + } + else { + var commentError = document.getElementById("comment-error-text"); + $('#toast-comment-success').toast('dispose'); + $('#toast-comment-error').toast('dispose'); + $('#toast-comment-error').toast('show'); + commentError.textContent = JSON.parse(xhr.response)["error"]; + } + } + xhr.send(form) + + document.getElementById('save-reply-to-'+fullname).classList.add('disabled'); + +} + +herald_comment=function(bid,cid){ + + + var xhr = new XMLHttpRequest(); + xhr.open("post", "/mod/distinguish_comment/"+bid+'/'+cid); + + var form = new FormData(); + + form.append('formkey', formkey()); + + xhr.withCredentials=true; + xhr.onload=function(){ + if (xhr.status==200) { + comment=document.getElementById('comment-'+cid+'-only'); + comment.innerHTML=JSON.parse(xhr.response)["html"]; + } + else { + var commentError = document.getElementById("comment-error-text"); + $('#toast-comment-success').toast('dispose'); + $('#toast-comment-error').toast('dispose'); + $('#toast-comment-error').toast('show'); + commentError.textContent = JSON.parse(xhr.response)["error"]; + } + } + xhr.send(form) + +} + +//part of submit page js + +hide_image=function(){ + x=document.getElementById('image-upload-block'); + url=document.getElementById('post-URL').value; + if (url.length>=1){ + x.classList.add('d-none'); + } + else { + x.classList.remove('d-none'); + } +} + + +comment_edit=function(id){ + + var commentError = document.getElementById("comment-error-text"); + + var form = new FormData(); + + form.append('formkey', formkey()); + form.append('body', document.getElementById('comment-edit-body-'+id).value); + form.append('file', document.getElementById('file-edit-reply-'+id).files[0]); + + var xhr = new XMLHttpRequest(); + xhr.open("post", "/edit_comment/"+id); + xhr.withCredentials=true; + xhr.onload=function(){ + if (xhr.status==200) { + commentForm=document.getElementById('comment-text-'+id); + commentForm.innerHTML=JSON.parse(xhr.response)["html"]; + document.getElementById('cancel-edit-'+id).click() + $('#toast-comment-success').toast('dispose'); + $('#toast-comment-error').toast('dispose'); + $('#toast-comment-success').toast('show'); + } + else { + $('#toast-comment-success').toast('dispose'); + $('#toast-comment-error').toast('dispose'); + $('#toast-comment-error').toast('show'); + commentError.textContent = JSON.parse(xhr.response)["error"]; + } + } + xhr.send(form) + +} + + +//mobile prompt +if (("standalone" in window.navigator) && // Check if "standalone" property exists + window.navigator.standalone){ // Test if using standalone navigator + + // Web page is loaded via app mode (full-screen mode) + // (window.navigator.standalone is TRUE if user accesses website via App Mode) + +} else { + if (window.innerWidth <= 737){ + try { + $('#mobile-prompt').tooltip('show') + $('.tooltip')[0].addEventListener( + 'click', + function(event){ + $('#mobile-prompt').tooltip('hide') + var xhr = new XMLHttpRequest(); + xhr.withCredentials=true; + xhr.open("POST", '/dismiss_mobile_tip', true); + xhr.send(); + } + ) + } catch (error) { + console.error(error); + } + } +} + +$('.mention-user').click(function (event) { + + if (event.which != 1) { + return + } + + event.preventDefault(); + + window.location.href='/@' + $(this).data('original-name'); + +}); + +$('.expandable-image').click( function(event) { + + if (event.which != 1) { + return + } + event.preventDefault(); + + var url= $(this).data('url'); + + expandDesktopImage(url,url); +}) + +$('.text-expand').click(function(event){ + if (event.which != 1) { + return + }; + id=$(this).data('id'); + + + $('#post-text-'+id).toggleClass('d-none'); + $('.text-expand-icon-'+id).toggleClass('fa-expand-alt'); + $('.text-expand-icon-'+id).toggleClass('fa-compress-alt'); + +}) + +if (window.location.pathname.includes('/@')) { + var userid = document.getElementById("userid").value; + if (userid != "nosong") + { + var audio = new Audio(`/songs/${userid}`); + audio.loop=true; + audio.play(); + document.getElementById('userpage').addEventListener('click', () => { + if (audio.paused) audio.play(); + }, {once : true}); + } +} \ No newline at end of file diff --git a/ruqqus/assets/js/bootstrap.js b/ruqqus/assets/js/bootstrap.js new file mode 100644 index 000000000..322e3c31e --- /dev/null +++ b/ruqqus/assets/js/bootstrap.js @@ -0,0 +1,1999 @@ +/** +* bootstrap.js v3.0.0 by @fat and @mdo +* Copyright 2013 Twitter Inc. +* https://www.apache.org/licenses/LICENSE-2.0 +*/ +if (!jQuery) { throw new Error("Bootstrap requires jQuery") } + +/* ======================================================================== + * Bootstrap: transition.js v3.0.0 + * https://twbs.github.com/bootstrap/javascript.html#transitions + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CSS TRANSITION SUPPORT (Shoutout: https://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + } + + // https://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false, $el = this + $(this).one($.support.transition.end, function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.0.0 + * https://twbs.github.com/bootstrap/javascript.html#alerts + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.hasClass('alert') ? $this : $this.parent() + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent.trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one($.support.transition.end, removeElement) + .emulateTransitionEnd(150) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.0.0 + * https://twbs.github.com/bootstrap/javascript.html#buttons + * ======================================================================== + * Copyright 2013 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + } + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (!data.resetText) $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d); + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + .prop('checked', !this.$element.hasClass('active')) + .trigger('change') + if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') + } + + this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + e.preventDefault() + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.0.0 + * https://twbs.github.com/bootstrap/javascript.html#carousel + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = + this.sliding = + this.interval = + this.$active = + this.$items = null + + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.DEFAULTS = { + interval: 5000 + , pause: 'hover' + , wrap: true + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getActiveIndex = function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + + return this.$items.index(this.$active) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getActiveIndex() + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || $active[type]() + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var fallback = type == 'next' ? 'first' : 'last' + var that = this + + if (!$next.length) { + if (!this.options.wrap) return + $next = this.$element.find('.item')[fallback]() + } + + this.sliding = true + + isCycling && this.pause() + + var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + .emulateTransitionEnd(600) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + }) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + $carousel.carousel($carousel.data()) + }) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.0.0 + * https://twbs.github.com/bootstrap/javascript.html#collapse + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.transitioning = null + + if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.toggle) this.toggle() + } + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var actives = this.$parent && this.$parent.find('> .panel > .in') + + if (actives && actives.length) { + var hasData = actives.data('bs.collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing') + [dimension](0) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('in') + [dimension]('auto') + this.transitioning = 0 + this.$element.trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + [dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element + [dimension](this.$element[dimension]()) + [0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse') + .removeClass('in') + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .trigger('hidden.bs.collapse') + .removeClass('collapsing') + .addClass('collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + var target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + var $target = $(target) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + var parent = $this.attr('data-parent') + var $parent = parent && $(parent) + + if (!data || !data.transitioning) { + if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') + $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + } + + $target.collapse(option) + }) + +}(window.jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.0.0 + * https://twbs.github.com/bootstrap/javascript.html#dropdowns + * ======================================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== */ + + ++function ($) { "use strict"; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle=dropdown]' + var Dropdown = function (element) { + var $el = $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we we use a backdrop because click events don't delegate + $(' + {% else %} + + {% endif %} + + + \ No newline at end of file diff --git a/ruqqus/templates/admin/admin_home.html b/ruqqus/templates/admin/admin_home.html new file mode 100644 index 000000000..2a16d5510 --- /dev/null +++ b/ruqqus/templates/admin/admin_home.html @@ -0,0 +1,40 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Drama + +{% endblock %} + +{% block content %} +

+

+

 Admin Tools

+{% filter markdown %} +* [Advanced Stats](/api/user_stat_data) +* [Ban Domain](/admin/domain/enter%20domain%20here) +* [Shadowbanned Users](/admin/shadowbanned) +* [Users with Agendaposter Theme](/admin/agendaposters) +* [Flagged Posts](/admin/flagged/posts) +* [Flagged Comments](/admin/flagged/comments) +* [Image Posts](/admin/image_posts) +* [Removed Posts](/admin/removed) +* [Users Feed](/admin/users) +* [Remove image from imgur and from cloudflare cache](/admin/image_purge) +* [Perceptive Hash Image Ban](/admin/image_ban) +* [Multi Vote Analysis](/admin/alt_votes) +* [App Queue](/admin/apps) +* [App Data](/admin/appdata) +* [Badges](/admin/badge_grant) +* [Content Stats](/admin/content_stats) + +{% endfilter %} + +
+ + +
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/alt_votes.html b/ruqqus/templates/admin/alt_votes.html new file mode 100644 index 000000000..9cdce00f8 --- /dev/null +++ b/ruqqus/templates/admin/alt_votes.html @@ -0,0 +1,94 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Drama + +{% endblock %} + +{% block content %} +
+
+
+
+
+
Vote Info
+ +
+ + + + +
+ +{% if u1 and u2 %} + + +

Analysis

+ +

{{u1.username}} Creation IP: {{u1.creation_ip}}

+

{{u2.username}} Creation IP: {{u2.creation_ip}}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@{{u1.username}} only(% unique)Both@{{u2.username}} only (% unique)
Post Upvotes{{data['u1_only_post_ups']}} ({{data['u1_post_ups_unique']}}%){{data['both_post_ups']}}{{data['u2_only_post_ups']}} ({{data['u2_post_ups_unique']}}%)
Post Downvotes{{data['u1_only_post_downs']}} ({{data['u1_post_downs_unique']}}%){{data['both_post_downs']}}{{data['u2_only_post_downs']}} ({{data['u2_post_downs_unique']}}%)
Comment Upvotes{{data['u1_only_comment_ups']}} ({{data['u1_comment_ups_unique']}}%){{data['both_comment_ups']}}{{data['u2_only_comment_ups']}} ({{data['u2_comment_ups_unique']}}%)
Comment Downvotes{{data['u1_only_comment_downs']}} ({{data['u1_comment_downs_unique']}}%){{data['both_comment_downs']}}{{data['u2_only_comment_downs']}} ({{data['u2_comment_downs_unique']}}%)
+ +

Link Accounts

+ +{% if u2 in u1.alts %} +

Accounts are known alts of eachother.

+{% else %} + +

Two accounts controlled by different people should have most uniqueness percentages at or above 70-80%

+

A sockpuppet account will have its uniqueness percentages significantly lower.

+ +Link Accounts +
+ + + + +
+ +{% endif %} + +{% endif %} + + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/app.html b/ruqqus/templates/admin/app.html new file mode 100644 index 000000000..e2b3be60f --- /dev/null +++ b/ruqqus/templates/admin/app.html @@ -0,0 +1,76 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +API App Administration + +{% endblock %} + +{% block content %} + +
+
+
+ +
+
+
+ +
+
+ + + + + + + + + + + +
+
+ +
+ +
+ +{% if listing %} + {% include "submission_listing.html" %} +{% elif comments %} + {% include "comments.html" %} +{% endif %} + +
+
+ + + + + + + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/app_data.html b/ruqqus/templates/admin/app_data.html new file mode 100644 index 000000000..8a72acabb --- /dev/null +++ b/ruqqus/templates/admin/app_data.html @@ -0,0 +1,79 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Drama + +{% endblock %} + +{% block content %} +
+
+
+
+
+
App Info
+ +
+ + + +
+ +{% if thing %} + +

Info

+

{{thing.permalink}}

+ + +

Author: @{{thing.author.username}}

+ +{% if thing.oauth_app %} + + +
+
+ +
+ + + + + + + + + + +
+
+ +
+ + + +{% endif %} + + + +{% endif %} + + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/apps.html b/ruqqus/templates/admin/apps.html new file mode 100644 index 000000000..96aff06ba --- /dev/null +++ b/ruqqus/templates/admin/apps.html @@ -0,0 +1,76 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +API App Administration + +{% endblock %} + +{% block content %} + +
+
+
+{% for app in apps %} +
+
+ +
+ + + + + + + {% if app.client_secret %} + + + {% endif %} + + + + + + +
+
+ +
+{% endfor %} + +
+
+
+ + + + + + + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/badge_grant.html b/ruqqus/templates/admin/badge_grant.html new file mode 100644 index 000000000..0e6ae8dcd --- /dev/null +++ b/ruqqus/templates/admin/badge_grant.html @@ -0,0 +1,76 @@ +{% extends "default.html" %} + +{% block title %} +Badge Grant +{% endblock %} + +{% block pagetype %}message{% endblock %} + +{% block sidebarblock %}{% endblock %} + +{% block content %} + + {% if error %} + + {% endif %} + {% if msg %} + + {% endif %} + +

+

+
Badge Grant
+ +
+ + + +
+ + + + + + + + + + + + +{% for badge in badge_types %} + + + + + + +{% endfor %} +
SelectImageNameDefault Description
{{badge.name}}{{badge.description}}
+ +
+ + +
+ + + + +
+{% endblock %} diff --git a/ruqqus/templates/admin/cache.html b/ruqqus/templates/admin/cache.html new file mode 100644 index 000000000..7ba222c17 --- /dev/null +++ b/ruqqus/templates/admin/cache.html @@ -0,0 +1,27 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Drama + +{% endblock %} + +{% block content %} +

+

+
Cache Dump
+Clear internal cache + + + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/content_stats.html b/ruqqus/templates/admin/content_stats.html new file mode 100644 index 000000000..8d1e6253e --- /dev/null +++ b/ruqqus/templates/admin/content_stats.html @@ -0,0 +1,28 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Drama + +{% endblock %} + +{% block content %} +

+
+
+	
+		
+		
+	
+
+{% for entry in data %}
+	
+		
+		
+	
+{% endfor %}
+
StatisticValue
{{entry}}{{data[entry]}}
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/flagged_comments.html b/ruqqus/templates/admin/flagged_comments.html new file mode 100644 index 000000000..e6ebef5e4 --- /dev/null +++ b/ruqqus/templates/admin/flagged_comments.html @@ -0,0 +1,24 @@ +{% extends "admin/flagged_posts.html" %} + + + +{% block listing %} + + +
+ {% with comments=listing %} + {% include "comments.html" %} + {% endwith %} + {% if not listing %} +
+
+
+
There are no comments here (yet).
+
+
+
+ {% endif %} +
+ +{% endblock %} + diff --git a/ruqqus/templates/admin/flagged_posts.html b/ruqqus/templates/admin/flagged_posts.html new file mode 100644 index 000000000..ef9cccba8 --- /dev/null +++ b/ruqqus/templates/admin/flagged_posts.html @@ -0,0 +1,115 @@ +{% extends "userpage.html" %} + +{% block adminpanel %}{% endblock %} +{% block pagetype %}userpage{% endblock %} +{% block banner %}{% endblock %} +{% block mobileBanner %}{% endblock %} +{% block desktopBanner %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} +{% block desktopUserBanner %}{% endblock %} +{% block mobileUserBanner %}{% endblock %} + +{% block adminscripts %} + +{% endblock %} + + + {% block postNav %} +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ {% endblock %} + + +{% block enlargeThumbJS %} + +{% endblock %} + +{% block fixedMobileBarJS %} + +{% endblock %} + +{% block title %} +Flagged Posts + +{% endblock %} + +{% block content %} + + +
+ +
+ + {% block listing %} +
+ {% include "submission_listing.html" %} +
+ {% endblock %} +
+
+{% endblock %} + +{% block pagenav %} + +{% endblock %} diff --git a/ruqqus/templates/admin/image_ban.html b/ruqqus/templates/admin/image_ban.html new file mode 100644 index 000000000..e9c0b8fcf --- /dev/null +++ b/ruqqus/templates/admin/image_ban.html @@ -0,0 +1,45 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Image Ban + +{% endblock %} + +{% block content %} + +{% if existing %} +

Image already banned for: {{existing.ban_reason}}

+{% elif success %} +

Image banned.

+{% endif %} + +
+
+
+
+
+
Perceptive Hash Image Ban
+

Upload an image to add its hash to the ban list.

+ +
+ + + + + + + Enter the number of days to ban a user who attempts to upload this image + + +
+ + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/image_posts.html b/ruqqus/templates/admin/image_posts.html new file mode 100644 index 000000000..32cd60a91 --- /dev/null +++ b/ruqqus/templates/admin/image_posts.html @@ -0,0 +1,105 @@ +{% extends "userpage.html" %} + +{% block adminpanel %}{% endblock %} +{% block pagetype %}userpage{% endblock %} +{% block banner %}{% endblock %} +{% block mobileBanner %}{% endblock %} +{% block desktopBanner %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} +{% block desktopUserBanner %}{% endblock %} +{% block mobileUserBanner %}{% endblock %} + +{% block adminscripts %} + +{% endblock %} + + +{% block postNav %}{% endblock %} + + +{% block enlargeThumbJS %} + +{% endblock %} + +{% block fixedMobileBarJS %} + +{% endblock %} + +{% block title %} +Image feed + +{% endblock %} + + +{% block sidebarblock %} +

+

+
+{% endblock %}
+
+{% block content %}
+
+
+
+ +
+ + {% block listing %} +
+ {% include "submission_listing.html" %} +
+ {% endblock %} +
+
+{% endblock %} + +{% block pagenav %} + +{% endblock %} diff --git a/ruqqus/templates/admin/image_purge.html b/ruqqus/templates/admin/image_purge.html new file mode 100644 index 000000000..557e76eae --- /dev/null +++ b/ruqqus/templates/admin/image_purge.html @@ -0,0 +1,22 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Purge Image + +{% endblock %} + +{% block content %} +

Imgur and Cloudflare Image Purge

+

Paste an image link here to remove it from imgur and from cloudflare cache. You need to enter the full url of the image like this "https://i.imgur.com/63OclpM_d.png?maxwidth=9999"

+ +
+ + + +
+ + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/manage_domain.html b/ruqqus/templates/admin/manage_domain.html new file mode 100644 index 000000000..7d332765c --- /dev/null +++ b/ruqqus/templates/admin/manage_domain.html @@ -0,0 +1,53 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Drama + +{% endblock %} + +{% block content %} + + +Get Domain Record + +

{{domain_name}}

+ +

Current

+ +

can_submit

+

{{domain.can_submit}}

+ +

can_comment

+

{{domain.can_comment}}

+ +

reason

+

{{domain.reason_text}}

+ +

show_thumbnail

+

{{domain.show_thumbnail}}

+ +

embed_function

+

{{domain.embed_function}}

+ +

embed_template

+

{{domain.embed_template}}

+ +

Actions

+ +
+ + + + + +
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/new_users.html b/ruqqus/templates/admin/new_users.html new file mode 100644 index 000000000..cb44eb421 --- /dev/null +++ b/ruqqus/templates/admin/new_users.html @@ -0,0 +1,19 @@ +{% extends "mine/mine.html" %} + +{% block maincontent %} + + +{% include "user_listing.html" %} +{% endblock %} + +{% block sidebarblock %} + +{% endblock %} + +{% block navbar %}{% endblock %} + +{% block sidebar %}{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/admin/removed_posts.html b/ruqqus/templates/admin/removed_posts.html new file mode 100644 index 000000000..dd550af72 --- /dev/null +++ b/ruqqus/templates/admin/removed_posts.html @@ -0,0 +1,60 @@ +{% extends "admin/image_posts.html" %} + + +{% block title %} +Removed Content + +{% endblock %} + +{% block content %} + + +
+
+
+
+
+

+				
Removed Posts
+ +
+ +
+ +
+
+
+ +
+ +
+ + {% block listing %} +
+ {% include "submission_listing.html" %} +
+ {% endblock %} +
+
+{% endblock %} + +{% block pagenav %} + +{% endblock %} diff --git a/ruqqus/templates/admin/votes.html b/ruqqus/templates/admin/votes.html new file mode 100644 index 000000000..117216c90 --- /dev/null +++ b/ruqqus/templates/admin/votes.html @@ -0,0 +1,64 @@ +{% extends "default.html" %} + +{% block sidebarblock %}{% endblock %} +{% block sidebarLeftblock %}{% endblock %} + +{% block title %} +Drama + +{% endblock %} + +{% block content %} +

Vote Info

+ +
+ + + +
+ +{% if thing %} + +

Info

+

{{thing.permalink}}

+

Author: @{{thing.author.username}}

+

Author Created At: {{thing.author.created_utc}} ({{thing.author.created_datetime}} UTC)

+

Counted Upvotes: {{thing.upvotes}} out of {{ups | length}}

+

Counted Downvotes: {{thing.downvotes}} out of {{downs | length}}

+ +

Upvotes

+ + + + + + + + {% for vote in ups %} + + + + {% endfor %} +
User
{{vote.user.username}}
+ +

Downvotes

+ + + + + + + + {% for vote in downs %} + + + + {% endfor %} +
User
{{vote.user.username}}
+ + + +{% endif %} + + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/authforms.html b/ruqqus/templates/authforms.html new file mode 100644 index 000000000..24f87bc8b --- /dev/null +++ b/ruqqus/templates/authforms.html @@ -0,0 +1,131 @@ + + + + + + + + + + + {% block pagetitle %}Drama - the open, free-speech social platform{% endblock %} + + + + + + + + + + + + + {% if v %} + + {% if v.agendaposter %}{% elif v.css %}{% endif %} + {% else %} + + {% endif %} + + + + + + + + + + +
+
+ +
+ +
+ +
+ +
+ Drama +
+ +

{% block authtitle %}{% endblock %}

+ +

{% block authtext %}{% endblock %}

+ + {% if error %} + + {% endif %} + {% if msg %} + + {% endif %} + + {% block content %} + {% endblock %} + +
+ +
+ +
+ +
+ +
+ +
+ +
+ {{i.text}} +
+ + +
+ +
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/ruqqus/templates/badge.html b/ruqqus/templates/badge.html new file mode 100644 index 000000000..0793c2e35 --- /dev/null +++ b/ruqqus/templates/badge.html @@ -0,0 +1,5 @@ +{% if b.url %} + +{% else %} + +{% endif %} diff --git a/ruqqus/templates/badge_pair.html b/ruqqus/templates/badge_pair.html new file mode 100644 index 000000000..ee0f8e1a1 --- /dev/null +++ b/ruqqus/templates/badge_pair.html @@ -0,0 +1,6 @@ +
+{{bp[0].rendered | safe}} +{% if bp|length > 1 %} +{{bp[1].rendered | safe}} +{% endif %} +
\ No newline at end of file diff --git a/ruqqus/templates/badges.html b/ruqqus/templates/badges.html new file mode 100644 index 000000000..305e0a39d --- /dev/null +++ b/ruqqus/templates/badges.html @@ -0,0 +1,69 @@ +{% extends "default.html" %} +{% block content %} +
+
+
+
+

User Badges

+
This page describes the requirements for obtaining all profile badges.
+
Badges are sorted into bronze, silver, gold, and diamond tiers, based on the relative difficulty of obtaining them.
+ +

Unlockable Badges

+
These badges are automatically granted through different kinds of activity on Drama.
+ + + + + + + + +{% for badge in badges if badge.kind==1 %} + + + + +{% endfor %} +
NameImageDescription
{{badge.name}} + {{badge.description}}
+ + +

Granted Badges

+
These badges can be granted by staff.
+ + + + + + + + +{% for badge in badges if badge.kind==3 %} + + + + +{% endfor %} +
NameImageDescription
{{badge.name}} + {{badge.description}}
+ +

Unobtainable Badges

+
There is no way to acquire these badges if you don't already have them.
+ + + + + + + + +{% for badge in badges if badge.kind==4 %} + + + + +{% endfor %} +
NameImageDescription
{{badge.name}} + {{badge.description}}
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/banned.html b/ruqqus/templates/banned.html new file mode 100644 index 000000000..abd87a911 --- /dev/null +++ b/ruqqus/templates/banned.html @@ -0,0 +1,23 @@ +{% extends "guild_settings.html" %} + +{% block content %} + + + + + + + + + +{% for user in users %} + + + + + + +{% endfor %} +
#NameReasonBanned by
{{users.index(user)+1}}{{user.username}}{% if user.ban_reason %}{{user.ban_reason}}{% endif %}{{user.banned_by.username}}
+ +{% endblock %} diff --git a/ruqqus/templates/blocks.html b/ruqqus/templates/blocks.html new file mode 100644 index 000000000..a4275fbbc --- /dev/null +++ b/ruqqus/templates/blocks.html @@ -0,0 +1,22 @@ +{% extends "guild_settings.html" %} + +{% block pagetitle %}Blocks{% endblock %} + +{% block content %} +

Blocks

+

+
+
+	
+		
+		
+	
+
+{% for user in users %}
+	
+		
+		
+	
+{% endfor %}
+
UserTarget
{{user.username}}{{targets[loop.index-1].username}}
+{% endblock %} diff --git a/ruqqus/templates/bootstrap.html b/ruqqus/templates/bootstrap.html new file mode 100644 index 000000000..214548b81 --- /dev/null +++ b/ruqqus/templates/bootstrap.html @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/ruqqus/templates/changelog.html b/ruqqus/templates/changelog.html new file mode 100644 index 000000000..4a7d5cace --- /dev/null +++ b/ruqqus/templates/changelog.html @@ -0,0 +1,107 @@ +{% extends "guild_settings.html" %} + +{% block pagetitle %}Changelog{% endblock %} + +{% block desktopBanner %} + +
+
+
+ + {% block navbar %} +
+ +
+
+ + +
+ +
+ {% endblock %} +
+
+
+ +{% endblock %} + +{% block content %} + +{% if v %} + +{% endif %} + +
+ +
+ +
+ + {% include "submission_listing.html" %} + +
+
+
+ +{% endblock %} + +{% block pagenav %} +{% if listing %} + +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/comment_failed.html b/ruqqus/templates/comment_failed.html new file mode 100644 index 000000000..890620717 --- /dev/null +++ b/ruqqus/templates/comment_failed.html @@ -0,0 +1,54 @@ +{% extends "default.html" %} + +{% block title %} +Unable to post comment + + +{% set ups=c.upvotes %} +{% set downs=c.downvotes %} +{% set score=ups-downs %} +{% include "emoji_modal.html" %} + + + +{% if (c.is_banned or c.deleted_utc > 0 or c.is_blocking or c.is_blocked) and not (v and v.admin_level>0) and not (v and v.id==c.author_id) %} + + + +
+ + + + +
+ +
+ + + + +
+ {% if c.is_banned and c.ban_reason %}Reason: {{c.ban_reason}}{% endif %} +
+
+ + + + {% if render_replies %} + {% if level<6 %} +
+ {% set standalone=False %} + {% for reply in c.children(v) %} + {{single_comment(reply, level=level+1)}} + {% endfor %} +
+ {% elif c.children(v) %} +
+ {% set standalone=False %} + {% for reply in c.children(v) %} + {{single_comment(reply, level=level+1)}} + {% endfor %} +
+ + {% endif %} + {% endif %} +
+
+ + +{% else %} + +{% set score=c.score %} + +{% if v %} +{% set voted=c.voted %} +{% set adjust = voted %} + +{% else %} +{% set voted=-2 %} +{% set adjust=0 %} + +{% endif %} + +{% if standalone and level==1 %} + +{% endif %} + +
+ + + +
+ +
+ + + + {% if c.is_banned and c.ban_reason %} +
Reason: {{c.ban_reason}}
+ {% endif %} + +
+ {{c.realbody(v) | safe}} + + {% if not c.parent_submission and c.author_id!=1046 and c.author_id!=2360 and c.author_id!=v.id %} + Reply +

+					
+ +

+						
+						 
+						
+						 
+						
+						 
+						
+						 
+						
+						 
+						
+					
+ {% endif %} +
+ + {% if c.parent_submission %} + {% if v and v.id==c.author_id and (standalone or is_allowed_to_comment) %} + + {% endif %} + + {% if c.active_flags %} +
+ Reported by: + +
+ {% endif %} + +
+
    + + {% if v and request.path.startswith('/@') and v.admin_level == 0%} + + {% if voted==1 %} +
  • + {% endif %} + + {% elif v %} + +
  • +
  • + + {% else %} +
  • +
  • + + {% endif %} + +
  • + {{score}} +
  • + + {% if v and request.path.startswith('/@') and v.admin_level == 0 %} + + {% if voted==-1 %} +
  • + {% endif %} + + {% elif v %} +
  • +
  • + + {% else %} + +
  • +
  • + + {% endif %} + +
  • Votes
  • + + {% if v and c.id in v.saved_comment_idlist() %} +
  • Unsave
  • + {% else %} +
  • Save
  • + {% endif %} + + {% if v %} + {% if standalone or is_allowed_to_comment %} +
  • Reply
  • + {% endif %} + + {% endif %} +
  • Context
  • +
  • Copy link
  • + + {% if v and v.admin_level>=3 and request.path.startswith ('/admin') %} +
  • Remove
  • +
  • Approve
  • + {% endif %} +
  • + +
  • +
  • + +
  • + {% if v and request.path.startswith('/@') and v.admin_level == 0 %} + {% if voted==1 %} +
  • +
  • {% endif %} + {% elif v %} +
  • +
  • + {% else %} +
  • +
  • + {% endif %} +
  • + {{score}} +
  • + {% if v and request.path.startswith('/@') and v.admin_level == 0 %} + {% if voted==-1 %} +
  • + {% endif %} + {% elif v %} +
  • +
  • + {% else %} +
  • +
  • + {% endif %} +
+ +
+ {% endif %} +
+ + +
+ + + +
+ + + + + {% if render_replies %} + {% if level<6 %} +
+ {% for reply in c.children(v) %} + {{single_comment(reply, level=level+1)}} + {% endfor %} +
+ {% elif c.children(v) %} +
+ {% for reply in c.children(v) %} + {{single_comment(reply, level=level+1)}} + {% endfor %} +
+ + {% endif %} + {% endif %} + +
+ + + + + +
+ +{% endif %} + +{% endmacro %} + +{% for comment in comments %} + + {{single_comment(comment)}} + +{% endfor %} + + + +
+
+
+
+
+ \ No newline at end of file diff --git a/ruqqus/templates/contact.html b/ruqqus/templates/contact.html new file mode 100644 index 000000000..6fa5ebc98 --- /dev/null +++ b/ruqqus/templates/contact.html @@ -0,0 +1,80 @@ +{% extends "default.html" %} + +{% block title %} +Drama - Contact + +{% endblock %} + + + + +{% block content %} + + {% if request.args.get('error') or error %} + + {% endif %} + {% if request.args.get('msg') or msg %} + + {% endif %} + +

Contact Drama Admins

+{% if v and v.is_activated and not v.is_suspended %} + +

Use this form to contact Drama Admins.

+ + + + +
+ + + + + + +
+ +{% elif v and v.is_suspended %} + +

Your Drama account has been suspended. You are not permitted to use this form.

+ + +{% elif v %} + +

Please verify your email address in order to ensure we can respond to your message if needed. Then, refresh this page.

+ +{% else %} + +

In order to ensure that we can respond to your message, please first sign up or log in and make sure you have verified your email address. Then, refresh this page.

+ +{% endif %} + +
+
+
+
+ +

If you can see this line, we haven't been contacted by any law enforcement or governmental organizations in 2021 yet.

+ +
+
+
+
+ +{% endblock %} diff --git a/ruqqus/templates/control_panel_logged_in.html b/ruqqus/templates/control_panel_logged_in.html new file mode 100644 index 000000000..1dbd3b861 --- /dev/null +++ b/ruqqus/templates/control_panel_logged_in.html @@ -0,0 +1,7 @@ +

My Profile

+

Settings

+

Submit

+
+ + +
diff --git a/ruqqus/templates/control_panel_logged_out.html b/ruqqus/templates/control_panel_logged_out.html new file mode 100644 index 000000000..3125dc6ab --- /dev/null +++ b/ruqqus/templates/control_panel_logged_out.html @@ -0,0 +1 @@ +

Sign In | Sign Up

diff --git a/ruqqus/templates/default.html b/ruqqus/templates/default.html new file mode 100644 index 000000000..8dd3a8c33 --- /dev/null +++ b/ruqqus/templates/default.html @@ -0,0 +1,373 @@ + + + + {% if v %} + + + + {% endif %} + + + + + + + + + {% block title %} + Drama + + + + + + + + + + + + + + + + + + {% endblock %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% block stylesheets %} + + {% if v %} + + {% if v.agendaposter %}{% elif v.css %}{% endif %} + {% else %} + + {% endif %} + + {% endblock %} + + + + + {% block fixedMobileBarJS %} + {% endblock %} + + {% if v %} + + + {% endif %} + + + + + + +{% include "header.html" %} + + + +{% block mobileUserBanner %} +{% endblock %} + +{% block mobileBanner %} +{% endblock %} + +{% block postNav %} +{% endblock %} + +
+
+ + {% block leftSidebar %} + {% block leftSidebarBlock %} + {% endblock %} + {% endblock %} + +
+ + {% block desktopUserBanner %} + {% endblock %} + + {% block desktopBanner %} + {% endblock %} + + {% block PseudoSubmitForm %} + {% endblock %} + + {% block searchText %} + {% endblock %} + + {% block content %} + {% endblock %} + + {% block pagenav %} + {% endblock %} + +
+ +
+
+ +{% block mobilenavbar %} +{% include "mobile_navigation_bar.html" %} +{% endblock %} + +{% block actionsModal %} +{% endblock %} + +{% block reportCommentModal %} +{% endblock %} + +{% block guildModal %} +{% endblock %} + +{% block GIFtoast %} +{% endblock %} + +{% block GIFpicker %} +{% endblock %} + + + + + + + + + + +{% if v %} +{% include "flag_post_modal.html" %} +{% include "flag_comment_modal.html" %} +{% include "gif_modal.html" %} +{% include "delete_comment_modal.html" %} +{% include "delete_post_modal.html" %} +{% endif %} + +{% include "expanded_image_modal.html" %} + +{% include "bootstrap.html" %} + + + + + + + + + + + + + +{% if request.path=='/' and g.system and g.timestamp>session.get('tooltip_last_dismissed',0)+60*60*24 and (not g.system.endswith('/chrome') and not g.system.endswith('/other')) and not g.system.endswith('/webview') %} + +
+
+
+{% endif %} + + + + \ No newline at end of file diff --git a/ruqqus/templates/delete_comment_modal.html b/ruqqus/templates/delete_comment_modal.html new file mode 100644 index 000000000..39bd8b09e --- /dev/null +++ b/ruqqus/templates/delete_comment_modal.html @@ -0,0 +1,28 @@ + + diff --git a/ruqqus/templates/delete_post_modal.html b/ruqqus/templates/delete_post_modal.html new file mode 100644 index 000000000..823e32205 --- /dev/null +++ b/ruqqus/templates/delete_post_modal.html @@ -0,0 +1,46 @@ + + diff --git a/ruqqus/templates/developers.html b/ruqqus/templates/developers.html new file mode 100644 index 000000000..6b4441ac0 --- /dev/null +++ b/ruqqus/templates/developers.html @@ -0,0 +1,43 @@ +{% extends "default.html" %} + +{% block title %} +Drama - FAQ + +{% endblock %} + +{% block content %} +{% filter markdown %} + +# Developer Help + +Tips to help ensure your website works nicely with Drama + +## SSL Required + +To help protect user privacy and safety, Drama forces HTTPS on all assets uploaded and submitted to Drama. This includes automatic conversion of all "https://" schemas into "https://". + +Make sure your website has a valid SSL certificate in order to ensure that Drama users can navigate to it from Drama. + +We will not grant exemptions to https conversion. + +## Share to Drama + +To create a "share to Drama" button, create an element which has `onclick="window.location.href='https://rdrama.net/submit?url='+window.location.href"` + +Use [Drama branding and assets](/press) to style your "share to Drama" button. + + +## Thumbnails + +Thumbnail images for posts are determined by using the first successful condition below: + +1. If the submitted link has a `Content-Type: image/*` header, the link itself is used as the thumbnail asset. +2. If the submitted link has a `Content-Type: text/html` header, and there is a `` element, the `content` attribute of that element will be scraped and used as the thumbnail. (Use this option to explicitly set a thumbnail) +3. If the submitted link has a `Content-Type: text/html` header, and no thumbnail meta element is found, the `src` attribute of the first `img` element will be scraped and used as the thumbnail. + +## Applications + +To request ruqqus API keys, visit [this page](/apps) + +{% endfilter %} +{% endblock %} diff --git a/ruqqus/templates/email/2fa_remove.html b/ruqqus/templates/email/2fa_remove.html new file mode 100644 index 000000000..0da9679a0 --- /dev/null +++ b/ruqqus/templates/email/2fa_remove.html @@ -0,0 +1,42 @@ +{% extends "email/default.html" %} + +{% block image %}verify.png{% endblock %} + +{% block title %}Remove Two-Factor Authentication{% endblock %} + +{% block preheader %}Remove Two-Factor Authentication.{% endblock %} + +{% block content %} +

We received a request to remove two-factor authentication from your account. In 72 hours, click the link below.

+

If you didn't make this request, change your password and use the Log Out Everywhere feature in your Security Settings to permanently invalidate the link.

+ + + + + + +

Please note that Drama will never ask you for your email, password, or two-factor token via email, text, or phone.

+

If you have any questions, feel free to email the Drama team..

+

Thanks, +
The Drama Team

+

P.S. Feel free to tweet at us on Twitter @ruqqus.

+ + + + + + +{% endblock %} diff --git a/ruqqus/templates/email/default.html b/ruqqus/templates/email/default.html new file mode 100644 index 000000000..bf84fa17e --- /dev/null +++ b/ruqqus/templates/email/default.html @@ -0,0 +1,476 @@ + + + + + + + + + + + + + {% block preheader %}Thanks for joining Drama! Please take a sec to verify the email you used to sign up.{% endblock %} + + + + + + + diff --git a/ruqqus/templates/email/email_change.html b/ruqqus/templates/email/email_change.html new file mode 100644 index 000000000..2a36d3161 --- /dev/null +++ b/ruqqus/templates/email/email_change.html @@ -0,0 +1,57 @@ +{% extends "email/default.html" %} + +{% block title %}Verify Your Email{% endblock %} + +{% block preheader %}Verify your new Drama email.{% endblock %} + +{% block content %} +

You told us you wanted to change your Drama account email. To finish this process, please verify your new email address:

+ + + + + + +

For reference, here's your current information:

+ + + + + +

Please note that Drama will never ask you for your email, password, or two-factor token via email, text, or phone.

+ + + + + +{% endblock %} diff --git a/ruqqus/templates/email/email_verify.html b/ruqqus/templates/email/email_verify.html new file mode 100644 index 000000000..d7410ca62 --- /dev/null +++ b/ruqqus/templates/email/email_verify.html @@ -0,0 +1,56 @@ +{% extends "email/default.html" %} + +{% block title %}Welcome to Drama!{% endblock %} + +{% block content %} +

Thanks for joining Drama. We’re happy to have you on board. To get the most out of Drama, please verify your account email:

+ + + + + + +

For reference, here's your username.

+ + + + + +

Please note that Drama will never ask you for your email, password, or two-factor token via email, text, or phone.

+ + + + + + +{% endblock %} diff --git a/ruqqus/templates/email/password_reset.html b/ruqqus/templates/email/password_reset.html new file mode 100644 index 000000000..4d8e58b1c --- /dev/null +++ b/ruqqus/templates/email/password_reset.html @@ -0,0 +1,55 @@ +{% extends "email/default.html" %} + +{% block title %}Reset Your Password{% endblock %} +{% block preheader %}Reset your Drama password.{% endblock %} + +{% block content %} +

To reset your password, click the button below:

+ + + + + + +

For reference, here's your login information:

+ + + + + + + + + + +{% endblock %} diff --git a/ruqqus/templates/embeds/comment.html b/ruqqus/templates/embeds/comment.html new file mode 100644 index 000000000..ee30d46b3 --- /dev/null +++ b/ruqqus/templates/embeds/comment.html @@ -0,0 +1,130 @@ +{% extends "embeds/embed_default.html" %} + +{% set score=c.score_fuzzed %} + +{% block title %} +@{{c.author.username}} comments on "{{c.post.title}}" + +{% endblock %} + + +{% block content %} + + +
+ + + + + +
+ +
+ + + +
+ {{c.body_html | safe}} +
+ + +
+
    + + + +
  • +
  • + + +
  • + {{score}}
  • + +{% if not c.board.downvotes_disabled %} + + + +
  • +
  • + +{% endif %} +
  • Copy link +
  • +
  • + +
  • +
  • + +
  • + +
  • +
  • +
  • +{{score}} +
  • + +
  • +
  • +
+ +
+
+ + + + + +
+{% endblock %} diff --git a/ruqqus/templates/embeds/comment_removed.html b/ruqqus/templates/embeds/comment_removed.html new file mode 100644 index 000000000..e0da84ef0 --- /dev/null +++ b/ruqqus/templates/embeds/comment_removed.html @@ -0,0 +1,38 @@ +{% extends "embeds/embed_default.html" %} + +{% block title %} +{@{{c.author.username}} comments on "{{c.post.title}}" + +{% endblock %} + +{% endblock %} + + + +
+ + + + +
+ +
+ + + + +
+ {% if c.is_banned and c.ban_reason %}Reason: {{c.ban_reason}}{% endif %} +
+ +
+ +
+ + +
+{% block content %} \ No newline at end of file diff --git a/ruqqus/templates/embeds/embed_default.html b/ruqqus/templates/embeds/embed_default.html new file mode 100644 index 000000000..7b8e628b5 --- /dev/null +++ b/ruqqus/templates/embeds/embed_default.html @@ -0,0 +1,113 @@ + + + + + + + + + + {% block title %} + Drama + + {% endblock %} + + + + + + + + {% block stylesheets %} + {% if v %} + + {% if v.agendaposter %}{% elif v.css %}{% endif %} + {% else %} + + {% endif %} + {% endblock %} + + + + + + + + + + + +
+
+ +
+ + + {% block content %} + {% endblock %} + + +
+ + + + + + + + +{% include "bootstrap.html" %} + + + + + + + + + + + +{% block enlargeThumbJS %} +{% endblock %} + +{% block toggleView %} +{% endblock %} + +{% block embedJS %} +{% endblock %} + +{% block formatJS %} +{% endblock %} + + + + + + + diff --git a/ruqqus/templates/embeds/submission.html b/ruqqus/templates/embeds/submission.html new file mode 100644 index 000000000..2121adcd1 --- /dev/null +++ b/ruqqus/templates/embeds/submission.html @@ -0,0 +1,148 @@ +{% extends "embeds/embed_default.html" %} + + +{% set score=p.score_fuzzed %} + + +{% block title %} +{{p.title | safe}} + +{% endblock %} + +{% block pagetype %}thread{% endblock %} + + + {% block content %} +
+ +
+ +
+
+ + {% if p.thumb_url %} +
+ Unable to anonymously load image +
+ {% endif %} + +
+ + + + + {% if p.url %} +

{{p.title | safe}}

+ {% else %} +

{{p.title | safe}}

+ {% endif %} + +
+ {{p.body_html | safe}} + +
+ + +
+ +
+ +
+ + + + + +
+
+
+ {{score}} + {% if not p.board.downvotes_disabled %} +
+
+ +
+ + {% endif %} + +
+ + + + +
+ +
+ + + +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ + {% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/emoji_modal.html b/ruqqus/templates/emoji_modal.html new file mode 100644 index 000000000..de392e9f9 --- /dev/null +++ b/ruqqus/templates/emoji_modal.html @@ -0,0 +1,65 @@ + + \ No newline at end of file diff --git a/ruqqus/templates/errors/400.html b/ruqqus/templates/errors/400.html new file mode 100644 index 000000000..bf7a3d5b4 --- /dev/null +++ b/ruqqus/templates/errors/400.html @@ -0,0 +1,19 @@ +{% extends "errors/default.html" %} + +{% block title %} +400 Bad Request +{% endblock %} + +{% block pagetype %}error-400{% endblock %} + +{% block content %} +
+
+
+ +

400 Bad Request

+

That request was bad and you should feel bad.

+
+
+
+{% endblock %} diff --git a/ruqqus/templates/errors/401.html b/ruqqus/templates/errors/401.html new file mode 100644 index 000000000..29fdf9ac8 --- /dev/null +++ b/ruqqus/templates/errors/401.html @@ -0,0 +1,23 @@ +{% extends "errors/default.html" %} + +{% block title %} +401 Not Authorized +{% endblock %} + +{% block pagetype %}error-401{% endblock %} + +{% block content %} +
+
+
+ + + +

401 Not Authorized

+

You need to log in if you want to get into this castle.

+ + +
+
+
+{% endblock %} diff --git a/ruqqus/templates/errors/402.html b/ruqqus/templates/errors/402.html new file mode 100644 index 000000000..837566d0a --- /dev/null +++ b/ruqqus/templates/errors/402.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +402 Payment Required +{% endblock %} + +{% block pagetype %}error-402{% endblock %} + +{% block content %} +
+
+
+ +

402 Payment Required

+

The royal bank has told us that you owe them some coin. You'll need to pay off your debts before you can continue.

+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/403.html b/ruqqus/templates/errors/403.html new file mode 100644 index 000000000..b6ae227e6 --- /dev/null +++ b/ruqqus/templates/errors/403.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +403 Forbidden +{% endblock %} + +{% block pagetype %}error-403{% endblock %} + +{% block content %} +
+
+
+ +

403 Forbidden

+

Our security warlocks have cast an impenetrable shield spell around this page.

+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/404.html b/ruqqus/templates/errors/404.html new file mode 100644 index 000000000..dbb2ab6c9 --- /dev/null +++ b/ruqqus/templates/errors/404.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +404 Page Not Found +{% endblock %} + +{% block pagetype %}error-404{% endblock %} + +{% block content %} +
+
+
+ +

404 Page Not Found

+

The internet gremlins have led you to a dark, musty dead-end. There's nothing here.

+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/405.html b/ruqqus/templates/errors/405.html new file mode 100644 index 000000000..34da0e997 --- /dev/null +++ b/ruqqus/templates/errors/405.html @@ -0,0 +1,20 @@ +{% extends "default.html" %} + +{% block title %} +405 Method Not Allowed +{% endblock %} + +{% block pagetype %}error-405{% endblock %} + +{% block content %} +
+
+
+ +

405 Method Not Allowed

+

Careful, stranger. The internet gnomes don’t take kindly to outsiders that don’t follow their customs.

+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/409.html b/ruqqus/templates/errors/409.html new file mode 100644 index 000000000..3bf5c29fd --- /dev/null +++ b/ruqqus/templates/errors/409.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +409 Conflict +{% endblock %} + +{% block pagetype %}error-409{% endblock %} + +{% block content %} +
+
+
+ +

409 Conflict

+

There were no survivors.

+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/410.html b/ruqqus/templates/errors/410.html new file mode 100644 index 000000000..cf33264cc --- /dev/null +++ b/ruqqus/templates/errors/410.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +410 Gone +{% endblock %} + +{% block pagetype %}error-410{% endblock %} + +{% block content %} +
+
+
+ +

410 Gone

+

There's nothing left here but a giant smouldering crater.

+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/413.html b/ruqqus/templates/errors/413.html new file mode 100644 index 000000000..a11ac1373 --- /dev/null +++ b/ruqqus/templates/errors/413.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +413 Request Entity Too Large +{% endblock %} + +{% block pagetype %}error-413{% endblock %} + +{% block content %} +
+
+
+ +

413 Image Size Too Large

+

There's a 1 MB limit to profile picture uploads, and a 16 MB limit to all other image uploads.

+ +
+
+
+{% endblock %} diff --git a/ruqqus/templates/errors/418.html b/ruqqus/templates/errors/418.html new file mode 100644 index 000000000..de958a39f --- /dev/null +++ b/ruqqus/templates/errors/418.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +418 I'm A Teapot +{% endblock %} + +{% block pagetype %}error-418{% endblock %} + +{% block content %} +
+
+
+ +

418 I'm A Teapot

+

Sorry, I've been cursed and can't make you coffee right now.

+ +
+
+
+{% endblock %} diff --git a/ruqqus/templates/errors/422.html b/ruqqus/templates/errors/422.html new file mode 100644 index 000000000..29089e64a --- /dev/null +++ b/ruqqus/templates/errors/422.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +422 Unprocessable Entity +{% endblock %} + +{% block pagetype %}error-422{% endblock %} + +{% block content %} +
+
+
+ +

422 Unprocessable Entity

+

The server thinks you're asking something silly. It might take you more seriously if you take off the jester outfit.

+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/429.html b/ruqqus/templates/errors/429.html new file mode 100644 index 000000000..0e54ebe3e --- /dev/null +++ b/ruqqus/templates/errors/429.html @@ -0,0 +1,19 @@ +{% extends "errors/default.html" %} + +{% block title %} +429 Too Many Requests +{% endblock %} + +{% block pagetype %}error-429{% endblock %} + +{% block content %} +
+
+
+ +

429 Too Many Requests

+

Slow down there, friend! The royal guard doesn't like it when you go that fast!

+
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/451.html b/ruqqus/templates/errors/451.html new file mode 100644 index 000000000..0a26a5884 --- /dev/null +++ b/ruqqus/templates/errors/451.html @@ -0,0 +1,20 @@ +{% extends "errors/default.html" %} + +{% block title %} +451 Unavailable For Legal Reasons +{% endblock %} + +{% block pagetype %}error-451{% endblock %} + +{% block content %} +
+
+
+ +

451 Unavailable For Legal Reasons

+ +

By royal decree, we are unable to show this to you right now.

+
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/500.html b/ruqqus/templates/errors/500.html new file mode 100644 index 000000000..0754f9523 --- /dev/null +++ b/ruqqus/templates/errors/500.html @@ -0,0 +1,21 @@ +{% extends "errors/default.html" %} + +{% block title %} +500 Internal Server Error +{% endblock %} + +{% block pagetype %}error-500{% endblock %} + +{% block content %} +
+
+
+ +

500 Internal Server Error

+

Something has broken. A master dwarven computersmith has been dispatched to un-break it.

+ + +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/502.html b/ruqqus/templates/errors/502.html new file mode 100644 index 000000000..de411fd48 --- /dev/null +++ b/ruqqus/templates/errors/502.html @@ -0,0 +1,74 @@ + + + + + +502 Bad Gateway + + + + + + + + + + + + + + + + + + + +{% if v %} + + {% if v.agendaposter %}{% elif v.css %}{% endif %} +{% else %} + +{% endif %} + + + + + + + + +
+
+
+
+
+
+ +

502 Bad Gateway

+

Don't go this way, stranger. The gate is closed, and the guards are saying:

+

"We're restarting the server right now, try again in a few moments."

+

Reload

+
+
+
+
+ +
+
+ + + + + + + + + \ No newline at end of file diff --git a/ruqqus/templates/errors/503.html b/ruqqus/templates/errors/503.html new file mode 100644 index 000000000..37d279e6f --- /dev/null +++ b/ruqqus/templates/errors/503.html @@ -0,0 +1,130 @@ + + + + + + + + + + + +503 Service Unavailable + + + + + + + + + + + + + + + {% if v %} + + {% if v.agendaposter %}{% elif v.css %}{% endif %} + {% else %} + + {% endif %} + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + + +

503 Service Unavailable

+

Drama is unavailable.

+

The server you connected to is most likely being restarted right now. Try again in a few moments.

+ +
+
+
+ + + + + +
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruqqus/templates/errors/default.html b/ruqqus/templates/errors/default.html new file mode 100644 index 000000000..d376c5d85 --- /dev/null +++ b/ruqqus/templates/errors/default.html @@ -0,0 +1,6 @@ +{% extends "default.html" %} + +{% block sidebarLeftblock %}{% endblock %} +{% block sidebar %}{% endblock %} + +{% block customPadding %}{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/errors/nsfw.html b/ruqqus/templates/errors/nsfw.html new file mode 100644 index 000000000..22b4ff108 --- /dev/null +++ b/ruqqus/templates/errors/nsfw.html @@ -0,0 +1,38 @@ +{% extends "errors/default.html" %} + +{% block title %} ++18 +{% endblock %} + +{% block pagetype %}error-451{% endblock %} + +{% block content %} +
+
+
+ +

Are you over 18?

+

This post is rated +18 (Pornographic Content). You must be 18 or older to continue. Are you sure you want to proceed?

+
+ + {% if v %} +
+ + + +
+ {% else %} +
+ + + + +
+ {% endif %} + +
+ +
+
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/expanded_image_modal.html b/ruqqus/templates/expanded_image_modal.html new file mode 100644 index 000000000..f60eb617d --- /dev/null +++ b/ruqqus/templates/expanded_image_modal.html @@ -0,0 +1,20 @@ + + + diff --git a/ruqqus/templates/flag_comment_modal.html b/ruqqus/templates/flag_comment_modal.html new file mode 100644 index 000000000..fb54db159 --- /dev/null +++ b/ruqqus/templates/flag_comment_modal.html @@ -0,0 +1,45 @@ + + diff --git a/ruqqus/templates/flag_post_modal.html b/ruqqus/templates/flag_post_modal.html new file mode 100644 index 000000000..b34da3a90 --- /dev/null +++ b/ruqqus/templates/flag_post_modal.html @@ -0,0 +1,47 @@ + + diff --git a/ruqqus/templates/followers.html b/ruqqus/templates/followers.html new file mode 100644 index 000000000..4c0c5bc34 --- /dev/null +++ b/ruqqus/templates/followers.html @@ -0,0 +1,21 @@ +{% extends "default.html" %} +{% block content %} +

+
@{{u.username}}'s followers
+

+
+
+	
+		
+		
+	
+
+{% for user in users %}
+	
+			
+				
+	
+{% endfor %}
+
#Name
{{users.index(user)+1}}{{user.username}}
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/follows.html b/ruqqus/templates/follows.html new file mode 100644 index 000000000..e64e4ffed --- /dev/null +++ b/ruqqus/templates/follows.html @@ -0,0 +1,37 @@ +{% extends "home.html" %} + +{% block sidebarLeftblock %} + + + +{% endblock %} + +{% block sidebarblock %} + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/forgot_password.html b/ruqqus/templates/forgot_password.html new file mode 100644 index 000000000..b98dfadad --- /dev/null +++ b/ruqqus/templates/forgot_password.html @@ -0,0 +1,31 @@ +{% extends "authforms.html" %} + +{% block pagetitle %}Drama Password Reset{% endblock %} + +{% block authtitle %}Reset your password.{% endblock %} + +{% block authtext %}If there's an email address associated with your account, you can use it to recover your Drama account and change your password.{% endblock %} + +{% block content %} + +
+ +
+ + + + + + + + + + + +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/formatting.html b/ruqqus/templates/formatting.html new file mode 100644 index 000000000..a41f15c5f --- /dev/null +++ b/ruqqus/templates/formatting.html @@ -0,0 +1,151 @@ +{% extends "default.html" %} +{% block title %} +Drama - Formatting + +{% endblock %} + +{% block content %} +
+
+
+
+{% filter markdown %} +# Formatting + +On Drama, you can use Markdown formatting. + + +## Inline formatting + +{% endfilter %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDisplays as
Italics*text*text
Bold**text**text
Code`text`text
Strikethrough~~text~~text
Links[Drama](https://rdrama.net)Drama
Emojis:marseylove:
+ +

* We have customized image embeds to add pop-overs and operate on a whitelist system. Embeds from known safe image hosts will use a pop-up display as demonstrated here. Attempted embeds to non-whitelisted sites will be converted into a link. The whitelist may be viewed here.

+ +{% filter markdown %} + +## Block formatting + +These Markdown tags format an entire paragraph of text at a time. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Use three backticks above and below.
+Or, indent the lines with four spaces.
+
+ + +
NameTypeDisplays as
Blockquote> text
text
Headers 1-6# Header 1
## Header 2
### Header 3
#### Header 4
##### Header 5
###### Header 6

Header 1

Header 2

Header 3

Header 4

Header 5
Header 6
Ordered list1. First thing
2. Second thing
  1. First thing
  2. Second thing
Unordered list* First thing
* Second thing
  • First thing
  • Second thing
Code Block```
Use three backticks above and below.
Or, indent the lines with four spaces.
```
+
Spoilers<s> bussy > gussy </s>

bussy > gussy

+ + +## Custom Formatting + +We also have some custom hooks for mentioning users and subreddits. Note that these only work if the mentioned user or subreddit actually exists. + +{% endfilter %} + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDisplays as
Username Mention@QuadNarca@QuadNarca
Subreddit Mentionr/Dramar/Drama
Redditor Mentionu/Bardfinnu/Bardfinn
+ +{% include "expanded_image_modal.html" %} + + + +{% endblock %} diff --git a/ruqqus/templates/gif_modal.html b/ruqqus/templates/gif_modal.html new file mode 100644 index 000000000..5b9dae222 --- /dev/null +++ b/ruqqus/templates/gif_modal.html @@ -0,0 +1,143 @@ + + diff --git a/ruqqus/templates/gm_exile_modal.html b/ruqqus/templates/gm_exile_modal.html new file mode 100644 index 000000000..032048c93 --- /dev/null +++ b/ruqqus/templates/gm_exile_modal.html @@ -0,0 +1,25 @@ + + \ No newline at end of file diff --git a/ruqqus/templates/gm_invitation_modal.html b/ruqqus/templates/gm_invitation_modal.html new file mode 100644 index 000000000..86c8513d7 --- /dev/null +++ b/ruqqus/templates/gm_invitation_modal.html @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/ruqqus/templates/guild_details_modal.html b/ruqqus/templates/guild_details_modal.html new file mode 100644 index 000000000..6819e47e7 --- /dev/null +++ b/ruqqus/templates/guild_details_modal.html @@ -0,0 +1,89 @@ +{% set board = b if b else p.board %} + + \ No newline at end of file diff --git a/ruqqus/templates/guild_settings.html b/ruqqus/templates/guild_settings.html new file mode 100644 index 000000000..f84a463b5 --- /dev/null +++ b/ruqqus/templates/guild_settings.html @@ -0,0 +1,215 @@ + + + + + + + + + + + + {% block pagetitle %}Drama{% endblock %} + + + + + + + + + {% if v %} + + {% else %} + + {% endif %} + + + + + + + + + + + {% include "header.html" %} + + + + {% block subHeader %} +
+
+
+
+
+
+ +
+
+
+
+
+
+ {% endblock %} + + + {% block subNav %} + +{% if True %} + {% set mod = (v.admin_level==6) %} + +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ {% endif %} + {% endblock %} + + +
+ + {% block content %} + {% endblock %} + +
+ + + + + + + + + + +{% block mobilenavbar %} +{% include "mobile_navigation_bar.html" %} +{% endblock %} + +{% block invitationModal %} +{% endblock %} + +{% block exileModal %} +{% endblock %} + +{% block approveModal %} +{% endblock %} + +{% block errorToasts %} +{% endblock %} + +{% include "bootstrap.html" %} + + + + + + + + + + + {% block scripts %} + {% endblock %} + + + + \ No newline at end of file diff --git a/ruqqus/templates/header.html b/ruqqus/templates/header.html new file mode 100644 index 000000000..dcdb72002 --- /dev/null +++ b/ruqqus/templates/header.html @@ -0,0 +1,187 @@ + + + \ No newline at end of file diff --git a/ruqqus/templates/home.html b/ruqqus/templates/home.html new file mode 100644 index 000000000..753b91146 --- /dev/null +++ b/ruqqus/templates/home.html @@ -0,0 +1,136 @@ +{% extends "default.html" %} + +{% block desktopBanner %} + +
+
+
+ + {% block navbar %} +
+ +
+
+ + +
+ +
+ {% endblock %} +
+
+
+ +{% endblock %} + +{% block PseudoSubmitForm %} + + +
+ +
+
+
+
Create post
+
    +
  • +
  • +
+
+
+ {% if v %} + + + + {% else %} + + + + {% endif %} +
+
+
+ +
+{% endblock %} + +{% block content %} + +
+ +
+ +
+ + {% include "submission_listing.html" %} + +
+
+
+ +{% endblock %} + +{% block pagenav %} +{% if listing %} + +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/home_comments.html b/ruqqus/templates/home_comments.html new file mode 100644 index 000000000..9ddf401fe --- /dev/null +++ b/ruqqus/templates/home_comments.html @@ -0,0 +1,90 @@ +{% extends "default.html" %} + +{% block PseudoSubmitForm %}{% endblock %} +{% block sortnav %}{% endblock %} + +{% block content %} + + +

+	
+ +
+
+ + +
+ +
+
+ + +
+ +
+ +
+ + {% include "comments.html" %} + +
+
+
+ + +{% endblock %} + + +{% block pagenav %} + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/index.html b/ruqqus/templates/index.html new file mode 100644 index 000000000..d1c724572 --- /dev/null +++ b/ruqqus/templates/index.html @@ -0,0 +1,8 @@ + +
+

{{ greeting }}

+

[[ greeting ]]

+
+ + + \ No newline at end of file diff --git a/ruqqus/templates/leaderboard.html b/ruqqus/templates/leaderboard.html new file mode 100644 index 000000000..5f0909270 --- /dev/null +++ b/ruqqus/templates/leaderboard.html @@ -0,0 +1,50 @@ +{% extends "guild_settings.html" %} + +{% block pagetitle %}Leaderboard{% endblock %} + +{% block content %} +

+
Top 25 dramatards by dramacoins
+

+
+
+	
+		
+		
+		
+	
+
+{% for user in users1 %}
+	
+		
+		
+		
+	
+{% endfor %}
+
#NameCoins
{{users1.index(user)+1}}{{user.username}}{{user.dramacoins}}
+
+
+
+
+
Top 10 dramatards by followers
+
+
+
+
+ + + + + + + + +{% for user in users2 %} + + + + + +{% endfor %} +
#NameFollowers
{{users2.index(user)+1}}{{user.username}}{{user.follower_count}}
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/login.html b/ruqqus/templates/login.html new file mode 100644 index 000000000..12e12be67 --- /dev/null +++ b/ruqqus/templates/login.html @@ -0,0 +1,136 @@ + + + + + + + + + + + {% block title %} + Login - Drama + {% endblock %} + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+ +
+ Drama +
+ + {% block content %} + +
+ +

Welcome back.

+ +

Glad to have you back!

+ + {% if failed %} + + {% endif %} + +
+ + + + + + + + + + + + Forgot password? + + + +
+ Don't have an account? +
+ +
+ +
+ + {% endblock %} + +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ +
+
+ +{% include "bootstrap.html" %} + + + + + + diff --git a/ruqqus/templates/login_2fa.html b/ruqqus/templates/login_2fa.html new file mode 100644 index 000000000..cfe58086c --- /dev/null +++ b/ruqqus/templates/login_2fa.html @@ -0,0 +1,128 @@ + + + + + + + + + + + 2-Step Login - Drama + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+ +
+ ruqqus +
+ +
+ +

Two-step login

+ +

To login, please enter the 6-digit verification code generated in your authenticator app.

+ + {% if failed %} + + {% endif %} + +
+ + + + + + + + + + + + Lost your 2FA device? + + + +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ +
+
+ +{% include "bootstrap.html" %} + + + + + + + + + + + + diff --git a/ruqqus/templates/lost_2fa.html b/ruqqus/templates/lost_2fa.html new file mode 100644 index 000000000..76e066de8 --- /dev/null +++ b/ruqqus/templates/lost_2fa.html @@ -0,0 +1,36 @@ +{% extends "authforms.html" %} + +{% block pagetitle %}Drama Two-Factor Removal{% endblock %} + +{% block authtitle %}Remove the two-factor authentication from your account.{% endblock %} + +{% block authtext %}If all information is correct, you will be able to remove 2-factor authentication from your account in 24 hours.{% endblock %} + +{% block content %} + +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/message.html b/ruqqus/templates/message.html new file mode 100644 index 000000000..13bc84ae3 --- /dev/null +++ b/ruqqus/templates/message.html @@ -0,0 +1,33 @@ +{% extends "default.html" %} + +{% block title %} +{{title}} +{% endblock %} + +{% block sidebar %}{% endblock %} + +{% block pagetype %}message{% endblock %} + +{% block customPadding %}{% endblock %} + +{% block content %} +
+
+
+ + + + + + +

{{title}}

+
{{message if message else error}}
+ {% if link and link_text %} + {{link_text}} + {% else %} + Go to homepage + {% endif %} +
+
+
+{% endblock %} diff --git a/ruqqus/templates/message_success.html b/ruqqus/templates/message_success.html new file mode 100644 index 000000000..29f2b4cef --- /dev/null +++ b/ruqqus/templates/message_success.html @@ -0,0 +1,17 @@ +{% extends "default.html" %} + +{% block title %} +{{title}} +{% endblock %} + +{% block pagetype %}message-success{% endblock %} + +{% block content %} +
+ + success state +
{{title}}
+

{{text}}

+ +
+{% endblock %} diff --git a/ruqqus/templates/mine/mine.html b/ruqqus/templates/mine/mine.html new file mode 100644 index 000000000..be56a3640 --- /dev/null +++ b/ruqqus/templates/mine/mine.html @@ -0,0 +1,44 @@ +{% extends "home.html" %} + +{% block enlargeThumbJS %} + +{% endblock %} + +{% block PseudoSubmitForm %}{% endblock %} + + + +{% block customPadding %}{% endblock %} + +{% block content %} + + +
+ + {% block maincontent %} + {% endblock %} + +
+ +{% endblock %} + +{% block pagenav %} + +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/mine/users.html b/ruqqus/templates/mine/users.html new file mode 100644 index 000000000..be2263181 --- /dev/null +++ b/ruqqus/templates/mine/users.html @@ -0,0 +1,16 @@ +{% extends "mine/mine.html" %} + +{% block maincontent %} +{% include "user_listing.html" %} +{% endblock %} + +{% block sidebarblock %} + +{% endblock %} + +{% block sidebar %}{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/mobile_navigation_bar.html b/ruqqus/templates/mobile_navigation_bar.html new file mode 100644 index 000000000..f934f1184 --- /dev/null +++ b/ruqqus/templates/mobile_navigation_bar.html @@ -0,0 +1,69 @@ +
+ +
+ + +{% if v and v.defaultsorting == 'new' %} + +{% else %} + +{% endif %} + + +{% if v %} + +{% else %} + +{% endif %} +
+
\ No newline at end of file diff --git a/ruqqus/templates/modlog.html b/ruqqus/templates/modlog.html new file mode 100644 index 000000000..98aed8208 --- /dev/null +++ b/ruqqus/templates/modlog.html @@ -0,0 +1,86 @@ +{% extends "guild_settings.html" %} + +{% block pagetitle %}Moderation Log{% endblock %} + +{% block stylesheets %} + +{% if v %} + + {% if v.agendaposter %}{% elif v.css %}{% endif %} +{% else %} + +{% endif %} + +{% endblock %} + +{% block content %} +
+ +
+ +
+ +
+
Moderation Log
+
+ +
+ +
+ {% for ma in actions %} + +
+ +
+
+
+ + avatar + +
+
+ {% if not ma.user.is_deleted %} + @{{ma.user.username}} + {% else %} + [deleted user] + {% endif %} + + {{ma.string | safe}} +
+ +
{{ma.age_string}}
+ +
+
+
+
+ + + {% else %} +
There's nothing here right now.
+ {% endfor %} +
+ + + + +
+
+{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/mods.html b/ruqqus/templates/mods.html new file mode 100644 index 000000000..c84e8d0fd --- /dev/null +++ b/ruqqus/templates/mods.html @@ -0,0 +1,303 @@ +{% extends "guild_settings.html" %} + +{% block pagetitle %}Badmins{% endblock %} + +{% block scripts %} + + + {% if b.has_invite(v) %} + + {% endif %} + + {% endblock %} + + + + {% block content %} + +
+ +
+ + {% if request.args.get('error') or error %} + + {% endif %} + + {% if request.args.get('msg') or msg %} + + {% endif %} + +
+ +
+ +
+ +
+ +
+

Badmins

+
+ +
+ {% if me %} + Resign + {% endif %} + {% if me and me.perm_full %} + Add badmin + {% endif %} +
+ +
+ +
+ + + + + + + + + + + {% for mod in b.mods_list %} + + + + + + + {% else %} + + {% endfor %} + + +
UserBadmin Since
+ + @{{mod.user.username}} + {{mod.created_date}} + {% if me and me.id < mod.id %} + + {% endif %} + + +
There are no badmins.
+
+ + + +

Pending

+ +

These users have been invited to be badmins.

+ +
+ + + + + + + + + + + {% for m in b.mod_invites %} + + + + + + {% else %} + + {% endfor %} + + +
UserInvited On
+ + @{{m.user.username}} + {{m.created_date}} + +
There are no badmin invitations.
+
+ + +
+ +
+ +
+ +
+ +
+ + + + + + + + + + + + +{% endblock %} + +{% block errorToasts %} + + + +{% endblock %} + +{% block invitationModal %} +{% if b.has_invite(v) %} +{% include "gm_invitation_modal.html" %} +{% endif %} +{% endblock %} diff --git a/ruqqus/templates/notifications.html b/ruqqus/templates/notifications.html new file mode 100644 index 000000000..df10d089e --- /dev/null +++ b/ruqqus/templates/notifications.html @@ -0,0 +1,124 @@ +{% extends "default.html" %} + +{% block fixedMobileBarJS %}{% endblock %} + +{% block pagetype %}{% endblock %} + +{% block PseudoSubmitForm %}{% endblock %} + +{% block navbar %} +
+{% endblock %} + +{% block gifKeyboard %} + +{% endblock %} + +{% block content %} + + + +
+ +

Inbox

+ + {% with comments=notifications %} + + {% include "comments.html" %} + {% endwith %} + + {% if not notifications %} +
+ + + + + + +
No unread messages
+
When someone comments or replies, it will show up here.
+ View entire inbox +
+ + {% endif %} + +
+ +{% endblock %} + +{% block pagenav %} +{% if notifications %} + +{% endif %} +{% endblock %} + +{% block GIFpicker %} +{% if v %} +{% include "gif_modal.html" %} +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/oauth.html b/ruqqus/templates/oauth.html new file mode 100644 index 000000000..be5383ead --- /dev/null +++ b/ruqqus/templates/oauth.html @@ -0,0 +1,43 @@ +{% extends "login.html" %} + +{% block title %} +Application Request for Access +{% endblock %} + +{% block content %} + +
+ +

{{application.app_name}}

+ +

wants to access your @{{v.username}} account.

+

It will be able to:

+
    + {% for scope in scopes %} +
  • {{SCOPES[scope]}}
  • + {% endfor %} + {% if permanent %} +
  • Maintain this access indefinitely, or until you revoke it
  • + {% endif %} +
+ +

It will not be able to see your password, or change your account settings.

+ +
+ + + + + + + + + + + No, back to Drama + +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/oauthhelp.html b/ruqqus/templates/oauthhelp.html new file mode 100644 index 000000000..a0b76c976 --- /dev/null +++ b/ruqqus/templates/oauthhelp.html @@ -0,0 +1,117 @@ +{% extends "default.html" %} + +{% block title %} +Drama - OAuth2 + +{% endblock %} + +{% block content %} +{% filter markdown %} +# OAuth2 + +The OAuth2 authorization flow is used to enable users to authorize third-party applications to access their Drama account without having to provide their login information to the application. + +This page explains how to obtain API application keys, how to prompt a user for authorization, and how to obtain and use access tokens. + +## Step 1: Create your Application + +In the [apps tab of Drama settings](/settings/apps), fill in and submit the form to request new API keys. You will need: + +* an application name +* a Redirect URI, or a comma-separated list of redirect URIs. May not use HTTP unless using localhost (use HTTPS instead). +* a brief description of what your application is intended to do + +Don't worry too much about accuracy; you will be able to change all of these later. + +Drama administrators will review and approve or deny your request for API keys. You'll know when your request has been approved when a client ID and secret appear in your application information. + +DO NOT reveal your Client Secret. Anyone with your Client Secret will be able to pretend to be you. You are responsible for keeping your Client Secret a secret! + +## Step 2: Prompt Your User for Authorization + +Send your user to `https://rdrama.net/oauth/authorize`, with the following URL parameters: + +* `client_id` - Your application's Client ID +* `redirect_uri` - The redirect URI (or one of the URIs) specified in your application information. Must not use HTTP unless using localhost (use HTTPS instead). +* `state` - This is your own anti-cross-site-forgery token. We don't do anything with this, except give it to the user to pass back to you later. You are responsible for generating and validating the state token. +* `scope` - A comma-separated list of permission scopes that you are requesting. Valid scopes are: `identity`, `create`, `read`, `update`, `delete`, `vote`, and `guildmaster`. +* `permanent` - optional. Set to `true` if you are requesting indefinite access. Omit if not. + +If done correctly, the user will see that your application wants to access their Drama account, and be prompted to approve or deny the request. + +## Step 3: Catch the redirect + +The user clicks "Authorize". Drama will redirect the user's browser to GET the designated redirect URI. The following URL parameters will be included, which your server should process: + +* `code` - a **single-use** authorization code. +* `state` - The state token from earlier. + +Validate the state token. How you do this is up to you. + +## Step 4: Exchange code for access token + +Make a POST request to `https://rdrama.net/oauth/grant`. Include the following form parameters: + +* `client_id` - Your application's Client ID +* `client_secret` - Your application's Client Secret +* `grant_type` - Set to the word "code" +* `code` - The `code` parameter that was given to you in the previous step. + +Python example: + +
+	import requests
+	import pprint
+
+	code=request.args.get("code")
+
+	headers={"User-Agent": "Porpl Reader v1 by @captainmeta4"}
+	url="/oauth/grant"
+	data={"client_id": my_client_id,
+			"client_secret": my_client_secret,
+			"grant_type": "code",
+			"code": code
+			}
+
+	r=requests.post(url, headers=headers, data=data)
+
+	pprint.pprint(r.json())
+
+ +If everything is good, we will respond with the following (example) JSON body: + +
+	{
+	"access_token": 		#Access token
+	"scopes": 				#Comma-separated list of scopes included in authorization
+	"expires_at": 			#Unix epoch integer time at which access token expires
+	"token_type": "Bearer"
+	"refresh_token":		#This key is omitted in temporary authorizations
+	}
+
+ +Store the access and refresh tokens. You should also store expiration timestamp and the scopes list, so that you pre-emptively avoid sending requests to Drama that won't be accepted. + +## Step 5: Using the Access Token + +To use the access token, include the following header in subsequent API requests to Drama: `Authorization: Bearer access_token_goes_here` + +Python example, presuming that the application has obtained a valid `read` authorization: + +
+	import requests
+	import pprint
+
+	headers={"Authorization": "Bearer " + access_token,
+			 "User-Agent": "Drama Reader v1 by @carpathianflorist"}
+	url="/api/v1/front/listing"
+
+	r=requests.get(url, headers=headers)
+
+	pprint.pprint(r.json())
+
+ +The expected result of this would be a large JSON representation of the submissions that make up the user's personal front page. + +{% endfilter %} +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/reset_password.html b/ruqqus/templates/reset_password.html new file mode 100644 index 000000000..02c5e27da --- /dev/null +++ b/ruqqus/templates/reset_password.html @@ -0,0 +1,33 @@ +{% extends "authforms.html" %} + +{% block pagetitle %}Drama Password Reset{% endblock %} + +{% block authtitle %}Change your password.{% endblock %} + +{% block content %} + +
+ +
+ + + + + + + + + + + + + + + +
+ +
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/search.html b/ruqqus/templates/search.html new file mode 100644 index 000000000..1473be385 --- /dev/null +++ b/ruqqus/templates/search.html @@ -0,0 +1,239 @@ +{% extends "home.html" %} + +{% block pagetype %}search{% endblock %} + +{% block title %} +Search for "{{query}}" - Drama" + +{% endblock %} + +{% block enlargeThumbJS %} + +{% endblock %} + +{% block toggleView %} + +{% endblock %} + +{% block PseudoSubmitForm %}{% endblock %} + +{% block navbar %} + {% if not '/users/' in request.path %} +
+ + + +
+ {% endif %} +{% endblock %} + +{% block content %} + + +
+ +
+ +
+ +
+
    +
  • +
  • +
+
+
+
+
Advanced search parameters (with examples): "author:quadnarca", "domain:reddit.com", "over18:true"
+
+
Showing {% block listinglength %}{{listing | length}}{% endblock %} of {{total}} result{{'s' if total != 1 else ''}} for
+

{{query}}

+ +
+
+
+
+ +
+ + + +{% if not '/users/' in request.path %} + +
+ + + +
+ {% endif %} + +
+
+
+ +
+
+
+ +
+ +
+ +
+ + {% block listing_template %}{% include "submission_listing.html" %}{% endblock %} + +
+
+
+ + {% if not '/users/' in request.path %} +
+ +
+ +
+ +
+ +
+ + + + + +
+ +
+ + + +
+ +
+ +
+ {% endif %} + {% endblock %} + + {% block pagenav %} + {% if listing %} + + {% endif %} + {% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/search_comments.html b/ruqqus/templates/search_comments.html new file mode 100644 index 000000000..9ef954a28 --- /dev/null +++ b/ruqqus/templates/search_comments.html @@ -0,0 +1,30 @@ +{% extends "search.html" %} + +{% block listing_template %} +
+ {% with comments=comments %} + {% include "comments.html" %} + {% endwith %} +
+{% endblock %} + +{% block listinglength %} +{{comments | length}} +{% endblock %} + +{% block pagenav %} + {% if comments %} + + {% endif %} +{% endblock %} diff --git a/ruqqus/templates/search_users.html b/ruqqus/templates/search_users.html new file mode 100644 index 000000000..01f8f7d35 --- /dev/null +++ b/ruqqus/templates/search_users.html @@ -0,0 +1,26 @@ +{% extends "search.html" %} + +{% block listing_template %} +
+{% include "user_listing.html" %} +
+{% endblock %} + +{% block listinglength %}{{users | length}}{% endblock %} + +{% block pagenav %} + {% if boards %} + + {% endif %} +{% endblock %} diff --git a/ruqqus/templates/seized.html b/ruqqus/templates/seized.html new file mode 100644 index 000000000..797cc6846 --- /dev/null +++ b/ruqqus/templates/seized.html @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/ruqqus/templates/settings.html b/ruqqus/templates/settings.html new file mode 100644 index 000000000..4e19aecba --- /dev/null +++ b/ruqqus/templates/settings.html @@ -0,0 +1,227 @@ + + + + + + + + + + + + + {% block pagetitle %}Settings - Drama{% endblock %} + + + + + + + + + + + + + + + + + + + + + + + + + {% if v.agendaposter %}{% elif v.css %}{% endif %} + + + + + + + + + + {% include "header.html" %} + +
+ +
+ +
+ + {% if error %} + + {% endif %} + {% if msg %} + + {% endif %} + +
+ +

Settings

+ +

Settings

+ +
+ + + + + +
+ + + +
+ + + +
+ + + +
+ + {% block content %} + {% endblock %} + +
+
+ +
+ + {% if v %} + {% include "2fa_modal.html" %} + {% endif %} + + + +{% block clipboard %} + + + +{% endblock %} + +{% include "bootstrap.html" %} + + + + + + + + + + + + + + + + +{% block onload %}{% endblock %} + + + + \ No newline at end of file diff --git a/ruqqus/templates/settings_apps.html b/ruqqus/templates/settings_apps.html new file mode 100644 index 000000000..8508212b1 --- /dev/null +++ b/ruqqus/templates/settings_apps.html @@ -0,0 +1,172 @@ +{% extends "settings.html" %} + +{% block title %} +Drama - FAQ + +{% endblock %} + +{% block content %} +
+
+
+ + +

OAuth Guide

+ +

+
+

Your API Applications

+ +{% for app in v.applications if app.client_secret %} + +
+
+
+
+ +
+
+ + + + + {% if app.client_secret %} + + + + Click to show + + {% endif %} + + + + + + +
+
+ +
+ +
+{% else %} +

None

+{% endfor %} + +

API Applications Awaiting Approval

+ +{% for app in v.applications if not app.client_secret %} + +
+
+
+
+ +
+
+ + + + + {% if app.client_secret %} + + + + Click to show + + {% endif %} + + + + + + +
+
+ +
+ +
+{% else %} +

None

+{% endfor %} + +

Your Authorized Applications

+ +{% for auth in v.authorizations.all() %} + +
+
+
+ +
+
+ + + + + +
+
+ +
+{% else %} +

None

+{% endfor %} + +

Request API Keys

+ +
+
+
+
+ + + + + + + + + +
+
+ +
+
+
+
+
+{% endblock %} + + +{% block clipboard %} + + + +{% endblock %} diff --git a/ruqqus/templates/settings_blocks.html b/ruqqus/templates/settings_blocks.html new file mode 100644 index 000000000..248837112 --- /dev/null +++ b/ruqqus/templates/settings_blocks.html @@ -0,0 +1,124 @@ +{% extends "settings.html" %} + +{% block pagetitle %}Block Settings - Drama{% endblock %} + +{% block content %} + +
+ +
+ + {% if error %} + + {% endif %} + +
+ +
+ + +
+ +
+ +
+ +
+

Users you block

+

You have blocked the following users. They cannot reply to your content or notify you with a username mention.

+
+
+ +
+
+ + + + {% if v.blocking.first() %} +
+ + + + + + + + + + {% for block in v.blocking %} + + + + + + + + {% else %} + + {% endfor %} + +
UserBlocked since
+ + @{{block.target.username}} + {{block.created_date}} + +
There are no blocked users
+
+ {% else %} +
+ +

No blocked users

+
+ {% endif %} + +
+ +
+ + + + + + +{% endblock %} diff --git a/ruqqus/templates/settings_css.html b/ruqqus/templates/settings_css.html new file mode 100644 index 000000000..5e4614525 --- /dev/null +++ b/ruqqus/templates/settings_css.html @@ -0,0 +1,51 @@ +{% extends "settings.html" %} + +{% block pagetitle %}Custom CSS - Drama{% endblock %} + +{% block content %} + +
+ +
+ +
+ +
+ +

Edit your custom CSS for the site.

+ +
+ +
+
+
+ + + Limit of 50000 characters +
+ +
+
+
+ +
+ +
+ +
+ +
+
+{% if v.agendaposter %} + +{% endif %} +
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/settings_filters.html b/ruqqus/templates/settings_filters.html new file mode 100644 index 000000000..766c8449d --- /dev/null +++ b/ruqqus/templates/settings_filters.html @@ -0,0 +1,253 @@ +{% extends "settings.html" %} + +{% block pagetitle %}Profile Settings - Drama{% endblock %} + +{% block content %} + + +
+ +
+ +
+ +

Default Sorting and Time Filter

+ +
+ +
+
+ +
+ +
+

Change the default sorting for comments.

+
+ +
+ +
+ +
+ +
+
+ +
+ +
+

Change the default sorting for posts.

+
+ +
+ +
+ +
+ +
+
+ +
+ +
+

Change the default time filter for posts.

+
+ +
+ +
+ +
+ +
+ +

Tab Behaviour

+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ + Enable if you would like to automatically open threads in new tabs. + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ + +
+ + Enable if you would like to automatically open external links in new tabs. + +
+ +
+ + + +
+ + +

Reddit Links

+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ + Enable if you would like to automatically convert reddit.com links to old.reddit.com links. + +
+ +
+ +
+ +

Content Filters

+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ + Enable if you would like to not get a warning before viewing +18 content. + +
+ +
+ + + +
+ +
+ +
+ +
+ +
+ + +
+ + Enable if you would like to automatically replace slurs with funny r/drama equivalents. + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ + +
+ + Enable if you would like to automatically hide posts you have voted on from your frontpage. + +
+ +
+ +
+ +
+ +
+ +
+
+ + Hides matching content from Home, All, and Trending, and collapses matching comments. +
+ +
+
+ Use a new line for each filter entry. Limit of 1000 characters. + +
+
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +{% endblock %} diff --git a/ruqqus/templates/settings_profile.html b/ruqqus/templates/settings_profile.html new file mode 100644 index 000000000..70bbf7d7a --- /dev/null +++ b/ruqqus/templates/settings_profile.html @@ -0,0 +1,494 @@ +{% extends "settings.html" %} + +{% block pagetitle %}Profile Settings - Drama{% endblock %} + +{% block content %} +{% include "emoji_modal.html" %} +{% include "gif_modal.html" %} + +
+ +
+ +
+ +

Theme

+ +
+ +
+
+ +
+ +
+

Change the theme for the website.

+
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + {% for themecolor in ['ff66ac','805ad5','62ca56','38a169','80ffff','2a96f3','eb4963','ff0000','f39731','30409f','3e98a7','e4432d','7b9ae4','ec72de','7f8fa6', 'f8db58'] %} + + + {% endfor %} + +
+ +
+ +
+ +
+ + +

Profile Picture

+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + {% if v.can_upload_avatar %} + +
+ + +
+ + {% else %} + +
You can add a custom avatar after earning 30 Dramacoins.{% if request.headers.get("cf-ipcountry")=="T1" and not v.is_activated %} Additionally, you must have a verified email address to upload images via Tor.{% endif %}
+ + {% endif %} + +
+ + {% if v.has_profile %} +
+
+ + +
+
+ {% endif %} + +
+ + {% if v.can_upload_avatar %} + +
JPG, PNG, GIF files are supported. Max file size is 16 MB.
+ + {% endif %} + +
+ +
+ +
+

Profile Banner

+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + {% if v.can_upload_banner %} + +
+ + +
+ + {% else %} + +
You can add a custom banner after earning 30 Dramacoins.{% if request.headers.get("cf-ipcountry")=="T1" and not v.is_activated %} Additionally, you must have a verified email address to upload images via Tor.{% endif %}
+ + {% endif %} + +
+ +
+ + {% if v.has_banner %} +
+ + +
{% endif %} + +
+ +
+ + {% if v.can_upload_banner %} + +
JPG, PNG, GIF files are supported. Max file size is 16 MB.
+ + {% endif %} + +
+ +
+ +
+ +

Referrals

+ +

Invite a friend.

+ +
+ +
+ +
+ +
+ +
+ +
+ + + + + + {{v.referral_count}} + + +
+ +
Share this link with a friend. {% if v.referral_count==0 %} When they sign up, you'll get the bronze recruitment badge. Learn more.{% elif v.referral_count<10 %} When you refer 10 friends, you'll receive the silver recruitment badge. Learn more.{% elif v.referral_count<100 %} When you refer 100 friends, you'll receive the gold recruitment badge. Learn more.{% endif %}
+ +
+ +
+ +
+ + +

Linked Accounts

+ +

Manage your connections to other services.

+ +
+ +
+ +
+ +
+ +
+ + {% if v.discord_id %} +
+ + +
+ +
Disconnecting your Discord account will remove you from the Drama Discord server.
+ {% else %} + Link Discord +
Link your Discord account to join the Drama Discord server.
+ {% endif %} + +
+ +
+ +
+ + +

RSS Feed

+ +

Subscribe to the Drama RSS feed.

+ +
+ +
+ +
+ + + +
You can change the feed by replacing "hot" with whatever sorting you want and "all" with whatever time filter you want.
+ +
+ +
+ +
+ +

Your Profile

+ +

Edit how others see you on Drama.

+ +
+ +
+ + + +
+

Your original username will always stay reserved for you: {{v.original_username}}

+ + +
+ + + 3-25 characters, including letters, numbers, _ , and - +
+ +
+
+
+ +
+ +
+ + + +
+

Must be a youtube video link.

+ +
+ + +
In some browsers, users have to click at least once anywhere in the profile page for the anthem to play. +
+ +
+
+
+ +
+ +
+ + + +
+ +
+ + + {% for color in ['ff66ac','805ad5','62ca56','38a169','80ffff','2a96f3','eb4963','ff0000','f39731','30409f','3e98a7','e4432d','7b9ae4','ec72de','7f8fa6', 'f8db58'] %} + + + {% endfor %} + +
+ +
+ +
+ + {% if not v.flairchanged %} +
+ + + +
+ +
+ + +
+ +     + Limit of 100 characters + +
+
+
+ +
+ {% endif %} + +
+ + + +
+ +
+ + + {% for titlecolor in ['ff66ac','805ad5','62ca56','38a169','80ffff','2a96f3','eb4963','ff0000','f39731','30409f','3e98a7','e4432d','7b9ae4','ec72de','7f8fa6', 'f8db58'] %} + + + {% endfor %} + +
+ +
+ +
+ +
+ + + +
+ + +
+ +
+ +
+ +
+ +   + +   + +   + +   + +   +
+ +

+										
+										
+ Limit of 1500 characters + +
+
+
+ +
+ +
+ + +
+

Profile badges show off all of your site achievements. If your badges look not quite up to date, use this tool to refresh them.

+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ + This will hide your post and comment history from others. We will also ask search engines to not index your profile page. (Your content will still be accessible via direct link.) + +
+ +
+
+ +
+ +
+ +
+ +
+ + +
+ + Prevent other users from following you. + +
+ +
+
+
+ +
+ +
+ + + + + + + +{% endblock %} diff --git a/ruqqus/templates/settings_profilecss.html b/ruqqus/templates/settings_profilecss.html new file mode 100644 index 000000000..a924b770f --- /dev/null +++ b/ruqqus/templates/settings_profilecss.html @@ -0,0 +1,41 @@ +{% extends "settings.html" %} + +{% block pagetitle %}Custom profilecss - Drama{% endblock %} + +{% block content %} + +
+ +
+ +
+ +
+ +

Edit your profile css.

+ +
+ +
+
+
+ + + Limit of 50000 characters +
+ +
+
+
+ +
+ +
+ +
+ +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/ruqqus/templates/settings_security.html b/ruqqus/templates/settings_security.html new file mode 100644 index 000000000..681d69bc6 --- /dev/null +++ b/ruqqus/templates/settings_security.html @@ -0,0 +1,302 @@ +{% extends "settings.html" %} + +{% block pagetitle %}Security Settings - Drama{% endblock %} + +{% block content %} + + + +
+ +
+ +
+ +

Password

+ +

Change your account password.

+ +
+ +
+ +
+ +
+ + + + + Minimum of 8 + characters + required. + Your password + meets the + requirements. + + +
+ +
+ + + + + + Passwords do not + match. + Passwords match. + + +
+ +
+ + + + + +
+ +
+ + + +
+ +
+ +

Email

+ +

Change the email address used to sign in to your account.

+ +
+ +
+ + +
+ +
+ + + +
+ + + {% if v.email and not v.is_activated %} +
Email not verified. You will not be able to recover your account with this email until you verify it. Verify now.
+ {% elif not v.email %} +
Add an email to secure your account in case you forget your password.
+ {% endif %} + +
+ +
+ +
+ + + +
+ + + + Password required to update your email. + +
+ +
+ + Password required to update your email. + +
+ + + +
+ +
+ + +

Two-Factor Authentication

+ +

Change the two-factor settings for your account.

+ +
+ +
+ +
+ +
+ +
+ +
+ + +
+ + This requires entering a randomly-generated, 6-digit code and your password to login. See Google Authenticator or Authy for more details. + +
+ +
+ +
+ +

Log Out Everywhere

+ +

Log all other devices out of your Drama account.

+ +
+ +
+ + +
+ +
+ + + +
+ + + +
+ +
+ + This will also invalidate any existing recovery links associated with this account. + +
+ + + +
+ +
+ +
+ +
+ +
+ + + + + + + +