├── .gitignore ├── Dockerfile ├── Procfile ├── README.md ├── app ├── database_admin.py ├── entryController.py ├── main.py ├── static │ ├── assets │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── apple-touch-icon.png │ │ ├── duvarov.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ └── github_logo.png │ └── css │ │ └── style.css ├── templates │ ├── home.html │ ├── includes │ │ └── messages.html │ ├── master.html │ ├── rules.html │ ├── succes.html │ └── wipe.html └── wordBlacklist.txt ├── currentmessageid.txt ├── database.py ├── requirements.txt ├── runtime.txt └── wsgi.py /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .DS_Store 3 | venv/* -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | 2 | FROM python:3.9-alpine 3 | 4 | COPY . /app 5 | 6 | WORKDIR /app 7 | 8 | RUN pip install -r requirements.txt 9 | 10 | ENTRYPOINT ["python3"] 11 | 12 | CMD [ "wsgi.py" ] 13 | 14 | 15 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn wsgi:app -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # duvar-app 2 | 3 | ![](app/static/assets/duvarov.png) 4 | 5 | Duvarov kişilerin kendilerine anonim bir duvar yaratabileceği bir uygulamadır. 6 | 7 | ## Demo 8 | [Duvarov Websitesi](https://duvarov.herokuapp.com/) 9 | 10 | ## Installation 11 | 12 | `wsgi.py` dosyası çalıştırılarak direkt `0.0.0.0:5000` adresinden erişim sağlanabilir. 13 | 14 | 15 | Repo heroku deployment için tamamen hazırdır, `Procfile` ve `runtime.txt` dosyaları değiştirilerek versiyon değişikliği yapılabilir. 16 | Pythonanywhere tarafında sadece requirements.txt yüklenilerek proje canlıya alınabilir. 17 | 18 | Duvar temizliği için heroku içerisinde yerel değişkeniniz `password`'un ayarlanması gerekmektedir. 19 | 20 | ## Docker 21 | `docker build -t duvar:latest .` 22 | 23 | `docker run -d -p 5000:5000 duvar:latest` 24 | 25 | ## Requirements: 26 | - flask 27 | - sqlite3 28 | - gunicorn 29 | 30 | ## To-Do's 31 | - [ ] Link, telefon numaraları gönderilmesini engellemek için regex 32 | - [x] Küfür gönderilmesini engellemek için bir çalışma [Melih](https://github.com/msrexe) 33 | - [x] Tamamen boşluk veya yazı içermeyen karakterlerin gönderilmesini engelleme [Melih](https://github.com/msrexe) | [Murat Can Kurtulus](https://github.com/makermotion) 34 | - [x] header kısımlarının bir kez yazılıp diğer sayfalarda extend edilmesi. [Selman Baskaya](https://github.com/selmanbaskaya) 35 | - [x] HTML ve CSS dosyalarında düzenlemeler. [Enes Sonmez](https://github.com/enesonmez) 36 | - [x] Database'in app içerisinde değil servis tarafında tutulması [Mert Cobanov](https://github.com/cobanov) 37 | - [x] Projenin dockerize edilmesi [Mert Cobanov](https://github.com/cobanov) 38 | 39 | ## Contributors 40 | - [Selman Baskaya](https://github.com/selmanbaskaya) 41 | - [Enes Sonmez](https://github.com/enesonmez) 42 | - [Murat Can Kurtulus](https://github.com/makermotion) 43 | - [Melih](https://github.com/msrexe) -------------------------------------------------------------------------------- /app/database_admin.py: -------------------------------------------------------------------------------- 1 | import psycopg2 2 | import os 3 | 4 | 5 | class DuvarovDB(): 6 | def __init__(self) -> None: 7 | self._database = "d5ggjt80j3jic5" 8 | self._user = "lewormdmwvpmrv" 9 | self._host = "ec2-18-214-211-47.compute-1.amazonaws.com" 10 | 11 | def connect_db(self, password): 12 | self.connection = psycopg2.connect(database=self._database, user=self._user, 13 | password=password, host=self._host, port="5432") 14 | 15 | def get_data(self, query): 16 | cursor = self.connection.cursor() 17 | cursor.execute(query) 18 | data = cursor.fetchall() 19 | self.connection.close() 20 | return data 21 | 22 | 23 | mert = DuvarovDB() 24 | mert.connect_db(os.getenv('db_password')) 25 | query = """SELECT * FROM duvarapp LIMIT 10""" 26 | 27 | data = mert.get_data(query) 28 | 29 | for datum in data: 30 | print(datum) 31 | -------------------------------------------------------------------------------- /app/entryController.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | def entryContentCheck(content): 5 | """ """ 6 | if content == "" or content == " ": 7 | return False 8 | 9 | return True 10 | 11 | 12 | def entryFilter(content): 13 | """ """ 14 | content = content.split(" ") 15 | with open("app/wordBlacklist.txt", "r", encoding="utf-8") as file: 16 | bad_words_list = file.read().splitlines() 17 | clean_content = [] 18 | 19 | for word in content: 20 | if word in bad_words_list: 21 | word = len(word) * '*' 22 | clean_content.append(word) 23 | else: 24 | clean_content.append(word) 25 | 26 | clean_content_str = " ".join(clean_content) 27 | return clean_content_str 28 | -------------------------------------------------------------------------------- /app/main.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | from flask import Flask, render_template, request, redirect, url_for, flash 3 | import database 4 | import os 5 | 6 | 7 | app = Flask(__name__) 8 | 9 | database.create_tables() 10 | # token = os.getenv("password") # If you are deploying the project on PaaS like heroku or 11 | # if you don't want to push your password to GitHub you 12 | # should pass a password as environmental variable. 13 | 14 | token = "password" 15 | app.secret_key = "./]asd}vcbOH." 16 | 17 | @app.route("/main", methods=["GET", "POST"]) 18 | @app.route("/", methods=["GET", "POST"]) 19 | def home(): 20 | if request.method == "POST": 21 | try: 22 | entry_content = request.form.get("message") 23 | current_time = (datetime.datetime.today() + datetime.timedelta(hours=3) 24 | ).strftime("%m.%d.%Y, %H:%M") 25 | database.create_entry( 26 | entry_content, current_time) 27 | flash("Gönderi Başarılı") 28 | 29 | except Exception as e: 30 | pass 31 | 32 | return render_template("home.html", entries=database.retrieve_entries()) 33 | 34 | 35 | @app.route("/wipe", methods=["GET", "POST"]) 36 | def wipe(): 37 | if request.method == "POST": 38 | password = request.form.get("password") 39 | if password == token: 40 | database.clear_database() 41 | flash("Silme İşlemi Başarılı") 42 | return redirect(url_for('home')) 43 | 44 | return render_template("wipe.html") 45 | 46 | 47 | @app.route("/delete/", methods=["GET", "POST"]) 48 | def delete(message_id): 49 | if request.method == "POST": 50 | password = request.form.get("password") 51 | if password == token: 52 | database.delete(message_id) 53 | flash("Silme İşlemi Başarılı") 54 | return redirect(url_for('home')) 55 | 56 | return render_template("wipe.html") 57 | 58 | 59 | @app.route("/upvote/", methods=["GET", "POST"]) 60 | def upvote(message_id): 61 | database.upvote(message_id) 62 | return render_template('succes.html') 63 | 64 | 65 | @app.route("/top", methods=["GET", "POST"]) 66 | def top(): 67 | if request.method == "POST": 68 | try: 69 | entry_content = request.form.get("message") 70 | current_time = (datetime.datetime.today() + datetime.timedelta(hours=3) 71 | ).strftime("%m.%d.%Y, %H:%M") 72 | database.create_entry( 73 | entry_content, current_time) 74 | flash("Gönderi Başarılı") 75 | except Exception as e: 76 | pass 77 | 78 | return render_template("home.html", entries=database.retrieve_entries_top()) 79 | 80 | 81 | @app.route("/rules") 82 | def rules(): 83 | return render_template("rules.html") 84 | -------------------------------------------------------------------------------- /app/static/assets/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/android-chrome-192x192.png -------------------------------------------------------------------------------- /app/static/assets/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/android-chrome-512x512.png -------------------------------------------------------------------------------- /app/static/assets/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/apple-touch-icon.png -------------------------------------------------------------------------------- /app/static/assets/duvarov.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/duvarov.png -------------------------------------------------------------------------------- /app/static/assets/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/favicon-16x16.png -------------------------------------------------------------------------------- /app/static/assets/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/favicon-32x32.png -------------------------------------------------------------------------------- /app/static/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/favicon.ico -------------------------------------------------------------------------------- /app/static/assets/github_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cobanov/duvar-app/8b173be86f7a2fb4a3741660b6895e5fa8f6d3a3/app/static/assets/github_logo.png -------------------------------------------------------------------------------- /app/static/css/style.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Ubuntu); 2 | 3 | body { 4 | background-color: black; 5 | font-family:"Ubuntu"; 6 | } 7 | 8 | .grid-container { 9 | display: grid; 10 | color: white; 11 | 12 | grid-template-columns: 1fr 6fr 1fr; 13 | grid-template-rows: 1fr; 14 | gap: 20px 20px; 15 | grid-template-areas: 16 | "top-left logo top-right" 17 | "ads main sidebar "; 18 | } 19 | 20 | .logo { 21 | grid-area: logo; 22 | text-align: center; 23 | } 24 | 25 | .top-left { 26 | grid-area: top-left; 27 | } 28 | 29 | .top-right { 30 | grid-area: top-right; 31 | } 32 | 33 | .ads { 34 | grid-area: ads; 35 | } 36 | 37 | .main { 38 | grid-area: main; 39 | } 40 | 41 | .navbar{ 42 | text-align:center; 43 | } 44 | 45 | .ui.inverted.menu{ 46 | margin:10px; 47 | } 48 | 49 | /* home */ 50 | .rules{ 51 | text-align: center; 52 | color:white; 53 | word-break: break-word; 54 | 55 | } 56 | 57 | .disclaimer{ 58 | text-align: center; 59 | color:white; 60 | font-size: 12px; 61 | } 62 | 63 | .success{ 64 | word-break: break-word; 65 | text-align: center; 66 | } 67 | 68 | 69 | .ui.form{ 70 | text-align:center; 71 | margin: 20px; 72 | } 73 | 74 | 75 | /* Entries */ 76 | .entry{ 77 | display: flex; 78 | } 79 | 80 | .ui.label{ 81 | font-size: 16px; 82 | word-break: break-word; 83 | flex-grow: 1; 84 | min-height: 50px; 85 | padding:16px; 86 | margin:auto; 87 | display: block; 88 | overflow: hidden; 89 | } 90 | 91 | .ui.fade.reveal{ 92 | flex-grow: 1; 93 | display: block; 94 | overflow: hidden; 95 | } 96 | 97 | 98 | .ui.labeled.button{ 99 | flex-grow: 0; 100 | margin:auto; 101 | margin-left:auto; 102 | min-width:fit-content; 103 | transform: scale(0.8); 104 | } 105 | 106 | .under_box{ 107 | margin-top: 1px; 108 | margin-bottom: 25px; 109 | color:grey; 110 | font-size:12px; 111 | } 112 | 113 | /* Sidebar */ 114 | .sidebar { 115 | grid-area: sidebar; 116 | } 117 | 118 | .contributors{ 119 | display: flex; 120 | flex-grow: 1; 121 | justify-content: center; 122 | } 123 | 124 | -------------------------------------------------------------------------------- /app/templates/home.html: -------------------------------------------------------------------------------- 1 | {% extends "master.html" %} 2 | {% block content %} 3 | 4 | 5 |
6 | 7 |

