├── .github
├── ISSUE_TEMPLATE
│ ├── blank.md
│ ├── bug_report.md
│ ├── feature_request.md
│ └── repl-code-behind.md
├── PULL_REQUEST_TEMPLATE
│ └── pull_request_template.md
├── stale.yml
└── workflows
│ ├── SyntaxChecker.yml
│ └── greetings.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── app.py
├── forms.py
├── logs
└── err_log.txt
├── rctools
├── __init__.py
└── __pycache__
│ └── __init__.cpython-38.pyc
├── static
├── css
│ └── main.css
├── images
│ ├── error.png
│ ├── external.png
│ ├── pure-black.jpg
│ ├── repl_pixel.png
│ ├── repl_pixel_256px.png
│ ├── repl_pixel_64px.png
│ └── skeleton.gif
└── js
│ ├── initialize.js
│ └── script.js
├── templates
├── 404.html
├── app.html
├── apps.html
├── error.html
├── index.html
├── license.html
└── user-output.html
└── upcoming.md
/.github/ISSUE_TEMPLATE/blank.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: blank
3 | about: Blank template
4 | title: "[BLANK]"
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here, like the long-term affects of the problem.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
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/ISSUE_TEMPLATE/repl-code-behind.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Repl code behind
3 | about: To tell everyone the repo code is x commits behind
4 | title: "[COMMIT]"
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | # the repl is _ commits behind
11 |
12 | ## why those commits are important
13 | Describe why the commits are important
14 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md:
--------------------------------------------------------------------------------
1 | ## Status
2 | **READY/IN DEVELOPMENT/HOLD**
3 |
4 | ## Migrations
5 | YES | NO
6 |
7 | ## Description
8 | A few sentences describing the overall goals of the pull request's commits.
9 |
10 | + 🔥 The Fire emoji is for changes that mark a file ready for a *new release*.
11 | + ✏️ The Pencil emoji is for minor *changes* to a file such as *spelling errors* or *syntax changes*.
12 | + 🖋️ The Pen emoji is for major *additions* to a file such as a new feature.
13 | + ❗ The Exclamation emoji is for *changes* to information such as *new info* in the Markdown files.
14 | + ➕ The Plus emoji is for the *addition* of a file that didn't exist before.
15 | + ⭐ The Star emoji is for the *addition* of a feature that didn't exist before.
16 |
17 | ## Related PRs
18 | List related PRs against other branches:
19 |
20 | branch | PR
21 | ------ | ------
22 | other_pr_production | [link]()
23 | other_pr_master | [link]()
24 |
25 |
26 | ## Todos
27 | - [ ] Tests
28 | - [ ] Documentation
29 |
30 |
31 | ## Deploy Notes
32 | Notes regarding deployment the contained body of work. These should note any
33 | db migrations, etc.
34 |
35 |
36 | 1.
37 |
38 | ## Impacted Areas in Application
39 | List general components of the application that this PR will affect:
40 |
41 | *
42 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 60
3 | # Number of days of inactivity before a stale issue is closed
4 | daysUntilClose: 7
5 | # Issues with these labels will never be considered stale
6 | exemptLabels:
7 | - pinned
8 | - unstale
9 | # Label to use when marking an issue as stale
10 | staleLabel: wontfix
11 | # Comment to post when marking an issue as stale. Set to `false` to disable
12 | markComment: >
13 | This issue has been automatically marked as stale because it has not had
14 | recent activity. It will be closed if no further activity occurs. Thank you
15 | for your contributions.
16 | # Comment to post when closing a stale issue. Set to `false` to disable
17 | closeComment: false
18 |
--------------------------------------------------------------------------------
/.github/workflows/SyntaxChecker.yml:
--------------------------------------------------------------------------------
1 | on: push
2 | name: Lint Python
3 | jobs:
4 | lint:
5 | runs-on: ubuntu-latest
6 | steps:
7 | - uses: actions/checkout@v2
8 | - uses: cclauss/Find-Python-syntax-errors-action@master
9 |
--------------------------------------------------------------------------------
/.github/workflows/greetings.yml:
--------------------------------------------------------------------------------
1 | name: Greetings
2 |
3 | on: [pull_request, issues]
4 |
5 | jobs:
6 | greeting:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/first-interaction@v1
10 | with:
11 | repo-token: ${{ secrets.GITHUB_TOKEN }}
12 | issue-message: 'First Issue - Thanks for your contribution! (OwO)'
13 | pr-message: 'First Pull Request - Thanks for your contribution! (OwO)'
14 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, sex characteristics, gender identity and expression,
9 | level of experience, education, socio-economic status, nationality, personal
10 | appearance, race, religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Attribution
56 |
57 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
58 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
59 |
60 | [homepage]: https://www.contributor-covenant.org
61 |
62 | For answers to common questions about this code of conduct, see
63 | https://www.contributor-covenant.org/faq
64 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # 🖊 How to contribute to Repl Customs
2 |
3 |
4 | First of all, if you're new here, thanks for your consideration to contribute to Repl Customs! 😀 This guide will help you get started and walk you the process of making improvements or changes to the Repl Customs web application.
5 |
6 | ### What do I need to know?
7 | Repl-Customs is a web application built on the Flask micro-web framework. The languages used to run are Python 3, JavaScript, and the web markup languages HTML and CSS. If you have any level of skill beyond beginner in any these languages, then you're good to contribute to Repl-Customs! If you want to work on the frontend side of RC, then head over to the `templates` folder! If you want to work on the backend, then check out the `app.py` file!
8 |
9 | ### Opening Issues
10 |
11 | If you want to open an issue for a bug/problem please make sure to include a code snippet of the issue or a link to the file(s) in which the problem is located. If you already have fix or suggestion for the issue you opened please include a code snippet or link it as well as a description of your fix. Simply follow the Issue template of your choice and you should be good for approval. Please include as much info as you can, wel will tell you if we need more info.
12 |
13 | ### Opening A Pull Request
14 |
15 | When opening a pull request please make sure your changes only affect one file at one time. If you need to change multiple files and the changes are unrelated, then please open multiple pull requests. Just like with opening an issue, please be as clear as possible when describing the reason you have opened a pull request. Only change multiple files in one pull request if the same shange is being made to each of the files, such as adding a back button to a few of the template files.
16 |
17 | ### Describing Your Pull Request
18 | In the RC repository, we like to use emojis to describe and classify our changes; here's a list for you to check before you get started.
19 |
20 | + 🔥 The Fire emoji is for changes that mark a file ready for a *new release*.
21 | + ✏️ The Pencil emoji is for minor *changes* to a file such as *spelling errors* or *syntax changes*.
22 | + 🖋️ The Pen emoji is for major *additions* to a file such as a new feature.
23 | + ❗ The Exclamation emoji is for *changes* to information such as *new info* in the Markdown files.
24 | + ➕ The Plus emoji is for the *addition* of a file that didn't exist before.
25 | + ⭐ The Star emoji is for the *addition* of a feature that didn't exist before.
26 |
27 | ### Modifying the Code
28 |
29 | When you set up an environment to modify the code for the web-app, you'll need a CSRF token to run it or Flask will throw a fit. You can generate a 16 character token in Python with the built-in `secrets` module. In the code that starts the Flask app in `app.py` you'll need to put in your generated token at `line 72`:
30 |
31 | Instead of:
32 | ```python
33 | KEY = os.getenv('APP_KEY')
34 |
35 | app = Flask(__name__)
36 | app.config['SECRET_KEY'] = KEY
37 | ```
38 |
39 | Do:
40 | ```python
41 | KEY = secrets.token_hex()
42 |
43 | app = Flask(__name__)
44 | app.config['SECRET_KEY'] = KEY
45 | ```
46 |
47 | Since this token will be unique to you, the code will need to be changed back before it can merged into the master branch.
48 |
49 | ### Conclusion
50 | I hope this has helped you out and again I thank you for your contributions! Happy Coding! 👏🎉
51 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 IreTheKID
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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
Welcome to Repl Customs!
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | ---
11 | #### ~~[Live Build](https://repl-customs.irethekid.repl.co/): *The live and stable version, all content here is officialy tested before release*~~
12 | #### [Experimental Build](https://rc.irethekid.repl.co): *The experimental version, updates and features are tested here, don't mind the bugs*
13 |
14 | **NOTE:** The "Live Build" is no longer maintained as it has fallen too far behind the "Experimntal build" for version bumping to be feasible, just think of the Experimental Build as ReplCustoms 2.0 :P
15 |
16 | ### What is Repl-Customs? 🤔
17 |
18 | Repl Customs is a data solution I created to allow users to search the Repldatabase for custom data solutions. ~~That doesn't answer anything but OK~~ You can find out answers to questions like, "*How many upvotes does my post get in an hour?*" or "*Who commented the most in the past week?*" Things like this are easy to look at with Repl Customs!
19 |
20 | ### The Current State of Things. 📈
21 | Repl Customs is still in development and the only features are looking up Repl users and getting a glorified profile page, looking up posts, and looking at the Repl leaderboard for cycles, but that is just the beginning! I want this to be a fully-fledged web app that is worth your time to visit. So look forward to constant updates and changes! I’ll be working on this for next few months. This is the list of upcoming features, https://github.com/IreTheKID/Repl-Customs/blob/master/upcoming.md.
22 |
23 | ### Want to Contribute? 📝
24 | If this project piques your interest and you would like to contribute to this project, anyone who wants to can read the guide (*[here](https://github.com/IreTheKID/Repl-Customs/blob/master/CONTRIBUTING.md)*) and then open a pull request with your desired changes/updates! If you contribute a great amount to Repl Customs, feel free to request joining the team! (*Right now there’s an issue with printing a comment’s post title to the web app, so if you have a fix for that please feel free to help out!* 😀)
25 |
26 | #### The Team
27 | + [IreTheKID](https://github.com/IreTheKID)
28 | + [Codemonkey51](https://github.com/Codemonkey51)
29 | + [sugarfi](https://github.com/sugarfi)
30 | + [FunnyLamma](https://github.com/FunnyLamma)
31 |
32 | #### Top Contributors 👏👏
33 | + [Commander07](https://github.com/commander07)
34 | + [AmazingMech2418](https://github.com/amazinigmech2418)
35 | + [c00lhawk607](https://github.com/c00lhawk607)
36 | + [FunnyLamma](https://github.com/FunnyLamma)
37 | + [DynamicSquid](https://github.com/DynamicSquid)
38 | + [RaidTheWeb](https://github.com/RaidTheWeb)
39 |
40 |
41 | ### Other Stuff 🙃🙃
42 | [Join our Discord Server!](https://discord.gg/DTf3z98) (Currently Inactive lul)
43 |
44 | ###### With all that said, please enjoy the V2 release of Repl-Customs! 😎😎 🎉🎉
45 |
46 | > IreTheKID
47 |
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import time
4 | import asyncio
5 | import repltalk
6 | import threading
7 | from datetime import datetime
8 | from forms import SearchReplit
9 | from gevent.pywsgi import WSGIServer
10 | from rctools import log_error, get_ordinal
11 | from flask import Flask, render_template, request
12 |
13 |
14 | cache = {}
15 |
16 | now = datetime.now()
17 | cur_time = now.strftime("%H:%M:%S")
18 |
19 | cache_time = 120
20 |
21 | def remove_key(name,e):
22 | global cache
23 | time.sleep(cache_time)
24 | try:
25 | del cache[name]
26 | except:
27 | return
28 | async def get_user_object(name):
29 | global user, posts, result, comments, cache
30 | replit = repltalk.Client()
31 | if(name in cache.keys()):
32 | cached = cache.get(name)
33 | print('used cache')
34 | user = cached.get('user')
35 | posts = cached.get('posts')
36 | comments = cached.get('comments')
37 | else:
38 | try:
39 | user = await replit.get_user(name)
40 | print('requested info')
41 | except Exception as e:
42 | user = None
43 | ex_type, ex, tb = sys.exc_info()
44 | log_error(
45 | e, ex_type,
46 | ex, tb,
47 | cur_time)
48 | try:
49 | posts = await user.get_posts(
50 | limit=5, order='new')
51 | except Exception as e:
52 | posts = None
53 | ex_type, ex, tb = sys.exc_info()
54 | log_error(
55 | e, ex_type,
56 | ex, tb,
57 | cur_time)
58 | try:
59 | comments = await user.get_comments(
60 | limit=5, order='new')
61 | except Exception as e:
62 | comments = None
63 | ex_type, ex, tb = sys.exc_info()
64 | log_error(e, ex_type,
65 | ex, tb,
66 | cur_time)
67 | temp = {
68 | 'user': user,
69 | 'posts': posts,
70 | 'comments': comments
71 | }
72 | cache[name]=temp
73 | threading.Thread(
74 | None, remove_key,
75 | args=(name,0)
76 | ).start()
77 |
78 | async def get_post_by_query(query):
79 | global posts_res
80 | posts_res = []
81 | replit = repltalk.Client()
82 | async for post in replit.boards.all.get_posts(sort='top', search=str(query)):
83 | posts_res.append(post)
84 |
85 | async def get_talk_leaderboard(lim=50):
86 | global lboard
87 | replit = repltalk.Client()
88 | lboard = await replit.get_leaderboard(limit=lim)
89 |
90 | KEY = os.getenv('APP_KEY')
91 |
92 | app = Flask(__name__)
93 | app.config['SECRET_KEY'] = KEY
94 |
95 | @app.route('/')
96 | @app.route('/home')
97 | def index():
98 | return render_template(
99 | 'index.html', title='Home')
100 |
101 | @app.errorhandler(404) # Added and under construction by [@adityaru]
102 | def error(e):
103 | """Handle errors. [@adityaru]"""
104 |
105 | return render_template(
106 | '404.html', title='404 Error'), 404
107 |
108 | @app.route('/license')
109 | def license():
110 | return render_template(
111 | 'license.html', title='License & Legal Info')
112 |
113 | @app.route('/apps') # Working app page. Contains all app functions for Repl-Customs. [@IreTheKID]
114 | def apps():
115 | return render_template(
116 | 'apps.html', title='Apps')
117 |
118 | @app.route('/lboard')
119 | @app.route('/leaderboard')
120 | def leaderboard():
121 | asyncio.run(get_talk_leaderboard(40))
122 | return render_template('app.html', output='LEADER',title='Leaderboard',
123 | leaderboard=lboard, enumerate=enumerate,
124 | get_ordinal=get_ordinal)
125 |
126 | @app.route('/app', methods=['GET', 'POST'])
127 | def application():
128 | form = SearchReplit()
129 | sType = request.args.get('searchType')
130 | sData = request.args.get('searchData')
131 | if sType and sData:
132 | if sType == '3':
133 | global posts_res
134 | try:
135 | asyncio.run(
136 | get_post_by_query(str(sData))
137 | )
138 | return render_template('app.html', output='POST', title='Results',
139 | posts=posts_res, sData=sData, str=str)
140 | except IndexError:
141 | posts_res = None
142 | return render_template('app.html', output='POST', title='Results',
143 | posts=posts_res, sData=sData, str=str)
144 | elif sType == '2':
145 | asyncio.run(
146 | get_user_object(
147 | str(sData.replace('@', '', 1))
148 | )
149 | )
150 | try:
151 | s = user.subscription
152 | timestamp = str(user.timestamp).split(' ')[0]
153 | if str(s) == 'None': sub = 'Starter'
154 | elif str(s) == 'hacker': sub = 'Hacker'
155 | else: sub = 'Not Found'
156 | except AttributeError:
157 | return render_template('error.html', title='Error Occured',
158 | error="UserNotFound", context='From search page.',
159 | sData=sData)
160 | except Exception as e:
161 | ex_type, ex, tb = sys.exc_info()
162 | log_error(
163 | e, ex_type,
164 | ex, tb,
165 | cur_time)
166 | return None
167 |
168 | return render_template('app.html', output='USER', title='Results',
169 | user=user, posts=posts, comments=comments,
170 | sub=sub, timestamp=timestamp)
171 |
172 | return render_template('app.html', output='FORM', title='Search', form=form)
173 |
174 | if __name__ == '__main__':
175 | http_server = WSGIServer(('0.0.0.0', int(5000)), app)
176 | http_server.serve_forever()
177 |
--------------------------------------------------------------------------------
/forms.py:
--------------------------------------------------------------------------------
1 | from flask_wtf import FlaskForm
2 | from wtforms import StringField, PasswordField, SubmitField, BooleanField, SelectField
3 | from wtforms.fields.html5 import SearchField
4 | from wtforms.validators import DataRequired, Length, Email, EqualTo
5 |
6 | class SearchReplit(FlaskForm):
7 | searchType = SelectField('What are you looking for?',
8 | choices=[
9 | (1, ' '),
10 | (2, 'Users'),
11 | (3, 'Posts')
12 | ],
13 | validators=[DataRequired()])
14 | searchData = SearchField('Search Here', validators=[DataRequired()])
15 | submit = SubmitField('Get Results')
16 |
17 | class SearchPost(FlaskForm):
18 | search_data = SearchField('Post Title', validators=[DataRequired()])
19 | submit = SubmitField('Search')
20 |
21 | class RegistrationForm(FlaskForm):
22 | username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
23 | email = StringField('Email', validators=[DataRequired(), Email()])
24 | password = PasswordField('Password', validators=[DataRequired()])
25 | confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
26 | submit = SubmitField('Sign Up')
27 |
28 | class LoginForm(FlaskForm):
29 | email = StringField('Email', validators=[DataRequired(), Email()])
30 | password = PasswordField('Password', validators=[DataRequired()])
31 | remember = BooleanField('Remember Me')
32 | submit = SubmitField('Login')
33 |
--------------------------------------------------------------------------------
/logs/err_log.txt:
--------------------------------------------------------------------------------
1 | Error Occured - 'type' object is not iterable
2 |
3 | Type:
4 | Exception: 'type' object is not iterable
5 | Traceback:
6 |
7 |
8 | Error Occured - 'type' object is not iterable
9 |
10 | Type:
11 | Exception: 'type' object is not iterable
12 | Traceback:
13 |
14 |
15 | Error Occured - 'type' object is not iterable
16 |
17 | Type:
18 | Exception: 'type' object is not iterable
19 | Traceback:
20 |
21 |
22 | Error Occured - 'type' object is not iterable
23 |
24 | Type:
25 | Exception: 'type' object is not iterable
26 | Traceback:
27 |
28 |
29 | Error Occured - 'type' object is not iterable
30 |
31 | Type:
32 | Exception: 'type' object is not iterable
33 | Traceback:
34 |
35 |
36 | Error Occured - 'type' object is not iterable
37 |
38 | Type:
39 | Exception: 'type' object is not iterable
40 | Traceback:
41 |
42 |
43 | Error Occured - 'type' object is not iterable
44 |
45 | Type:
46 | Exception: 'type' object is not iterable
47 | Traceback:
48 |
49 |
50 | Error Occured - 'type' object is not iterable
51 |
52 | Type:
53 | Exception: 'type' object is not iterable
54 | Traceback:
55 |
56 |
57 | Error Occured - 'type' object is not iterable
58 |
59 | Type:
60 | Exception: 'type' object is not iterable
61 | Traceback:
62 |
63 |
64 | Error Occured - 'type' object is not iterable
65 |
66 | Type:
67 | Exception: 'type' object is not iterable
68 | Traceback:
69 |
70 |
71 | Error Occured - 'type' object is not iterable
72 |
73 | Type:
74 | Exception: 'type' object is not iterable
75 | Traceback:
76 |
77 |
78 | Error Occured - 'type' object is not iterable
79 |
80 | Type:
81 | Exception: 'type' object is not iterable
82 | Traceback:
83 |
84 |
85 | Error Occured - 'type' object is not iterable
86 |
87 | Type:
88 | Exception: 'type' object is not iterable
89 | Traceback:
90 |
91 |
92 | Error Occured - 'type' object is not iterable
93 |
94 | Type:
95 | Exception: 'type' object is not iterable
96 | Traceback:
97 |
98 |
99 | Error Occured - 'type' object is not iterable
100 |
101 | Type:
102 | Exception: 'type' object is not iterable
103 | Traceback:
104 |
105 |
106 | Error Occured - 'type' object is not iterable
107 |
108 | Type:
109 | Exception: 'type' object is not iterable
110 | Traceback:
111 |
112 |
113 | Error Occured - 'type' object is not iterable
114 |
115 | Type:
116 | Exception: 'type' object is not iterable
117 | Traceback:
118 |
119 |
120 | Error Occured - 'type' object is not iterable
121 | Type:
122 | Exception: 'type' object is not iterable
123 | Traceback:
124 |
125 | Error Occured - 'type' object is not iterable
126 | Type:
127 | Exception: 'type' object is not iterable
128 | Traceback:
129 |
130 |
131 | Error Occured - 'type' object is not iterable
132 | Type:
133 | Exception: 'type' object is not iterable
134 | Traceback:
135 |
136 |
137 |
138 | Error Occured - 'NoneType' object has no attribute 'get_posts'
139 | Type:
140 | Exception: 'NoneType' object has no attribute 'get_posts'
141 | Traceback:
142 |
143 |
144 |
145 | Error Occured - 'NoneType' object has no attribute 'get_comments'
146 | Type:
147 | Exception: 'NoneType' object has no attribute 'get_comments'
148 | Traceback:
149 |
150 |
151 |
152 | Error Occured - 'type' object is not iterable
153 | Type:
154 | Exception: 'type' object is not iterable
155 | Traceback:
156 |
157 |
158 |
159 | Error Occured - 'type' object is not iterable
160 | Type:
161 | Exception: 'type' object is not iterable
162 | Traceback:
163 |
164 |
165 |
166 | Error Occured - 'NoneType' object has no attribute 'get_posts'
167 | Type:
168 | Exception: 'NoneType' object has no attribute 'get_posts'
169 | Traceback:
170 |
171 |
172 |
173 | Error Occured - 'NoneType' object has no attribute 'get_comments'
174 | Type:
175 | Exception: 'NoneType' object has no attribute 'get_comments'
176 | Traceback:
177 |
178 |
179 |
180 | Error Occured - 'type' object is not iterable
181 | Type:
182 | Exception: 'type' object is not iterable
183 | Traceback:
184 |
185 |
186 |
187 | Error Occured - 'type' object is not iterable
188 | Type:
189 | Exception: 'type' object is not iterable
190 | Traceback:
191 |
192 |
193 |
194 | Error Occured - 'type' object is not iterable
195 | Type:
196 | Exception: 'type' object is not iterable
197 | Traceback:
198 |
199 |
200 |
201 | Error Occured - 'type' object is not iterable
202 | Type:
203 | Exception: 'type' object is not iterable
204 | Traceback:
205 |
206 |
207 |
208 | Error Occured - 'type' object is not iterable
209 | Type:
210 | Exception: 'type' object is not iterable
211 | Traceback:
212 |
213 |
214 |
215 | Error Occured - 'type' object is not iterable
216 | Type:
217 | Exception: 'type' object is not iterable
218 | Traceback:
219 |
220 |
221 |
222 | Error Occured - 'type' object is not iterable
223 | Type:
224 | Exception: 'type' object is not iterable
225 | Traceback:
226 |
227 |
228 |
229 | Error Occured - 'type' object is not iterable
230 | Type:
231 | Exception: 'type' object is not iterable
232 | Traceback:
233 |
234 |
235 |
236 | Error Occured - 'type' object is not iterable
237 | Type:
238 | Exception: 'type' object is not iterable
239 | Traceback:
240 |
241 |
242 |
243 | Error Occured - 'NoneType' object has no attribute 'get_posts'
244 | Type:
245 | Exception: 'NoneType' object has no attribute 'get_posts'
246 | Traceback:
247 |
248 |
249 |
250 | Error Occured - 'NoneType' object has no attribute 'get_comments'
251 | Type:
252 | Exception: 'NoneType' object has no attribute 'get_comments'
253 | Traceback:
254 |
255 |
256 |
257 | Error Occured - 'NoneType' object has no attribute 'get_posts'
258 | Type:
259 | Exception: 'NoneType' object has no attribute 'get_posts'
260 | Traceback:
261 |
262 |
263 |
264 | Error Occured - 'NoneType' object has no attribute 'get_comments'
265 | Type:
266 | Exception: 'NoneType' object has no attribute 'get_comments'
267 | Traceback:
268 |
269 |
270 |
271 | Error Occured - 'NoneType' object has no attribute 'get_posts'
272 | Type:
273 | Exception: 'NoneType' object has no attribute 'get_posts'
274 | Traceback:
275 |
276 |
277 |
278 | Error Occured - 'NoneType' object has no attribute 'get_comments'
279 | Type:
280 | Exception: 'NoneType' object has no attribute 'get_comments'
281 | Traceback:
282 |
283 |
284 |
285 | Error Occured - 'NoneType' object has no attribute 'get_posts'
286 | Type:
287 | Exception: 'NoneType' object has no attribute 'get_posts'
288 | Traceback:
289 |
290 |
291 |
292 | Error Occured - 'NoneType' object has no attribute 'get_comments'
293 | Type:
294 | Exception: 'NoneType' object has no attribute 'get_comments'
295 | Traceback:
296 |
297 |
298 |
299 | Error Occured - 'NoneType' object has no attribute 'get_posts'
300 | Type:
301 | Exception: 'NoneType' object has no attribute 'get_posts'
302 | Traceback:
303 |
304 |
305 |
306 | Error Occured - 'NoneType' object has no attribute 'get_comments'
307 | Type:
308 | Exception: 'NoneType' object has no attribute 'get_comments'
309 | Traceback:
310 |
311 |
312 |
313 | Error Occured - 'NoneType' object has no attribute 'get_posts'
314 | Type:
315 | Exception: 'NoneType' object has no attribute 'get_posts'
316 | Traceback:
317 |
318 |
319 |
320 | Error Occured - 'NoneType' object has no attribute 'get_comments'
321 | Type:
322 | Exception: 'NoneType' object has no attribute 'get_comments'
323 | Traceback:
324 |
325 |
326 |
327 | Error Occured - 'type' object is not iterable
328 | Type:
329 | Exception: 'type' object is not iterable
330 | Traceback:
331 |
332 |
333 |
334 | Error Occured - 'NoneType' object has no attribute 'get_posts'
335 | Type:
336 | Exception: 'NoneType' object has no attribute 'get_posts'
337 | Traceback:
338 |
339 |
340 |
341 | Error Occured - 'NoneType' object has no attribute 'get_comments'
342 | Type:
343 | Exception: 'NoneType' object has no attribute 'get_comments'
344 | Traceback:
345 |
346 |
347 |
348 | Error Occured - 'NoneType' object has no attribute 'get_posts'
349 | Type:
350 | Exception: 'NoneType' object has no attribute 'get_posts'
351 | Traceback:
352 |
353 |
354 |
355 | Error Occured - 'NoneType' object has no attribute 'get_comments'
356 | Type:
357 | Exception: 'NoneType' object has no attribute 'get_comments'
358 | Traceback:
359 |
360 |
361 |
362 | Error Occured - 'NoneType' object has no attribute 'get_posts'
363 | Type:
364 | Exception: 'NoneType' object has no attribute 'get_posts'
365 | Traceback:
366 |
367 |
368 |
369 | Error Occured - 'NoneType' object has no attribute 'get_comments'
370 | Type:
371 | Exception: 'NoneType' object has no attribute 'get_comments'
372 | Traceback:
373 |
374 |
375 |
376 | Error Occured - 'NoneType' object has no attribute 'get_posts'
377 | Type:
378 | Exception: 'NoneType' object has no attribute 'get_posts'
379 | Traceback:
380 |
381 |
382 |
383 | Error Occured - 'NoneType' object has no attribute 'get_comments'
384 | Type:
385 | Exception: 'NoneType' object has no attribute 'get_comments'
386 | Traceback:
387 |
388 |
389 |
390 | Error Occured - 'NoneType' object has no attribute 'get_posts'
391 | Type:
392 | Exception: 'NoneType' object has no attribute 'get_posts'
393 | Traceback:
394 |
395 |
396 |
397 | Error Occured - 'NoneType' object has no attribute 'get_comments'
398 | Type:
399 | Exception: 'NoneType' object has no attribute 'get_comments'
400 | Traceback:
401 |
402 |
403 |
404 | Error Occured - 'NoneType' object has no attribute 'get_posts'
405 | Type:
406 | Exception: 'NoneType' object has no attribute 'get_posts'
407 | Traceback:
408 |
409 |
410 |
411 | Error Occured - 'NoneType' object has no attribute 'get_comments'
412 | Type:
413 | Exception: 'NoneType' object has no attribute 'get_comments'
414 | Traceback:
415 |
416 |
417 |
418 | Error Occured - 'NoneType' object has no attribute 'get_posts'
419 | Type:
420 | Exception: 'NoneType' object has no attribute 'get_posts'
421 | Traceback:
422 |
423 |
424 |
425 | Error Occured - 'NoneType' object has no attribute 'get_comments'
426 | Type:
427 | Exception: 'NoneType' object has no attribute 'get_comments'
428 | Traceback:
429 |
430 |
431 |
432 | Error Occured - 'NoneType' object has no attribute 'get_posts'
433 | Type:
434 | Exception: 'NoneType' object has no attribute 'get_posts'
435 | Traceback:
436 |
437 |
438 |
439 | Error Occured - 'NoneType' object has no attribute 'get_comments'
440 | Type:
441 | Exception: 'NoneType' object has no attribute 'get_comments'
442 | Traceback:
443 |
444 |
445 |
446 | Error Occured - 'NoneType' object has no attribute 'get_posts'
447 | Type:
448 | Exception: 'NoneType' object has no attribute 'get_posts'
449 | Traceback:
450 |
451 |
452 |
453 | Error Occured - 'NoneType' object has no attribute 'get_comments'
454 | Type:
455 | Exception: 'NoneType' object has no attribute 'get_comments'
456 | Traceback:
457 |
458 |
459 |
460 | Error Occured - 'type' object is not iterable
461 | Type:
462 | Exception: 'type' object is not iterable
463 | Traceback:
464 |
465 |
466 |
467 | Error Occured - 'type' object is not iterable
468 | Type:
469 | Exception: 'type' object is not iterable
470 | Traceback:
471 |
472 |
473 |
474 | Error Occured - 'type' object is not iterable
475 | Type:
476 | Exception: 'type' object is not iterable
477 | Traceback:
478 |
479 |
480 |
481 | Error Occured - 'type' object is not iterable
482 | Type:
483 | Exception: 'type' object is not iterable
484 | Traceback:
485 |
486 |
487 |
488 | Error Occured - 'type' object is not iterable
489 | Type:
490 | Exception: 'type' object is not iterable
491 | Traceback:
492 |
493 |
494 |
495 | Error Occured - 'type' object is not iterable
496 | Type:
497 | Exception: 'type' object is not iterable
498 | Traceback:
499 |
500 |
501 |
502 | Error Occured - 'type' object is not iterable
503 | Type:
504 | Exception: 'type' object is not iterable
505 | Traceback:
506 |
507 |
508 |
509 | Error Occured - 'type' object is not iterable
510 | Type:
511 | Exception: 'type' object is not iterable
512 | Traceback:
513 |
514 |
515 |
516 | Error Occured - 'type' object is not iterable
517 | Type:
518 | Exception: 'type' object is not iterable
519 | Traceback:
520 |
521 |
522 |
523 | Error Occured - 'type' object is not iterable
524 | Type:
525 | Exception: 'type' object is not iterable
526 | Traceback:
527 |
528 |
529 | Time Logged: 22:58:40
530 |
531 |
532 | Error Occured - 'type' object is not iterable
533 | Type:
534 | Exception: 'type' object is not iterable
535 | Traceback:
536 |
537 |
538 | Time Logged: 22:58:40
539 |
540 |
541 | Error Occured - 'type' object is not iterable
542 | Type:
543 | Exception: 'type' object is not iterable
544 | Traceback:
545 |
546 |
547 | Time Logged: 22:58:40
548 |
549 |
550 | Error Occured - 'NoneType' object has no attribute 'get_posts'
551 | Type:
552 | Exception: 'NoneType' object has no attribute 'get_posts'
553 | Traceback:
554 |
555 |
556 | Time Logged: 22:58:40
557 |
558 |
559 | Error Occured - 'NoneType' object has no attribute 'get_comments'
560 | Type:
561 | Exception: 'NoneType' object has no attribute 'get_comments'
562 | Traceback:
563 |
564 |
565 | Time Logged: 22:58:40
566 |
567 |
568 | Error Occured - 'NoneType' object has no attribute 'get_posts'
569 | Type:
570 | Exception: 'NoneType' object has no attribute 'get_posts'
571 | Traceback:
572 |
573 |
574 | Time Logged: 22:58:40
575 |
576 |
577 | Error Occured - 'NoneType' object has no attribute 'get_comments'
578 | Type:
579 | Exception: 'NoneType' object has no attribute 'get_comments'
580 | Traceback:
581 |
582 |
583 | Time Logged: 22:58:40
584 |
585 |
586 | Error Occured - 'NoneType' object has no attribute 'get_posts'
587 | Type:
588 | Exception: 'NoneType' object has no attribute 'get_posts'
589 | Traceback:
590 |
591 |
592 | Time Logged: 22:58:40
593 |
594 |
595 | Error Occured - 'NoneType' object has no attribute 'get_comments'
596 | Type:
597 | Exception: 'NoneType' object has no attribute 'get_comments'
598 | Traceback:
599 |
600 |
601 | Time Logged: 22:58:40
602 |
603 |
604 | Error Occured - 'type' object is not iterable
605 | Type:
606 | Exception: 'type' object is not iterable
607 | Traceback:
608 |
609 |
610 | Time Logged: 22:58:40
611 |
612 |
613 | Error Occured - 'type' object is not iterable
614 | Type:
615 | Exception: 'type' object is not iterable
616 | Traceback:
617 |
618 |
619 | Time Logged: 23:16:22
620 |
621 |
622 | Error Occured - 'type' object is not iterable
623 | Type:
624 | Exception: 'type' object is not iterable
625 | Traceback:
626 |
627 |
628 | Time Logged: 23:16:22
629 |
630 |
--------------------------------------------------------------------------------
/rctools/__init__.py:
--------------------------------------------------------------------------------
1 | def log_error(a, b, c, d, e):
2 | errTemplate = """
3 | Error Occured - {0}
4 | Type: {1}
5 | Exception: {2}
6 | Traceback:
7 | {3}
8 |
9 | Time Logged: {4}
10 |
11 | """
12 | with open('Repl-Customs/logs/err_log.txt', 'a') as fh:
13 | res = errTemplate.format(a, b, c, d, e)
14 | fh.write(res)
15 |
16 | def get_ordinal(num):
17 | if str(num)[-1] == '1':
18 | ordinal = 'st'
19 | if len(str(num)) > 1: ordinal = 'th'
20 | elif str(num)[-1] == '2':
21 | ordinal = 'nd'
22 | elif str(num)[-1] == '3':
23 | ordinal = 'rd'
24 | else:
25 | ordinal = 'th'
26 | res = str(num) + ordinal
27 |
28 | return res
--------------------------------------------------------------------------------
/rctools/__pycache__/__init__.cpython-38.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/rctools/__pycache__/__init__.cpython-38.pyc
--------------------------------------------------------------------------------
/static/css/main.css:
--------------------------------------------------------------------------------
1 | @import url('//fonts.googleapis.com/css2?family=Open+Sans&family=Oswald&family=Raleway&display=swap');
2 | @import url('https://fonts.googleapis.com/css2?family=Ubuntu+Mono&display=swap');
3 |
4 | html {
5 | background-color: snow;
6 | line-height: 1.2;
7 | scroll-behavior: smooth;
8 | -ms-text-size-adjust: 100%;
9 | -webkit-text-size-adjust: 100%
10 | }
11 |
12 | *:focus {
13 | outline-color: lightblue;
14 | outline-style: solid;
15 | outline-width: 1px;
16 |
17 | }
18 |
19 | .webpage-content-container {
20 | margin-left: 11%;
21 | margin-right: 11%;
22 | margin-top: 3%;
23 | margin-bottom: 4%;
24 | }
25 |
26 | .logo-top-container {
27 | align-content: center;
28 | text-align: center;
29 | margin-left: auto;
30 | margin-right: auto;
31 | margin-bottom: 10px;
32 | margin-top: 10px;
33 | }
34 |
35 | .center-custom {
36 | align-content: center;
37 | text-align: center;
38 | margin-left: auto;
39 | margin-right: auto;
40 | }
41 |
42 | .pd-high {
43 | padding-top: 5%;
44 | padding-bottom: 5%;
45 | padding-right: 15%;
46 | padding-left: 15%;
47 | }
48 |
49 | .results-button {
50 | height: 100%;
51 | padding: 0;
52 | }
53 |
54 | .fill-all {
55 | height: 100%;
56 | width: 100%;
57 | padding: 0;
58 | margin: 0;
59 | }
60 |
61 | .extern-link:hover {
62 | text-decoration: underline;
63 | }
64 |
--------------------------------------------------------------------------------
/static/images/error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/static/images/error.png
--------------------------------------------------------------------------------
/static/images/external.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/static/images/external.png
--------------------------------------------------------------------------------
/static/images/pure-black.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/static/images/pure-black.jpg
--------------------------------------------------------------------------------
/static/images/repl_pixel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/static/images/repl_pixel.png
--------------------------------------------------------------------------------
/static/images/repl_pixel_256px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/static/images/repl_pixel_256px.png
--------------------------------------------------------------------------------
/static/images/repl_pixel_64px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/static/images/repl_pixel_64px.png
--------------------------------------------------------------------------------
/static/images/skeleton.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/frissyn/ReplCustoms/0bcf45dd5a386c64d21345a005ede85b9bec7610/static/images/skeleton.gif
--------------------------------------------------------------------------------
/static/js/initialize.js:
--------------------------------------------------------------------------------
1 | jQuery(document).ready(function(){
2 | jQuery('select').formSelect();
3 | });
4 |
5 | jQuery(document).ready(function(){
6 | jQuery('.collapsible').collapsible();
7 | });
--------------------------------------------------------------------------------
/static/js/script.js:
--------------------------------------------------------------------------------
1 | function fadeInWebpage() {
2 | jQuery('body').css('display','none');
3 | jQuery(document).ready(function() {
4 | jQuery('body').fadeIn(2000);
5 | jQuery('a').on('click',function(event) {
6 | var thetarget = this.getAttribute('target')
7 | if (thetarget != "_blank") {
8 | var thehref = this.getAttribute('href')
9 | event.preventDefault();
10 | jQuery('body').fadeOut(function(){
11 | window.location = thehref
12 | });
13 | }});
14 | });
15 | setTimeout(function() {
16 | jQuery('body').fadeIn();
17 | }, 2000)
18 | };
19 |
20 | function transferTo(tag) {
21 | window.location.href = tag;
22 | };
23 |
24 | function sendTo(link) {
25 | window.open(link, '_blank');
26 | };
--------------------------------------------------------------------------------
/templates/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {% if title %}
5 | Repl Customs - {{ title }}{% else %}
6 | Repl Customs{% endif %}
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
39 |
40 |