├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE.md ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ └── feature_request.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── lint_python.yaml │ ├── publish_crowdin.yaml │ ├── publish_pypi.yml │ └── tests.yml ├── .gitignore ├── .readthedocs.yml ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── babel.cfg ├── crowdin.yaml ├── docs ├── .resources │ ├── copy_secret.png │ ├── launched_interface.png │ ├── select_add_redirect.png │ ├── select_app.png │ ├── select_oauth2.png │ └── submit_redirect.png ├── Makefile ├── conf.py ├── configuration_guides │ ├── index.rst │ ├── installing_companion_cog.rst │ ├── multibot.rst │ └── singlebot.rst ├── help_and_support.rst ├── index.rst ├── installation_guides │ ├── mac_linux_installation.rst │ ├── systemctl_startup.rst │ └── windows_installation.rst ├── launching_guides │ ├── running_webserver_multi_bot.rst │ └── running_webserver_one_bot.rst ├── make.bat ├── reverse_proxy_apache.rst └── reverse_proxy_nginx.rst ├── documents ├── Cookie Policy.md ├── Privacy Policy.md └── Third Party Disclaimer.md ├── make.bat ├── pyproject.toml ├── reddash ├── LICENSE.md ├── __init__.py ├── __main__.py └── app │ ├── __init__.py │ ├── api │ ├── __init__.py │ └── routes.py │ ├── base │ ├── __init__.py │ ├── routes.py │ ├── static │ │ └── assets │ │ │ ├── css │ │ │ ├── black-dashboard.css │ │ │ ├── black-dashboard.css.map │ │ │ ├── black-dashboard.min.css │ │ │ ├── bootstrap-select.min.css │ │ │ └── nucleo-icons.css │ │ │ ├── fonts │ │ │ ├── nucleo.eot │ │ │ ├── nucleo.ttf │ │ │ ├── nucleo.woff │ │ │ └── nucleo.woff2 │ │ │ ├── img │ │ │ ├── dnd.png │ │ │ ├── idle.png │ │ │ ├── offline.png │ │ │ └── online.png │ │ │ ├── js │ │ │ ├── black-dashboard.js │ │ │ ├── black-dashboard.js.map │ │ │ ├── black-dashboard.min.js │ │ │ ├── bootstrap-select.min.js │ │ │ ├── core │ │ │ │ ├── bootstrap.min.js │ │ │ │ ├── jquery.min.js │ │ │ │ └── popper.min.js │ │ │ └── plugins │ │ │ │ ├── bootstrap-notify.js │ │ │ │ ├── chartjs.min.js │ │ │ │ └── perfect-scrollbar.jquery.min.js │ │ │ └── scss │ │ │ ├── black-dashboard.scss │ │ │ └── black-dashboard │ │ │ ├── _buttons.scss │ │ │ ├── _typography.scss │ │ │ ├── bootstrap │ │ │ ├── _alert.scss │ │ │ ├── _badge.scss │ │ │ ├── _breadcrumb.scss │ │ │ ├── _button-group.scss │ │ │ ├── _buttons.scss │ │ │ ├── _card.scss │ │ │ ├── _carousel.scss │ │ │ ├── _close.scss │ │ │ ├── _code.scss │ │ │ ├── _custom-forms.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _forms.scss │ │ │ ├── _functions.scss │ │ │ ├── _grid.scss │ │ │ ├── _images.scss │ │ │ ├── _input-group.scss │ │ │ ├── _jumbotron.scss │ │ │ ├── _list-group.scss │ │ │ ├── _media.scss │ │ │ ├── _mixins.scss │ │ │ ├── _modal.scss │ │ │ ├── _nav.scss │ │ │ ├── _navbar.scss │ │ │ ├── _pagination.scss │ │ │ ├── _popover.scss │ │ │ ├── _print.scss │ │ │ ├── _progress.scss │ │ │ ├── _reboot.scss │ │ │ ├── _root.scss │ │ │ ├── _spinners.scss │ │ │ ├── _tables.scss │ │ │ ├── _toasts.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _transitions.scss │ │ │ ├── _type.scss │ │ │ ├── _utilities.scss │ │ │ ├── _variables.scss │ │ │ ├── bootstrap-grid.scss │ │ │ ├── bootstrap-reboot.scss │ │ │ ├── bootstrap.scss │ │ │ ├── mixins │ │ │ │ ├── _alert.scss │ │ │ │ ├── _background-variant.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _border-radius.scss │ │ │ │ ├── _box-shadow.scss │ │ │ │ ├── _breakpoints.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _caret.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _deprecate.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _gradients.scss │ │ │ │ ├── _grid-framework.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _hover.scss │ │ │ │ ├── _image.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _lists.scss │ │ │ │ ├── _nav-divider.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _reset-text.scss │ │ │ │ ├── _resize.scss │ │ │ │ ├── _screen-reader.scss │ │ │ │ ├── _size.scss │ │ │ │ ├── _table-row.scss │ │ │ │ ├── _text-emphasis.scss │ │ │ │ ├── _text-hide.scss │ │ │ │ ├── _text-truncate.scss │ │ │ │ ├── _transition.scss │ │ │ │ └── _visibility.scss │ │ │ ├── utilities │ │ │ │ ├── _align.scss │ │ │ │ ├── _background.scss │ │ │ │ ├── _borders.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _display.scss │ │ │ │ ├── _embed.scss │ │ │ │ ├── _flex.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _overflow.scss │ │ │ │ ├── _position.scss │ │ │ │ ├── _screenreaders.scss │ │ │ │ ├── _shadows.scss │ │ │ │ ├── _sizing.scss │ │ │ │ ├── _spacing.scss │ │ │ │ ├── _stretched-link.scss │ │ │ │ ├── _text.scss │ │ │ │ └── _visibility.scss │ │ │ └── vendor │ │ │ │ └── _rfs.scss │ │ │ ├── custom │ │ │ ├── _alerts.scss │ │ │ ├── _buttons.scss │ │ │ ├── _card.scss │ │ │ ├── _checkboxes-radio.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _example-pages.scss │ │ │ ├── _fixed-plugin.scss │ │ │ ├── _footer.scss │ │ │ ├── _forms.scss │ │ │ ├── _functions.scss │ │ │ ├── _images.scss │ │ │ ├── _input-group.scss │ │ │ ├── _misc.scss │ │ │ ├── _mixins.scss │ │ │ ├── _modal.scss │ │ │ ├── _navbar.scss │ │ │ ├── _rtl.scss │ │ │ ├── _sidebar-and-main-panel.scss │ │ │ ├── _tables.scss │ │ │ ├── _type.scss │ │ │ ├── _utilities.scss │ │ │ ├── _variables.scss │ │ │ ├── _white-content.scss │ │ │ ├── cards │ │ │ │ ├── _card-chart.scss │ │ │ │ ├── _card-map.scss │ │ │ │ ├── _card-plain.scss │ │ │ │ ├── _card-task.scss │ │ │ │ └── _card-user.scss │ │ │ ├── mixins │ │ │ │ ├── _alert.scss │ │ │ │ ├── _background-variant.scss │ │ │ │ ├── _badges.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _dropdown.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _icon.scss │ │ │ │ ├── _inputs.scss │ │ │ │ ├── _modals.scss │ │ │ │ ├── _page-header.scss │ │ │ │ ├── _popovers.scss │ │ │ │ ├── _vendor-prefixes.scss │ │ │ │ ├── _wizard.scss │ │ │ │ └── opacity.scss │ │ │ ├── utilities │ │ │ │ ├── _backgrounds.scss │ │ │ │ ├── _floating.scss │ │ │ │ ├── _helper.scss │ │ │ │ ├── _position.scss │ │ │ │ ├── _shadows.scss │ │ │ │ ├── _sizing.scss │ │ │ │ ├── _spacing.scss │ │ │ │ ├── _text.scss │ │ │ │ └── _transform.scss │ │ │ └── vendor │ │ │ │ ├── _plugin-animate-bootstrap-notify.scss │ │ │ │ └── _plugin-perfect-scrollbar.scss │ │ │ └── plugins │ │ │ └── _plugin-perfect-scrollbar.scss │ └── templates │ │ ├── base-site.html │ │ ├── errors │ │ ├── 403.html │ │ ├── 404.html │ │ ├── 500.html │ │ └── blacklisted.html │ │ ├── login │ │ └── login.html │ │ ├── pages │ │ ├── commands.html │ │ └── credits.html │ │ └── site_template │ │ ├── fixed-plugin.html │ │ ├── footer.html │ │ ├── navigation.html │ │ ├── scripts-sidebar.html │ │ ├── scripts.html │ │ └── sidebar.html │ ├── constants.py │ ├── dashboard │ ├── __init__.py │ ├── routes.py │ └── templates │ │ ├── dashboard.html │ │ ├── guild.html │ │ ├── index.html │ │ ├── page-403.html │ │ ├── page-404.html │ │ ├── page-500.html │ │ └── third_party │ │ └── spotify.html │ ├── tasks.py │ ├── translations │ ├── af_ZA │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── ar_SA │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── bg_BG │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── ca_ES │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── cs_CZ │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── da_DK │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── de_DE │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── el_GR │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── es_ES │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── fi_FI │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── fr_FR │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── he_IL │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── hu_HU │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── id_ID │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── it_IT │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── ja_JP │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── ko_KR │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── nl_NL │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── no_NO │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── pl_PL │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── pt_BR │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── pt_PT │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── ro_RO │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── ru_RU │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── sk_SK │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── sr_SP │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── sv_SE │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── tr_TR │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── uk_UA │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── vi_VN │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── zh_CN │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ ├── zh_HK │ │ └── LC_MESSAGES │ │ │ ├── messages.mo │ │ │ └── messages.po │ └── zh_TW │ │ └── LC_MESSAGES │ │ ├── messages.mo │ │ └── messages.po │ └── utils.py ├── requirements.txt ├── setup.cfg ├── setup.py └── tox.ini /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | patreon: NeuroAssassin 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Report an issue you have with the Dashboard 4 | title: '' 5 | labels: '2-type-bug/fix' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ### What part of dashboard are you having an issue with? 11 | 12 | - [ ] Documentation 13 | - [ ] Dashboard webserver 14 | - [ ] Dashboard cog 15 | 16 | ### What happened? 17 | 18 | 19 | ### What did you expect to happen? 20 | 21 | 22 | ### What can we do to reproduce this? 23 | 24 | 25 | ### What is your bot/webserver running on? 26 | - **Operating system**: 27 | - **Python version**: 28 | - **Dashboard webserver version**: 29 | - **Dashboard cog version**: 30 | 31 | ### What are you having issues on? 32 | - **Operating system**: 33 | - **Browser**: 34 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: Support question 4 | url: https://discord.gg/vQZTdB9 5 | about: For any questions regarding on how to operate and run Red-Dashboard. 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '2-type-feature' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Type 2 | 3 | - [ ] Bugfix 4 | - [ ] Enhancement 5 | - [ ] New feature 6 | 7 | ### Description of the changes 8 | -------------------------------------------------------------------------------- /.github/workflows/lint_python.yaml: -------------------------------------------------------------------------------- 1 | name: Lint Python 2 | on: 3 | pull_request: 4 | push: 5 | repository_dispatch: 6 | types: 7 | - dispatched_test 8 | 9 | env: 10 | ref: ${{ github.event.client_payload.ref || '' }} 11 | 12 | jobs: 13 | lint_python: 14 | name: Lint Python 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v2 18 | with: 19 | ref: ${{ env.ref }} 20 | - uses: actions/setup-python@v2 21 | with: 22 | python_version: "3.8" 23 | - run: "python -m pip install git+https://github.com/pycqa/pyflakes@1911c20#egg=pyflakes git+https://github.com/pycqa/pycodestyle@d219c68#egg=pycodestyle git+https://gitlab.com/pycqa/flake8@3.7.9#egg=flake8" 24 | name: Install Flake8 25 | - run: "python -m flake8 . --count --select=E9,F7,F82 --show-source" 26 | name: Flake8 Linting 27 | -------------------------------------------------------------------------------- /.github/workflows/publish_crowdin.yaml: -------------------------------------------------------------------------------- 1 | name: Publish to Crowdin 2 | on: 3 | workflow_dispatch: 4 | schedule: 5 | - cron: '0 12 * * WED' 6 | repository_dispatch: 7 | types: crowdin 8 | 9 | permissions: 10 | contents: write 11 | pull-requests: write 12 | 13 | env: 14 | CROWDIN_API_KEY: ${{ secrets.crowdin_token}} 15 | CROWDIN_PROJECT_ID: ${{ secrets.crowdin_identifier }} 16 | 17 | jobs: 18 | deploy: 19 | if: github.repository == 'Cog-Creators/Red-Dashboard' 20 | runs-on: ubuntu-latest 21 | steps: 22 | - uses: actions/checkout@v2 23 | - name: Set up Python 24 | uses: actions/setup-python@v2 25 | with: 26 | python-version: '3.8' 27 | - name: Install dependencies 28 | run: | 29 | curl https://artifacts.crowdin.com/repo/GPG-KEY-crowdin | sudo apt-key add - 30 | echo "deb https://artifacts.crowdin.com/repo/deb/ /" | sudo tee -a /etc/apt/sources.list 31 | sudo apt-get update -qq 32 | sudo apt-get install -y crowdin 33 | pip install flask-babel 34 | - name: Generate source files 35 | run: | 36 | make gettext 37 | - name: Upload source files 38 | run: | 39 | make upload_translations 40 | - name: Download translations 41 | run: | 42 | make download_translations 43 | - name: Compile translations 44 | run: | 45 | make compile_translations 46 | - name: Commit compiled translations 47 | run: | 48 | git config user.name 'Github' 49 | git config user.email 'noreply@github.com' 50 | git add -f reddash/app/translations 51 | git commit -m "Automated Crowdin downstream" 52 | - name: Create Pull Request 53 | uses: peter-evans/create-pull-request@v3 54 | with: 55 | token: ${{ secrets.GITHUB_TOKEN }} 56 | commit-message: Automated Crowdin downstream 57 | title: "[i18n] Automated Crowdin downstream" 58 | body: | 59 | This is an automated PR. 60 | Please ensure that there are no errors or invalid files are in the PR. 61 | labels: "1-area-i18n, 2-type-other, 3-changelog-skipped, 4-automated-pr" 62 | branch: "automated/i18n" 63 | author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> 64 | -------------------------------------------------------------------------------- /.github/workflows/publish_pypi.yml: -------------------------------------------------------------------------------- 1 | name: Publish to PyPI 2 | on: 3 | push: 4 | tags: 5 | - "*" 6 | 7 | jobs: 8 | deploy: 9 | if: github.repository == 'Cog-Creators/Red-Dashboard' 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Set up Python 14 | uses: actions/setup-python@v2 15 | with: 16 | python-version: '3.8' 17 | - name: Install dependencies 18 | run: | 19 | python -m pip install --upgrade pip 20 | pip install setuptools wheel twine 21 | - name: Build and publish 22 | env: 23 | TWINE_USERNAME: __token__ 24 | TWINE_PASSWORD: ${{ secrets.pypi_token }} 25 | run: | 26 | python setup.py sdist bdist_wheel 27 | twine upload dist/* -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | on: 3 | pull_request: 4 | push: 5 | repository_dispatch: 6 | types: 7 | - dispatched_test 8 | 9 | env: 10 | ref: ${{ github.event.client_payload.ref || '' }} 11 | 12 | jobs: 13 | tox: 14 | runs-on: ubuntu-latest 15 | strategy: 16 | matrix: 17 | python_version: 18 | - "3.8" 19 | tox_env: 20 | - py 21 | - style 22 | - docs 23 | include: 24 | - tox_env: py 25 | friendly_name: Tests 26 | - tox_env: style 27 | friendly_name: Style 28 | - tox_env: docs 29 | friendly_name: Docs 30 | fail-fast: false 31 | name: Tox - ${{ matrix.friendly_name }} 32 | steps: 33 | - uses: actions/checkout@v2 34 | with: 35 | ref: ${{ env.ref }} 36 | - name: Set up Python 37 | uses: actions/setup-python@v2 38 | with: 39 | python-version: ${{ matrix.python_version }} 40 | - name: Install tox 41 | run: | 42 | python -m pip install --upgrade pip 43 | pip install tox 44 | - name: Tox test 45 | env: 46 | TOXENV: ${{ matrix.tox_env }} 47 | run: tox -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | build: 4 | os: "ubuntu-22.04" 5 | tools: 6 | python: "3.8" 7 | jobs: 8 | install: 9 | - pip install .[docs] 10 | 11 | sphinx: 12 | configuration: docs/conf.py 13 | 14 | python: 15 | install: 16 | - method: pip 17 | path: . 18 | extra_requirements: 19 | - docs 20 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | graft reddash 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PYTHON ?= python3.8 2 | 3 | # Python Code Style 4 | reformat: 5 | $(PYTHON) -m black -l 99 reddash 6 | stylecheck: 7 | $(PYTHON) -m black --check -l 99 reddash 8 | stylediff: 9 | $(PYTHON) -m black --check --diff -l 99 reddash 10 | 11 | # Development environment 12 | newenv: 13 | $(PYTHON) -m venv --clear .venv 14 | .venv/bin/pip install -U pip setuptools 15 | 16 | # Translations 17 | gettext: 18 | pybabel extract -F babel.cfg -o reddash/app/messages.pot . 19 | pybabel update -i reddash/app/messages.pot -d reddash/app/translations 20 | upload_translations: 21 | crowdin upload sources 22 | download_translations: 23 | crowdin download 24 | compile_translations: 25 | pybabel compile -d reddash/app/translations -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Red-Dashboard 2 | 3 | > [!CAUTION] 4 | > This project is **discontinued**, is no longer supported, and is known to be **completely non-functional**. 5 | > If you are searching for a dashboard, please search the [Index](https://index.discord.red/) for one in active development. 6 | 7 |
8 | Outdated README 9 |
10 | 11 | ![Red-Dashboard](https://repository-images.githubusercontent.com/268283173/ca43baea-0048-49f4-9f89-67c121369c3c "Red-Dashboard") 12 | 13 | *An easy-to-use interactive web dashboard to control your Redbot.* 14 | 15 | ## Overview 16 | The Red Discord Bot - Dashboard is an easy-to-use interactive web dashboard to control your Redbot, allowing for easier customization of settings and more interactive plugins to develop and get your bot ready for production. Using Discord Open Authentication, users will log into the dashboard using their Discord account, ensuring that all users are only allowed to customize and view settings that they are explicitly given permission to control, providing a safe and secure experience for all users. 17 | 18 | ## Installation 19 | To get started on setting up your Red Discord Bot - Dashboard for your Redbot, please follow the installation instructions that can be found [here](https://red-dashboard.readthedocs.io/en/latest/). 20 | 21 | The Red Discord Bot - Dashboard is supported on Windows, Mac OS X and Linux distributions, however is recommended on Linux distributions for security reasons. Support is not given for setting up your domain for your dashboard other than any guides given for such, and contributors to the source code are not responsible for any security issues that arise as a result of not securely setting up the software. 22 | 23 | ## Support 24 | If you wish to use this program and receive support for it, you must also give feedback and report any bugs you encounter. You can join my support server [here](https://discord.gg/vQZTdB9). 25 | 26 | ## Legal 27 | Red - Discord Bot Dashboard is released under [Affero General Public License v3](https://github.com/Cog-Creators/Red-Dashboard/blob/master/LICENSE). 28 | 29 | For details about how the Red - Discord Bot - Dashboard manages your privacy, please review the following documents. By using this program, you acknowledge that you have read these documents and consent to having your data used in the ways described in such documents. 30 | - [Cookie Policy](https://github.com/Cog-Creators/Red-Dashboard/blob/master/documents/Cookie%20Policy.md) 31 | - [Privacy Policy](https://github.com/Cog-Creators/Red-Dashboard/blob/master/documents/Privacy%20Policy.md) 32 | - [Third Party Disclaimer](https://github.com/Cog-Creators/Red-Dashboard/blob/master/documents/Third%20Party%20Disclaimer.md) 33 | 34 | ## Credits 35 | I would like to thank the following, for all the contributions they have made that helped this become what it is today. 36 | * Predeactor, laying the base of the documentation. 37 | * Cog Creators, for making such an amazing bot. 38 | * All the people who tested the dashboard, and gave feedback. 39 | * AppSeed, for creating a template that I use as the base for the Dashboard. 40 | 41 |
-------------------------------------------------------------------------------- /babel.cfg: -------------------------------------------------------------------------------- 1 | [python: **.py] 2 | [jinja2: **/templates/**.html] 3 | extensions=jinja2.ext.autoescape, jinja2.ext.with_ -------------------------------------------------------------------------------- /crowdin.yaml: -------------------------------------------------------------------------------- 1 | api_key_env: CROWDIN_API_KEY 2 | project_identifier_env: CROWDIN_PROJECT_ID 3 | base_path: ./reddash/app/ 4 | preserve_hierarchy: true 5 | files: 6 | - source: messages.pot 7 | translation: translations/%locale%/LC_MESSAGES/messages.po 8 | translation_replace: 9 | "-": _ -------------------------------------------------------------------------------- /docs/.resources/copy_secret.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/docs/.resources/copy_secret.png -------------------------------------------------------------------------------- /docs/.resources/launched_interface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/docs/.resources/launched_interface.png -------------------------------------------------------------------------------- /docs/.resources/select_add_redirect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/docs/.resources/select_add_redirect.png -------------------------------------------------------------------------------- /docs/.resources/select_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/docs/.resources/select_app.png -------------------------------------------------------------------------------- /docs/.resources/select_oauth2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/docs/.resources/select_oauth2.png -------------------------------------------------------------------------------- /docs/.resources/submit_redirect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/docs/.resources/submit_redirect.png -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | 7 | # -- Path setup -------------------------------------------------------------- 8 | 9 | # If extensions (or modules to document with autodoc) are in another directory, 10 | # add these directories to sys.path here. If the directory is relative to the 11 | # documentation root, use os.path.abspath to make it absolute, like shown here. 12 | # 13 | # import os 14 | # import sys 15 | # sys.path.insert(0, os.path.abspath('.')) 16 | 17 | 18 | # -- Project information ----------------------------------------------------- 19 | 20 | project = "Red Dashboard" 21 | copyright = "2020, Neuro Assassin" 22 | author = "Neuro Assassin" 23 | 24 | # The full version, including alpha/beta/rc tags 25 | release = "0.1.4a" 26 | 27 | 28 | # -- General configuration --------------------------------------------------- 29 | 30 | # Add any Sphinx extension module names here, as strings. They can be 31 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 32 | # ones. 33 | extensions = ["sphinx-prompt"] 34 | 35 | # Add any paths that contain templates here, relative to this directory. 36 | templates_path = ["_templates"] 37 | 38 | # List of patterns, relative to source directory, that match files and 39 | # directories to ignore when looking for source files. 40 | # This pattern also affects html_static_path and html_extra_path. 41 | exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] 42 | 43 | # Role which is assigned when you make a simple reference within backticks 44 | default_role = "any" 45 | 46 | # The master toctree document 47 | master_doc = "index" 48 | 49 | 50 | # -- Options for HTML output ------------------------------------------------- 51 | 52 | # The theme to use for HTML and HTML Help pages. See the documentation for 53 | # a list of builtin themes. 54 | # 55 | html_theme = "sphinx_rtd_theme" 56 | 57 | # Theme options are theme-specific and customize the look and feel of a theme 58 | # further. For a list of options available for each theme, see the 59 | # documentation. 60 | # 61 | # html_theme_options = {} 62 | 63 | html_context = { 64 | # Enable the "Edit in GitHub link within the header of each page. 65 | "display_github": True, 66 | "github_user": "Cog-Creators", 67 | "github_repo": "Red-Dashboard", 68 | "github_version": "master/docs/", 69 | } 70 | 71 | # Add any paths that contain custom static files (such as style sheets) here, 72 | # relative to this directory. They are copied after the builtin static files, 73 | # so a file named "default.css" will overwrite the builtin "default.css". 74 | html_static_path = [] 75 | -------------------------------------------------------------------------------- /docs/configuration_guides/index.rst: -------------------------------------------------------------------------------- 1 | .. _configuration-guides: 2 | 3 | Configuring Companion Cog 4 | ========================= 5 | 6 | Due to advanced setups, the steps to set up Red Dashboard for two bots opposed to one are more complex. Consider your needs then pick the guide to follow: 7 | 8 | .. toctree:: 9 | :maxdepth: 1 10 | 11 | singlebot 12 | multibot -------------------------------------------------------------------------------- /docs/configuration_guides/installing_companion_cog.rst: -------------------------------------------------------------------------------- 1 | Installing Companion Cog 2 | ======================== 3 | 4 | .. danger:: 5 | This project is **discontinued**, is no longer supported, and is known to 6 | be **completely non-functional**. If you are searching for a dashboard, 7 | please search the `Index `_ for one in active 8 | development. 9 | 10 | ---- 11 | 12 | .. attention:: 13 | 14 | This webserver and it's accompanying cog is built for Red Discord Bot. It will not work with other bots. If you haven’t already, install Red `here `__. 15 | 16 | Welcome to the Dashboard Cog Installation Guide. While running the below directions, the following is assumed: 17 | 18 | 1. You have an active instance of Red Discord Bot, 3.3.9+ (you can check your version with ``[p]info``). 19 | 2. You are considered a "bot owner" on your Red instance, meaning you can run owner-only commands. 20 | 21 | Installing the cog from the repository 22 | -------------------------------------- 23 | 24 | Installing the cog is extremely easy, and can be accomplished through Red's plugin, or cog system. 25 | 26 | 1. First, if you have not already, load the ``downloader`` cog on your bot: 27 | 28 | .. tip:: 29 | 30 | ``[p]`` represents your bot's prefix. Make sure to replace it when pasting these commands inside of Discord. 31 | 32 | .. code-block:: none 33 | 34 | [p]load downloader 35 | 36 | 2. Next, add Neuro Assassin's cog repository to your bot: 37 | 38 | .. code-block:: none 39 | 40 | [p]repo add NeuroAssassin https://github.com/NeuroAssassin/Toxic-Cogs 41 | 42 | .. danger:: 43 | 44 | The ``dashboard`` cog located `here `__ is the only official companion cog to the Red Dashboard software. Take precaution before installing cogs that you may not trust. 45 | 46 | 3. Next, install the ``dashboard`` cog from the repository: 47 | 48 | .. code-block:: none 49 | 50 | [p]cog install NeuroAssassin dashboard 51 | 52 | 4. Finally, load the ``dashboard`` cog: 53 | 54 | .. code-block:: none 55 | 56 | [p]load dashboard 57 | 58 | *You can now proceed to configuration the companion dashboard cog. Start* `here ` *to decide which guide to follow.* 59 | -------------------------------------------------------------------------------- /docs/help_and_support.rst: -------------------------------------------------------------------------------- 1 | Help & Support 2 | ============== 3 | 4 | .. danger:: 5 | This project is **discontinued**, is no longer supported, and is known to 6 | be **completely non-functional**. If you are searching for a dashboard, 7 | please search the `Index `_ for one in active 8 | development. 9 | 10 | Common Questions 11 | ---------------- 12 | 13 | **Dashboard cog is loaded, and webserver is up, but it isn't showing my 14 | bot's info** 15 | 16 | - Did you start the bot with the RPC flag? 17 | - If you started the bot with the ``--rpc-port`` flag, did you provide 18 | the same port to ``reddash``\ command when starting the webserver? Vice versa? 19 | - Have you set the redirect and secret in the cog's settings? 20 | - Have you tried reloading the dashboard cog/restarting the webserver? 21 | - Have you tried updating the dashboard cog and dashboard itself? 22 | 23 | **My browser said the website take too much time to answer or a similar 24 | error** 25 | 26 | Your firewall is maybe not configured to accept the port Dashboard is 27 | listening for, if you are on Linux, run ``sudo ufw allow `` 28 | (Default is 42356). If you are on Windows, type ``Firewall`` in your 29 | search bar and add a new rule. 30 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. Red Dashboard documentation master file, created by 2 | sphinx-quickstart on Mon Jul 13 13:01:47 2020. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to Red Dashboard's documentation! 7 | ========================================= 8 | 9 | .. danger:: 10 | This project is **discontinued**, is no longer supported, and is known to 11 | be **completely non-functional**. If you are searching for a dashboard, 12 | please search the `Index `_ for one in active 13 | development. 14 | 15 | .. toctree:: 16 | :maxdepth: 1 17 | :caption: Webserver installation 18 | 19 | installation_guides/mac_linux_installation 20 | installation_guides/windows_installation 21 | installation_guides/systemctl_startup 22 | 23 | .. toctree:: 24 | :maxdepth: 1 25 | :caption: Cog installation 26 | 27 | configuration_guides/installing_companion_cog 28 | configuration_guides/index 29 | 30 | .. toctree:: 31 | :maxdepth: 1 32 | :caption: Launching dashboard 33 | 34 | launching_guides/running_webserver_one_bot 35 | launching_guides/running_webserver_multi_bot 36 | 37 | .. toctree:: 38 | :maxdepth: 1 39 | :caption: Reverse proxy 40 | 41 | reverse_proxy_apache 42 | reverse_proxy_nginx 43 | 44 | .. toctree:: 45 | :maxdepth: 1 46 | :caption: Support 47 | 48 | help_and_support -------------------------------------------------------------------------------- /docs/installation_guides/systemctl_startup.rst: -------------------------------------------------------------------------------- 1 | Automatic Startup (systemctl) 2 | ============================= 3 | 4 | .. warning:: 5 | 6 | This guide is for **Linux only.** There's is no auto-restart system for Windows or Mac at the moment. 7 | 8 | .. warning:: 9 | 10 | If you plan to run this with multiple bots, you will need to add the flags you normally add to the ExecStart line. Additionally, if you have multiple systemctl files for the dashboard, you will need to rename them. 11 | 12 | 13 | Creating the service file 14 | ------------------------- 15 | 16 | In order to create the service file, you will first need to know two 17 | things, your Linux ``username`` and your Python ``path``. 18 | 19 | First, your Linux ``username`` can be fetched with the following 20 | command: 21 | 22 | .. code-block:: none 23 | 24 | whoami 25 | 26 | Next, your python ``path`` can be fetched with the following commands: 27 | 28 | .. code-block:: none 29 | 30 | # If reddash is installed in a venv 31 | source ~/redashenv/bin/activate 32 | which python 33 | 34 | # If reddash is installed in a pyenv virtualenv 35 | pyenv shell 36 | pyenv which python 37 | 38 | Then create the new service file: 39 | 40 | ``sudo -e /etc/systemd/system/redash.service`` 41 | 42 | Replace ``path`` with your python path and ``username`` with your Linux username. 43 | 44 | .. code-block:: none 45 | 46 | [Unit] 47 | Description=Red Dashboard 48 | After=multi-user.target 49 | After=network-online.target 50 | Wants=network-online.target 51 | 52 | [Service] 53 | ExecStart=path -O -m reddash 54 | User=username 55 | Group=username 56 | Type=idle 57 | Restart=always 58 | RestartSec=15 59 | RestartPreventExitStatus=0 60 | TimeoutStopSec=10 61 | 62 | [Install] 63 | WantedBy=multi-user.target 64 | 65 | Save your file and exit: ``ctrl + O; enter; ctrl + x`` 66 | 67 | Now you can start dashboard by using: 68 | 69 | .. code-block:: none 70 | 71 | # Start Dashboard 72 | sudo systemctl start redash 73 | 74 | # Stop Dashboard 75 | sudo systemctl stop redash 76 | 77 | Automatic startup on system bootup 78 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | 80 | To automatically start dashboard at system's bootup, use the following 81 | command: 82 | 83 | .. code-block:: none 84 | 85 | # Enable automatic startup 86 | sudo systemctl enable redash 87 | 88 | # Disable automatic startup 89 | sudo systemctl disable redash 90 | 91 | Check logs 92 | ~~~~~~~~~~ 93 | 94 | To check Dashboard's logs, use: 95 | 96 | .. code-block:: none 97 | 98 | sudo journalctl -eu redash 99 | 100 | .. tip:: 101 | 102 | You can use the ``--following`` flag to see live logs, to check if there's any trouble while using the dashboard. -------------------------------------------------------------------------------- /docs/installation_guides/windows_installation.rst: -------------------------------------------------------------------------------- 1 | Windows Installation 2 | ==================== 3 | 4 | .. danger:: 5 | This project is **discontinued**, is no longer supported, and is known to 6 | be **completely non-functional**. If you are searching for a dashboard, 7 | please search the `Index `_ for one in active 8 | development. 9 | 10 | ---- 11 | 12 | .. attention:: 13 | 14 | This webserver and it's accompanying cog is built for Red Discord Bot. It will not work with other bots. If you haven’t already, install Red `here `__. 15 | 16 | .. warning:: 17 | 18 | For safety reasons, no commands in this guide should be run in a Command Prompt or Powershell session with Administrator privileges. No installation commands require access to protected folders. 19 | 20 | Welcome to the Windows Installation Guide for the Red Discord Bot 21 | Dashboard Webserver. While running the below directions, the following 22 | is assumed: 23 | 24 | - You are on a Windows distribution 25 | - You have all pre-requisites of Red Discord Bot installed 26 | - You have an instance of Red Discord Bot, set up and initialized 27 | 28 | Installing the pre-requirements 29 | ------------------------------- 30 | 31 | This guide recommends using the same requisites that Red - Discord Bot uses. To ensure that you have the proper software already installed, consult the installation guide for your operating system `here `__. 32 | 33 | Creating a virtual environment 34 | ------------------------------ 35 | 36 | Just like for Red - Discord Bot, Red Dashboard requires it’s own, separate virtual environment to isolate dependencies. Red Dashboard also requires a Python version minimum of 3.8.1, and it is recommended to use the same Python version as you use for Red - Discord Bot. 37 | 38 | First, create a virtual environment using whatever Python version you use for red. For example, if Python 3.8 was installed and being used for Red: 39 | 40 | .. prompt:: batch 41 | 42 | py -3.8 -m venv "%userprofile%\reddashenv" 43 | 44 | Next, enter your virtual environment with this command: 45 | 46 | .. prompt:: batch 47 | 48 | "%userprofile%\reddashenv\Scripts\activate.bat" 49 | 50 | .. important:: 51 | 52 | You must activate the virtual environment with the above command every time you open a new shell to run, install or update Red Dashboard. 53 | 54 | Installing Red Dashboard 55 | ------------------------ 56 | 57 | First, make sure you are in your virtual environment that you set up earlier by running the activation command mentioned above. 58 | 59 | Once you are inside your virtual environment, update setup packages then install: 60 | 61 | .. prompt:: batch 62 | :prompts: (reddashenv) C:\\> 63 | 64 | python -m pip install -U pip setuptools wheel 65 | python -m pip install -U Red-Dashboard 66 | 67 | *You can continue to* `Installing Companion Cog <../configuration_guides/installing_companion_cog>`. 68 | -------------------------------------------------------------------------------- /docs/launching_guides/running_webserver_multi_bot.rst: -------------------------------------------------------------------------------- 1 | Running the Webserver with multiple bots 2 | ======================================== 3 | 4 | .. important:: 5 | 6 | In order for the bot to communicate with the webserver, you must add the argument ``--rpc`` to the start line of each of your Red bots. Additionally, 7 | you must add ``--rpc-port `` to the start line for each of your bots, dependent on the webserver you are connecting to. 8 | 9 | At this point, the dashboard cog should be loaded and initialized on your Red bot, and restarted to have RPC enabled (as mentioned above). 10 | The webserver package should be installed into it's own, separate virtual environment, and your OAuth2 settings should be updated within Discord. 11 | 12 | Once you are squared away, activate your virtual environment using the command during installation, then for each of your webservers, run the following command, 13 | replacing ```` and ```` with the ports you came up with `here <../configuration_guides/multibot>`: 14 | 15 | .. prompt:: bash 16 | 17 | reddash --port --rpc-port 18 | 19 | A text interface should pop up, similar to that below (note that your ports will be different): 20 | 21 | .. image:: ../.resources/launched_interface.png 22 | 23 | If your screen looks like the above, congrats! Your dashboard should be successfully connected to your Red bot, and viewable at the domain/IP address 24 | specified in `Configuration Companion Cog - Multi Bot <../configuration_guides/multibot>`. If you wish for the webserver to run with Automatic Startup, check out 25 | the `Automatic Startup (systemctl) <../installation_guides/systemctl_startup>` guide if you are on Linux. 26 | 27 | Does your bot say RPC Disconnected or some other error? Check to make sure that your bot started with the ``--rpc`` flag and are using the same RPC ports. If 28 | you have any other issues, feel free to drop by the support server listed `here <../help_and_support>`. -------------------------------------------------------------------------------- /docs/launching_guides/running_webserver_one_bot.rst: -------------------------------------------------------------------------------- 1 | Running the Webserver 2 | ===================== 3 | 4 | .. important:: 5 | 6 | In order for the bot to communicate with the webserver, you must add the argument ``--rpc`` to the start line of your Red bot. 7 | 8 | At this point, the dashboard cog should be loaded and initialized on your Red bot, and restarted to have RPC enabled (as mentioned above). 9 | The webserver package should be installed into it's own, separate virtual environment, and your OAuth2 settings should be updated within Discord. 10 | 11 | Once you are squared away, activate your virtual environment using the command during installation, then run: 12 | 13 | .. prompt:: bash 14 | 15 | reddash 16 | 17 | A text interface should pop up, similar to that below: 18 | 19 | .. image:: ../.resources/launched_interface.png 20 | 21 | If your screen looks like the above, congrats! Your dashboard should be successfully connected to your Red bot, and viewable at the domain/IP address 22 | specified in `Configuration Companion Cog - Single Bot <../configuration_guides/singlebot>`. If you wish for the webserver to run with Automatic Startup, check out 23 | the `Automatic Startup (systemctl) <../installation_guides/systemctl_startup>` guide if you are on Linux. 24 | 25 | Does your bot say RPC Disconnected or some other error? Check to make sure that your bot started with the ``--rpc`` flag and are using the same RPC port (6133). If 26 | you have any other issues, feel free to drop by the support server listed `here <../help_and_support>`. -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=python -msphinx 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | set SPHINXPROJ=Red-Dashboard 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 20 | echo.installed, then set the SPHINXBUILD environment variable to point 21 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 22 | echo.may add the Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /docs/reverse_proxy_apache.rst: -------------------------------------------------------------------------------- 1 | Reverse proxying with Apache on Linux 2 | ===================================== 3 | 4 | Welcome to the Apache reverse proxy guide. Note that this guide is meant 5 | only for Linux users, and that currently there are no options for Windows 6 | or Mac. These commands will not work on those OSs, so do not follow this 7 | if you are not on a Linux distribution. 8 | 9 | Installing Apache 10 | ----------------- 11 | 12 | 1. Start off by updating your package index 13 | 14 | .. code-block:: none 15 | 16 | sudo apt update 17 | 18 | 2. Next, install the apache2 package 19 | 20 | .. code-block:: none 21 | 22 | sudo apt install apache2 23 | 24 | At this point, if you navigate to your device's IP address, you should see an Apache welcome page. 25 | 26 | Set up reverse proxy 27 | -------------------- 28 | 29 | You probably don't want people visiting your domain to see that static Apache welcome page. 30 | Now we need to configure apache to reverse proxy port 42356, or whichever port 31 | your webserver is running on. 32 | 33 | 1. Create a host configuration file for your domain: 34 | 35 | .. code-block:: none 36 | 37 | sudo nano /etc/apache2/sites-available/redash.conf 38 | 39 | 2. Paste the following into the file, replacing ``your.domain.com`` with the domain you will 40 | be running the dashboard on. Note that if you are running the webserver on a port other than 41 | port 42356, you will need to replace ``42356`` below with the the specified port. 42 | 43 | .. code-block:: none 44 | 45 | 46 | ServerName your.domain.com 47 | ProxyPreserveHost On 48 | ProxyPass / http://0.0.0.0:42356/ 49 | ProxyPassReverse / http://0.0.0.0:42356/ 50 | 51 | 52 | 3. Enable the Apache modifications needed to reverse proxy 53 | 54 | .. code-block:: none 55 | 56 | sudo a2enmod proxy 57 | sudo a2enmod proxy_http 58 | 59 | 4. Enable the new host configuration file and disable the default 60 | 61 | .. code-block:: none 62 | 63 | sudo a2ensite redash.conf 64 | sudo a2dissite 000-default.conf 65 | 66 | 5. Finally, restart apache for the changes to take effect 67 | 68 | .. code-block:: none 69 | 70 | sudo systemctl restart apache2 71 | 72 | Now, if you navigate to your device's IP, you should be able to see the dashboard (if the 73 | webserver is running). -------------------------------------------------------------------------------- /docs/reverse_proxy_nginx.rst: -------------------------------------------------------------------------------- 1 | Reverse proxying with Nginx on Linux 2 | ==================================== 3 | 4 | Welcome to the Nginx reverse proxy guide. Note that this guide is meant 5 | only for Linux users, and that currently there are no options for Windows 6 | or Mac. These commands will not work on those OSs, so do not follow this 7 | if you are not on a Linux distribution. 8 | 9 | Installing Nginx 10 | ---------------- 11 | 12 | 1. Start off by updating your package index 13 | 14 | .. code-block:: none 15 | 16 | sudo apt update 17 | 18 | 2. Next, install the nginx package 19 | 20 | .. code-block:: none 21 | 22 | sudo apt install nginx 23 | 24 | At this point, if you navigate to your device's IP address, you should see an Nginx welcome page. 25 | 26 | Set up reverse proxy 27 | -------------------- 28 | 29 | You probably don't want people visiting your domain to see that static Nginx welcome page. 30 | Now we need to configure Nginx to reverse proxy port 42356, or whichever port 31 | your webserver is running on. 32 | 33 | 1. Delete the default Nginx site 34 | 35 | .. code-block:: none 36 | 37 | sudo rm /etc/nginx/sites-enabled/default 38 | 39 | 40 | 2. Create a host configuration file for your domain: 41 | 42 | .. code-block:: none 43 | 44 | sudo nano /etc/nginx/sites-available/redash 45 | 46 | 3. Paste the following into the file, replacing ``your.domain.com`` with the domain you will 47 | be running the dashboard on. Note that if you are running the webserver on a port other than 48 | port 42356, you will need to replace ``42356`` below with the the specified port. 49 | 50 | .. code-block:: none 51 | 52 | server { 53 | listen 80; 54 | server_name your.domain.com; 55 | 56 | location / { 57 | proxy_pass http://0.0.0.0:42356; 58 | } 59 | } 60 | 61 | 4. Enable the file by creating a link from it to the sites-enabled directory 62 | 63 | .. code-block:: none 64 | 65 | sudo ln -s /etc/nginx/sites-available/redash /etc/nginx/sites-enabled/ 66 | 67 | 5. Finally, restart Nginx for the changes to take effect 68 | 69 | .. code-block:: none 70 | 71 | sudo systemctl restart nginx 72 | 73 | Now, if you navigate to your device's IP, you should be able to see the dashboard (if the 74 | webserver is running). -------------------------------------------------------------------------------- /documents/Cookie Policy.md: -------------------------------------------------------------------------------- 1 | # Cookie Policy 2 | 3 | ## Introduction 4 | The Red Discord Bot - Dashboard website uses cookies for many reasons, as outlined below. This document will expand on Sections 1 and 2 outlined in the [Privacy Policy](https://github.com/Cog-Creators/Red-Dashboard/blob/legal-documents/legal/Privacy%20Policy.md). "Creators," "we" or "us" refers to Repository Owners of the source code or any user that has contributed to the Red Discord Bot - Dashboard code. "You" refers to the person reading this Cookie Policy or accessing this website. "Owner" or "bot owner" refers to any person(s) who has access to the website/service files or to the Red Discord Bot program/service files. 5 | 6 | This Cookie Policy applies to you whenever you access this Red - Discord Bot Dashboard website/service or any other Red - Discord Bot Dashboard website/services. This Cookie Policy will detail to you: 7 | 8 | - What kinds of data we store in cookies. 9 | - Why we store this data in cookies. 10 | - How you can remove these cookies. 11 | 12 | If you wish for this website to not store your data in cookies, then you may not use this website/service. 13 | 14 | This Cookie Policy applies to any unmodified distribution of the source code found here (https://github.com/Cog-Creators/Red-Dashboard). If this instance of Red Discord Bot - Dashboard is modified in any way from the code found in the above link, then this Cookie Policy does not apply, and instead "creators," "we" or "us" refers to the same person(s) as "owner" or "bot owner" does. 15 | 16 | ## 1. What kinds of data do we store in cookies 17 | 18 | We store data in cookies for different categories, as outlined below: 19 | 20 | ### Authorization 21 | If you're signed into the Red Discord Bot - Dashboard website, then we hold authorization data (as detailed in Section 1 of the Privacy Policy) so that we can show you the correct information. 22 | 23 | ### Security 24 | If you're signed into the Red Discord Bot - Dashboard website, then we use the authorization data (as detailed in Section 1 of the Privacy Policy) to make sure you cannot access features that you do not have permission to access. This is to improve the experience of you and other users. 25 | 26 | ### User experience 27 | If you are using the Red Discord Bot - Dashboard website, then we use data such as your preferred language locale and theme to better your user experience. 28 | 29 | ## 2. Why we store this data in cookies 30 | 31 | We don't believe in storing data backend that doesn't have to be, where we could instead store it in a place that the user can control. As a result, we do not store any data on the host machine, and instead store it client side so you can directly control it. 32 | 33 | ## 3. How you can remove these cookies 34 | 35 | You may not like your data being stored in cookies. We fully understand this. In order to remove this data from your browser so we can no longer store the current data, you may go to your browser settings and Clear All Cookies/LocalStorage data. This will reset your data and will forget everything we know about you. Additionally, due to security reasons, your authorization data will be invalidated everytime the website/service restarts. 36 | 37 | ## 4. Changes to Cookie Policy 38 | It is possible that this Cookie Policy may be updated as situations change and to satisfy legal requirements. If this happens at any time, we will attempt to notify owners through a third-party app, Discord, 30 days before such changes to privacy policies are put into effect, so that the owner may communicate to users the changes that the Cookie Policy will be experiencing. -------------------------------------------------------------------------------- /make.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | if [%1] == [] goto help 4 | 5 | REM This allows us to expand variables at execution 6 | setlocal ENABLEDELAYEDEXPANSION 7 | 8 | goto %1 9 | 10 | :reformat 11 | black -l 99 reddash 12 | exit /B %ERRORLEVEL% 13 | 14 | :stylecheck 15 | black --check -l 99 reddash 16 | exit /B %ERRORLEVEL% 17 | 18 | :stylediff 19 | black --check --diff -l 99 reddash 20 | exit /B %ERRORLEVEL% 21 | 22 | :newenv 23 | py -3.8 -m venv --clear .venv 24 | .\.venv\Scripts\python -m pip install -U pip setuptools 25 | exit /B %ERRORLEVEL% 26 | 27 | :help 28 | echo Usage: 29 | echo make ^ 30 | echo. 31 | echo Commands: 32 | echo reformat Reformat all .py files being tracked by git. 33 | echo stylecheck Check which tracked .py files need reformatting. 34 | echo newenv Create or replace this project's virtual environment. -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.black] 2 | exclude = ''' 3 | /( 4 | \.eggs 5 | | \.git 6 | | \.hg 7 | | \.mypy_cache 8 | | \.tox 9 | | \.venv 10 | | _build 11 | | buck-out 12 | | build 13 | | dist 14 | )/ 15 | ''' 16 | include = '\.py$' 17 | line-length = 99 18 | target-version = ['py38'] 19 | 20 | [tool.isort] 21 | combine_as_imports = true 22 | line-length = 99 23 | profile = "black" 24 | -------------------------------------------------------------------------------- /reddash/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 [AppSeed App Generator](https://appseed.us) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /reddash/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.1.8a.dev" 2 | __author__ = "Neuro Assassin#4779" 3 | -------------------------------------------------------------------------------- /reddash/__main__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | License: Commercial 4 | Copyright (c) 2019 - present AppSeed.us 5 | """ 6 | 7 | from reddash.app import create_app 8 | import argparse 9 | import logging 10 | from rich.console import Console 11 | from rich.logging import RichHandler 12 | import os 13 | import sys 14 | 15 | if sys.stdin.isatty(): 16 | os.system("cls" if os.name == "nt" else "clear") 17 | 18 | os.environ["WERKZEUG_RUN_MAIN"] = "true" 19 | 20 | console = Console() 21 | 22 | logging.basicConfig(format="%(message)s", handlers=[RichHandler()]) 23 | 24 | log = logging.getLogger("werkzeug") 25 | log.setLevel(logging.ERROR) 26 | 27 | dashlog = logging.getLogger("reddash") 28 | dashlog.setLevel(logging.WARNING) 29 | 30 | parser = argparse.ArgumentParser( 31 | description="Argument parser for Red Discord Bot Dashboard - Client" 32 | ) 33 | parser.add_argument("--host", dest="host", type=str, default="0.0.0.0") 34 | parser.add_argument("--port", dest="port", type=int, default=42356) 35 | parser.add_argument("--rpc-port", dest="rpcport", type=int, default=6133) 36 | parser.add_argument("--interval", dest="interval", type=int, default=5, help=argparse.SUPPRESS) 37 | parser.add_argument("--debug", dest="debug", action="store_true") 38 | parser.add_argument("--development", dest="dev", action="store_true", help=argparse.SUPPRESS) 39 | 40 | 41 | def main(): 42 | args = vars(parser.parse_args()) 43 | 44 | if args["interval"] != 5: 45 | console.print( 46 | "Detected interval argument. Please note that this argument should only be used if you are explicitly told to use it.", 47 | style="bold red", 48 | ) 49 | 50 | if args["dev"]: 51 | console.print( 52 | "Detected development status. Please note that this argument is only for testing. Do NOT use if you are opening this up to other people, as it can cause security issues. Confirm that you wish to run the webserver in developmental status by typing 'I agree', case sensitive, below:\n", 53 | style="bold red", 54 | ) 55 | confirm = input("> ") 56 | print("") 57 | if confirm == "I agree": 58 | console.print( 59 | "User has read the warnings and has typed I agree. Launching developmental server...", 60 | style="bold red", 61 | ) 62 | else: 63 | console.print( 64 | 'User did not type "I agree". Launching production server...', style="bold red", 65 | ) 66 | args["dev"] = False 67 | 68 | create_app( 69 | args["host"], args["port"], args["rpcport"], args["interval"], args["debug"], args["dev"], 70 | ) 71 | 72 | 73 | if __name__ == "__main__": 74 | main() 75 | -------------------------------------------------------------------------------- /reddash/app/api/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | License: MIT 4 | Copyright (c) 2019 - present AppSeed.us 5 | """ 6 | 7 | from flask import Blueprint 8 | 9 | blueprint = Blueprint("api_blueprint", __name__,) 10 | -------------------------------------------------------------------------------- /reddash/app/base/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | License: MIT 4 | Copyright (c) 2019 - present AppSeed.us 5 | """ 6 | 7 | from flask import Blueprint 8 | 9 | blueprint = Blueprint( 10 | "base_blueprint", __name__, template_folder="templates", static_folder="static", 11 | ) 12 | -------------------------------------------------------------------------------- /reddash/app/base/static/assets/fonts/nucleo.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/fonts/nucleo.eot -------------------------------------------------------------------------------- /reddash/app/base/static/assets/fonts/nucleo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/fonts/nucleo.ttf -------------------------------------------------------------------------------- /reddash/app/base/static/assets/fonts/nucleo.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/fonts/nucleo.woff -------------------------------------------------------------------------------- /reddash/app/base/static/assets/fonts/nucleo.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/fonts/nucleo.woff2 -------------------------------------------------------------------------------- /reddash/app/base/static/assets/img/dnd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/img/dnd.png -------------------------------------------------------------------------------- /reddash/app/base/static/assets/img/idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/img/idle.png -------------------------------------------------------------------------------- /reddash/app/base/static/assets/img/offline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/img/offline.png -------------------------------------------------------------------------------- /reddash/app/base/static/assets/img/online.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Cog-Creators/Red-Dashboard/69771c5270230cafe2547a8ddaf0bf15cc725176/reddash/app/base/static/assets/img/online.png -------------------------------------------------------------------------------- /reddash/app/base/static/assets/scss/black-dashboard/_buttons.scss: -------------------------------------------------------------------------------- 1 | // mixins comune kit dash etc 2 | -------------------------------------------------------------------------------- /reddash/app/base/static/assets/scss/black-dashboard/_typography.scss: -------------------------------------------------------------------------------- 1 | // ce e comun intre kit-uri si dash-uri 2 | -------------------------------------------------------------------------------- /reddash/app/base/static/assets/scss/black-dashboard/bootstrap/_alert.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Base styles 3 | // 4 | 5 | .alert { 6 | position: relative; 7 | padding: $alert-padding-y $alert-padding-x; 8 | margin-bottom: $alert-margin-bottom; 9 | border: $alert-border-width solid transparent; 10 | @include border-radius($alert-border-radius); 11 | } 12 | 13 | // Headings for larger alerts 14 | .alert-heading { 15 | // Specified to prevent conflicts of changing $headings-color 16 | color: inherit; 17 | } 18 | 19 | // Provide class for links that match alerts 20 | .alert-link { 21 | font-weight: $alert-link-font-weight; 22 | } 23 | 24 | 25 | // Dismissible alerts 26 | // 27 | // Expand the right padding and account for the close button's positioning. 28 | 29 | .alert-dismissible { 30 | padding-right: $close-font-size + $alert-padding-x * 2; 31 | 32 | // Adjust close link position 33 | .close { 34 | position: absolute; 35 | top: 0; 36 | right: 0; 37 | padding: $alert-padding-y $alert-padding-x; 38 | color: inherit; 39 | } 40 | } 41 | 42 | 43 | // Alternate styles 44 | // 45 | // Generate contextual modifier classes for colorizing the alert. 46 | 47 | @each $color, $value in $theme-colors { 48 | .alert-#{$color} { 49 | @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /reddash/app/base/static/assets/scss/black-dashboard/bootstrap/_badge.scss: -------------------------------------------------------------------------------- 1 | // Base class 2 | // 3 | // Requires one of the contextual, color modifier classes for `color` and 4 | // `background-color`. 5 | 6 | .badge { 7 | display: inline-block; 8 | padding: $badge-padding-y $badge-padding-x; 9 | @include font-size($badge-font-size); 10 | font-weight: $badge-font-weight; 11 | line-height: 1; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | @include border-radius($badge-border-radius); 16 | @include transition($badge-transition); 17 | 18 | @at-root a#{&} { 19 | @include hover-focus { 20 | text-decoration: none; 21 | } 22 | } 23 | 24 | // Empty badges collapse automatically 25 | &:empty { 26 | display: none; 27 | } 28 | } 29 | 30 | // Quick fix for badges in buttons 31 | .btn .badge { 32 | position: relative; 33 | top: -1px; 34 | } 35 | 36 | // Pill badges 37 | // 38 | // Make them extra rounded with a modifier to replace v3's badges. 39 | 40 | .badge-pill { 41 | padding-right: $badge-pill-padding-x; 42 | padding-left: $badge-pill-padding-x; 43 | @include border-radius($badge-pill-border-radius); 44 | } 45 | 46 | // Colors 47 | // 48 | // Contextual variations (linked badges get darker on :hover). 49 | 50 | @each $color, $value in $theme-colors { 51 | .badge-#{$color} { 52 | @include badge-variant($value); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /reddash/app/base/static/assets/scss/black-dashboard/bootstrap/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | .breadcrumb { 2 | display: flex; 3 | flex-wrap: wrap; 4 | padding: $breadcrumb-padding-y $breadcrumb-padding-x; 5 | margin-bottom: $breadcrumb-margin-bottom; 6 | list-style: none; 7 | background-color: $breadcrumb-bg; 8 | @include border-radius($breadcrumb-border-radius); 9 | } 10 | 11 | .breadcrumb-item { 12 | // The separator between breadcrumbs (by default, a forward-slash: "/") 13 | + .breadcrumb-item { 14 | padding-left: $breadcrumb-item-padding; 15 | 16 | &::before { 17 | display: inline-block; // Suppress underlining of the separator in modern browsers 18 | padding-right: $breadcrumb-item-padding; 19 | color: $breadcrumb-divider-color; 20 | content: $breadcrumb-divider; 21 | } 22 | } 23 | 24 | // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built 25 | // without `