8 | tamamen eğitim amaçlı yaptığım bir uygulama, bir web uygulaması nasıl geliştirilir ve 9 | deployment nasıl yapılır hem kendime hem de yeni developer arkadaşlara öğretebilmek için açık kaynak kodlu ve 10 | tamamen gönüllülük amaçlı bu projeyi yaptım. 11 | bu sitenin amacının dışına çıkmaması ancak sizin elinizde, kırıcı her şeyden kaçındığınız için teşekkür ederim 12 | gençler. -cobanov 🦊 13 |

14 | 15 |
16 | 17 | 18 |
19 |
20 |
21 | 22 | 25 |
26 |
27 |
28 | 29 | 30 |
31 |

Bağrıntılar

32 |
33 | 34 | 35 |
36 | 37 | {% for message_id, entry, time, vote in entries[::-1] %} 38 | 39 | 40 |
41 | 42 | {% if False %} 43 | 44 |
45 | 46 |
47 |
48 | {{ ("*" * 100) }} 49 |
50 |
51 | 52 | 57 | 58 |
59 | 60 | {% else %} 61 | 62 |
63 | {{ entry[:280] }} 64 |
65 | 66 | {% endif %} 67 | 68 |
69 |
70 | 73 |
74 |
75 |
76 | 77 | 78 |
79 | 80 | {{ time }} 81 | 82 | 83 | 84 | | message_id: {{ message_id }} 85 | 86 | 87 |
88 | 89 | {% endfor %} 90 | 91 |
92 | 93 | 94 |
95 |

Yolun sonuna geldin!

96 |
97 | 98 | 99 | 100 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/includes/messages.html: -------------------------------------------------------------------------------- 1 | 2 | {% with messages = get_flashed_messages() %} 3 | {% if messages %} 4 | 23 | {% endif %} 24 | {% endwith %} 25 | -------------------------------------------------------------------------------- /app/templates/master.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 23 | 25 | Duvarov{{ url_for('static', filename='assets/assets/duvarov.png') }} 26 | 27 | 28 | 29 | 30 | 31 | {% include "includes/messages.html" %} 32 | 33 |
34 | 35 | 36 | 41 | 42 | 43 |
44 | 45 | 46 |
47 | 48 | 49 |
50 | 51 | 52 |
53 | 54 | 55 |
56 | 57 | 72 | 73 | {% block main %} {% block content %}{% endblock %} {% endblock %} 74 | 75 |
76 | 77 |
78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /app/templates/rules.html: -------------------------------------------------------------------------------- 1 | {% extends "master.html" %} 2 | {% block content %} 3 |
4 |
5 | 6 |
7 |

KURALLAR

8 |
9 | 10 |
11 |

1. kimseyi hedef göstermeyin

12 |

2. yukarıdaki kuralı hiçbir zaman unutmayın

13 |

3. bir de söylenmiş bir şeyi bir daha söyleyemezsin.

14 |
15 | 16 |
17 |

CONTRIBUTORS

18 |
19 | 20 |
21 | Project Owner: Mert Cobanov 22 |
23 | Contributors: Selman Baskaya • Enes Sonmez • Melis Msrexe • Murat Can Kurtulus 24 | 25 |
26 | 27 |
28 |

FORK ME ON GITHUB

29 |
30 | 31 | 32 | 33 | 34 |

35 |
36 | 37 | 38 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/succes.html: -------------------------------------------------------------------------------- 1 | {% extends "master.html" %} 2 | 3 | 4 | {% block content %} 5 |
6 | 7 |
8 |

ışınlanma vaktin geldi

9 |
10 | 11 |
12 |

sanki çok zor bir şeymiş gibi yapıyorum ama çoktan kaydoldu

13 | 14 |
15 | 20 |
21 | {% endblock %} -------------------------------------------------------------------------------- /app/templates/wipe.html: -------------------------------------------------------------------------------- 1 | {% extends "master.html" %} 2 | {% block content %} 3 | 4 |
5 |
6 |
7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 | 15 | 16 | {% endblock %} -------------------------------------------------------------------------------- /app/wordBlacklist.txt: -------------------------------------------------------------------------------- 1 | abaza 2 | abazan 3 | ag 4 | ağzına sıçayım 5 | ahmak 6 | allahsız 7 | am 8 | amarım 9 | ambiti 10 | am biti 11 | amcığı 12 | amcığın 13 | amcığını 14 | amcığınızı 15 | amcık 16 | amcık hoşafı 17 | amcıklama 18 | amcıklandı 19 | amcik 20 | amck 21 | amckl 22 | amcklama 23 | amcklaryla 24 | amckta 25 | amcktan 26 | amcuk 27 | amık 28 | amına 29 | amınako 30 | amına koy 31 | amına koyarım 32 | amına koyayım 33 | amınakoyim 34 | amına koyyim 35 | amına s 36 | amına sikem 37 | amına sokam 38 | amın feryadı 39 | amını 40 | amını s 41 | amın oglu 42 | amınoğlu 43 | amın oğlu 44 | amısına 45 | amısını 46 | amina 47 | amina g 48 | amina k 49 | aminako 50 | aminakoyarim 51 | amina koyarim 52 | amina koyayım 53 | amina koyayim 54 | aminakoyim 55 | aminda 56 | amindan 57 | amindayken 58 | amini 59 | aminiyarraaniskiim 60 | aminoglu 61 | amin oglu 62 | amiyum 63 | amk 64 | amkafa 65 | amk çocuğu 66 | amlarnzn 67 | amlı 68 | amm 69 | ammak 70 | ammna 71 | amn 72 | amna 73 | amnda 74 | amndaki 75 | amngtn 76 | amnn 77 | amona 78 | amq 79 | amsız 80 | amsiz 81 | amsz 82 | amteri 83 | amugaa 84 | amuğa 85 | amuna 86 | ana 87 | anaaann 88 | anal 89 | analarn 90 | anam 91 | anamla 92 | anan 93 | anana 94 | anandan 95 | ananı 96 | ananı 97 | ananın 98 | ananın am 99 | ananın amı 100 | ananın dölü 101 | ananınki 102 | ananısikerim 103 | ananı sikerim 104 | ananısikeyim 105 | ananı sikeyim 106 | ananızın 107 | ananızın am 108 | anani 109 | ananin 110 | ananisikerim 111 | anani sikerim 112 | ananisikeyim 113 | anani sikeyim 114 | anann 115 | ananz 116 | anas 117 | anasını 118 | anasının am 119 | anası orospu 120 | anasi 121 | anasinin 122 | anay 123 | anayin 124 | angut 125 | anneni 126 | annenin 127 | annesiz 128 | anuna 129 | aptal 130 | aq 131 | a.q 132 | a.q. 133 | aq. 134 | ass 135 | atkafası 136 | atmık 137 | attırdığım 138 | attrrm 139 | auzlu 140 | avrat 141 | ayklarmalrmsikerim 142 | azdım 143 | azdır 144 | azdırıcı 145 | babaannesi kaşar 146 | babanı 147 | babanın 148 | babani 149 | babası pezevenk 150 | bacağına sıçayım 151 | bacına 152 | bacını 153 | bacının 154 | bacini 155 | bacn 156 | bacndan 157 | bacy 158 | bastard 159 | basur 160 | beyinsiz 161 | bızır 162 | bitch 163 | biting 164 | bok 165 | boka 166 | bokbok 167 | bokça 168 | bokhu 169 | bokkkumu 170 | boklar 171 | boktan 172 | boku 173 | bokubokuna 174 | bokum 175 | bombok 176 | boner 177 | bosalmak 178 | boşalmak 179 | cenabet 180 | cibiliyetsiz 181 | cibilliyetini 182 | cibilliyetsiz 183 | cif 184 | cikar 185 | cim 186 | çük 187 | dalaksız 188 | dallama 189 | daltassak 190 | dalyarak 191 | dalyarrak 192 | dangalak 193 | dassagi 194 | diktim 195 | dildo 196 | dingil 197 | dingilini 198 | dinsiz 199 | dkerim 200 | domal 201 | domalan 202 | domaldı 203 | domaldın 204 | domalık 205 | domalıyor 206 | domalmak 207 | domalmış 208 | domalsın 209 | domalt 210 | domaltarak 211 | domaltıp 212 | domaltır 213 | domaltırım 214 | domaltip 215 | domaltmak 216 | dölü 217 | dönek 218 | düdük 219 | eben 220 | ebeni 221 | ebenin 222 | ebeninki 223 | ebleh 224 | ecdadını 225 | ecdadini 226 | embesil 227 | emi 228 | fahise 229 | fahişe 230 | feriştah 231 | ferre 232 | fuck 233 | fucker 234 | fuckin 235 | fucking 236 | gavad 237 | gavat 238 | geber 239 | geberik 240 | gebermek 241 | gebermiş 242 | gebertir 243 | gerızekalı 244 | gerizekalı 245 | gerizekali 246 | gerzek 247 | giberim 248 | giberler 249 | gibis 250 | gibiş 251 | gibmek 252 | gibtiler 253 | goddamn 254 | godoş 255 | godumun 256 | gotelek 257 | gotlalesi 258 | gotlu 259 | gotten 260 | gotundeki 261 | gotunden 262 | gotune 263 | gotunu 264 | gotveren 265 | goyiim 266 | goyum 267 | goyuyim 268 | goyyim 269 | göt 270 | göt deliği 271 | götelek 272 | göt herif 273 | götlalesi 274 | götlek 275 | götoğlanı 276 | göt oğlanı 277 | götoş 278 | götten 279 | götü 280 | götün 281 | götüne 282 | götünekoyim 283 | götüne koyim 284 | götünü 285 | götveren 286 | göt veren 287 | göt verir 288 | gtelek 289 | gtn 290 | gtnde 291 | gtnden 292 | gtne 293 | gtten 294 | gtveren 295 | hasiktir 296 | hassikome 297 | hassiktir 298 | has siktir 299 | hassittir 300 | haysiyetsiz 301 | hayvan herif 302 | hoşafı 303 | hödük 304 | hsktr 305 | huur 306 | ıbnelık 307 | ibina 308 | ibine 309 | ibinenin 310 | ibne 311 | ibnedir 312 | ibneleri 313 | ibnelik 314 | ibnelri 315 | ibneni 316 | ibnenin 317 | ibnerator 318 | ibnesi 319 | idiot 320 | idiyot 321 | imansz 322 | ipne 323 | iserim 324 | işerim 325 | itoğlu it 326 | kafam girsin 327 | kafasız 328 | kafasiz 329 | kahpe 330 | kahpenin 331 | kahpenin feryadı 332 | kaka 333 | kaltak 334 | kancık 335 | kancik 336 | kappe 337 | karhane 338 | kaşar 339 | kavat 340 | kavatn 341 | kaypak 342 | kayyum 343 | kerane 344 | kerhane 345 | kerhanelerde 346 | kevase 347 | kevaşe 348 | kevvase 349 | koca göt 350 | koduğmun 351 | koduğmunun 352 | kodumun 353 | kodumunun 354 | koduumun 355 | koyarm 356 | koyayım 357 | koyiim 358 | koyiiym 359 | koyim 360 | koyum 361 | koyyim 362 | krar 363 | kukudaym 364 | laciye boyadım 365 | lavuk 366 | liboş 367 | madafaka 368 | mal 369 | malafat 370 | malak 371 | manyak 372 | mcik 373 | meme 374 | memelerini 375 | mezveleli 376 | minaamcık 377 | mincikliyim 378 | mna 379 | monakkoluyum 380 | motherfucker 381 | mudik 382 | oc 383 | ocuu 384 | ocuun 385 | OÇ 386 | oç 387 | o. çocuğu 388 | oğlan 389 | oğlancı 390 | oğlu it 391 | orosbucocuu 392 | orospu 393 | orospucocugu 394 | orospu cocugu 395 | orospu çoc 396 | orospuçocuğu 397 | orospu çocuğu 398 | orospu çocuğudur 399 | orospu çocukları 400 | orospudur 401 | orospular 402 | orospunun 403 | orospunun evladı 404 | orospuydu 405 | orospuyuz 406 | orostoban 407 | orostopol 408 | orrospu 409 | oruspu 410 | oruspuçocuğu 411 | oruspu çocuğu 412 | osbir 413 | ossurduum 414 | ossurmak 415 | ossuruk 416 | osur 417 | osurduu 418 | osuruk 419 | osururum 420 | otuzbir 421 | öküz 422 | öşex 423 | patlak zar 424 | penis 425 | pezevek 426 | pezeven 427 | pezeveng 428 | pezevengi 429 | pezevengin evladı 430 | pezevenk 431 | pezo 432 | pic 433 | pici 434 | picler 435 | piç 436 | piçin oğlu 437 | piç kurusu 438 | piçler 439 | pipi 440 | pipiş 441 | pisliktir 442 | porno 443 | pussy 444 | puşt 445 | puşttur 446 | rahminde 447 | revizyonist 448 | s1kerim 449 | s1kerm 450 | s1krm 451 | sakso 452 | saksofon 453 | salaak 454 | salak 455 | saxo 456 | sekis 457 | serefsiz 458 | sevgi koyarım 459 | sevişelim 460 | sexs 461 | sıçarım 462 | sıçtığım 463 | sıecem 464 | sicarsin 465 | sie 466 | sik 467 | sikdi 468 | sikdiğim 469 | sike 470 | sikecem 471 | sikem 472 | siken 473 | sikenin 474 | siker 475 | sikerim 476 | sikerler 477 | sikersin 478 | sikertir 479 | sikertmek 480 | sikesen 481 | sikesicenin 482 | sikey 483 | sikeydim 484 | sikeyim 485 | sikeym 486 | siki 487 | sikicem 488 | sikici 489 | sikien 490 | sikienler 491 | sikiiim 492 | sikiiimmm 493 | sikiim 494 | sikiir 495 | sikiirken 496 | sikik 497 | sikil 498 | sikildiini 499 | sikilesice 500 | sikilmi 501 | sikilmie 502 | sikilmis 503 | sikilmiş 504 | sikilsin 505 | sikim 506 | sikimde 507 | sikimden 508 | sikime 509 | sikimi 510 | sikimiin 511 | sikimin 512 | sikimle 513 | sikimsonik 514 | sikimtrak 515 | sikin 516 | sikinde 517 | sikinden 518 | sikine 519 | sikini 520 | sikip 521 | sikis 522 | sikisek 523 | sikisen 524 | sikish 525 | sikismis 526 | sikiş 527 | sikişen 528 | sikişme 529 | sikitiin 530 | sikiyim 531 | sikiym 532 | sikiyorum 533 | sikkim 534 | sikko 535 | sikleri 536 | sikleriii 537 | sikli 538 | sikm 539 | sikmek 540 | sikmem 541 | sikmiler 542 | sikmisligim 543 | siksem 544 | sikseydin 545 | sikseyidin 546 | siksin 547 | siksinbaya 548 | siksinler 549 | siksiz 550 | siksok 551 | siksz 552 | sikt 553 | sikti 554 | siktigimin 555 | siktigiminin 556 | siktiğim 557 | siktiğimin 558 | siktiğiminin 559 | siktii 560 | siktiim 561 | siktiimin 562 | siktiiminin 563 | siktiler 564 | siktim 565 | siktim 566 | siktimin 567 | siktiminin 568 | siktir 569 | siktir et 570 | siktirgit 571 | siktir git 572 | siktirir 573 | siktiririm 574 | siktiriyor 575 | siktir lan 576 | siktirolgit 577 | siktir ol git 578 | sittimin 579 | sittir 580 | skcem 581 | skecem 582 | skem 583 | sker 584 | skerim 585 | skerm 586 | skeyim 587 | skiim 588 | skik 589 | skim 590 | skime 591 | skmek 592 | sksin 593 | sksn 594 | sksz 595 | sktiimin 596 | sktrr 597 | skyim 598 | slaleni 599 | sokam 600 | sokarım 601 | sokarim 602 | sokarm 603 | sokarmkoduumun 604 | sokayım 605 | sokaym 606 | sokiim 607 | soktuğumunun 608 | sokuk 609 | sokum 610 | sokuş 611 | sokuyum 612 | soxum 613 | sulaleni 614 | sülaleni 615 | sülalenizi 616 | sürtük 617 | şerefsiz 618 | şıllık 619 | taaklarn 620 | taaklarna 621 | tarrakimin 622 | tasak 623 | tassak 624 | taşak 625 | taşşak 626 | tipini s.k 627 | tipinizi s.keyim 628 | tiyniyat 629 | toplarm 630 | topsun 631 | totoş 632 | vajina 633 | vajinanı 634 | veled 635 | veledizina 636 | veled i zina 637 | verdiimin 638 | weled 639 | weledizina 640 | whore 641 | xikeyim 642 | yaaraaa 643 | yalama 644 | yalarım 645 | yalarun 646 | yaraaam 647 | yarak 648 | yaraksız 649 | yaraktr 650 | yaram 651 | yaraminbasi 652 | yaramn 653 | yararmorospunun 654 | yarra 655 | yarraaaa 656 | yarraak 657 | yarraam 658 | yarraamı 659 | yarragi 660 | yarragimi 661 | yarragina 662 | yarragindan 663 | yarragm 664 | yarrağ 665 | yarrağım 666 | yarrağımı 667 | yarraimin 668 | yarrak 669 | yarram 670 | yarramin 671 | yarraminbaşı 672 | yarramn 673 | yarran 674 | yarrana 675 | yarrrak 676 | yavak 677 | yavş 678 | yavşak 679 | yavşaktır 680 | yavuşak 681 | yılışık 682 | yilisik 683 | yogurtlayam 684 | yoğurtlayam 685 | yrrak 686 | zıkkımım 687 | zibidi 688 | zigsin 689 | zikeyim 690 | zikiiim 691 | zikiim 692 | zikik 693 | zikim 694 | ziksiiin 695 | ziksiin 696 | zulliyetini 697 | zviyetini 698 | -------------------------------------------------------------------------------- /currentmessageid.txt: -------------------------------------------------------------------------------- 1 | 1333 -------------------------------------------------------------------------------- /database.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | from app.entryController import entryContentCheck, entryFilter 3 | 4 | CREATE_TABLE = "CREATE TABLE IF NOT EXISTS entries (message_id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT NOT NULL UNIQUE, date TEXT, vote INTEGER)" 5 | CREATE_ENTRY = "INSERT INTO entries VALUES (?, ?, ?, ?)" 6 | RETRIEVE_ENTRIES = "SELECT * FROM entries" 7 | RETRIEVE_ENTRIES_TOP = "SELECT * FROM entries ORDER BY vote ASC" 8 | WIPE_ENTRIES = "DROP TABLE entries" 9 | UPVOTE = "UPDATE entries SET vote = vote + 1 WHERE message_id = (?)" 10 | DELETE_ENTRY = "DELETE FROM entries WHERE message_id = (?)" 11 | 12 | def create_tables(): 13 | with sqlite3.connect("data.db") as connection: 14 | connection.execute(CREATE_TABLE) 15 | 16 | def get_current_message_id(): 17 | with open('currentmessageid.txt', 'r+') as f: 18 | msg_id = f.read() 19 | 20 | return msg_id 21 | 22 | 23 | def create_entry(content, date): 24 | message_id = get_current_message_id() 25 | 26 | if entryContentCheck(content): 27 | content = entryFilter(content) 28 | with sqlite3.connect("data.db") as connection: 29 | try: 30 | connection.execute( 31 | CREATE_ENTRY, (message_id, content, date, 0)) 32 | 33 | with open('currentmessageid.txt', 'w') as f: 34 | f.write(int(message_id) + 1) 35 | 36 | except Exception: 37 | pass 38 | 39 | 40 | def retrieve_entries(): 41 | with sqlite3.connect("data.db") as connection: 42 | cursor = connection.cursor() 43 | cursor.execute(RETRIEVE_ENTRIES) 44 | return cursor.fetchall() 45 | 46 | 47 | def retrieve_entries_top(): 48 | with sqlite3.connect("data.db") as connection: 49 | cursor = connection.cursor() 50 | cursor.execute(RETRIEVE_ENTRIES_TOP) 51 | return cursor.fetchall() 52 | 53 | 54 | def upvote(message_id): 55 | with sqlite3.connect("data.db") as connection: 56 | cursor = connection.cursor() 57 | cursor.execute(UPVOTE, (message_id, )) 58 | 59 | 60 | def delete(message_id): 61 | with sqlite3.connect("data.db") as connection: 62 | cursor = connection.cursor() 63 | cursor.execute(DELETE_ENTRY, (message_id, )) 64 | 65 | 66 | def clear_database(): 67 | with sqlite3.connect("data.db") as connection: 68 | cursor = connection.cursor() 69 | cursor.execute(WIPE_ENTRIES) 70 | connection.execute(CREATE_TABLE) 71 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | flask 2 | gunicorn -------------------------------------------------------------------------------- /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.7.5 -------------------------------------------------------------------------------- /wsgi.py: -------------------------------------------------------------------------------- 1 | from app.main import app 2 | 3 | if __name__ == "__main__": 4 | app.run(host='0.0.0.0', debug=True) --------------------------------------------------------------------------------