A Cyberland server written in Python with Flask.

Related tags

FlaskCyberland-server
Overview

Cyberland

Cyberland logo

What is Cyberland

Cyberland is a textboard that offers no frontend. Most of the time, the user makes their own front end. The protocol, as far as I know, made by Github user Jorde Kang and the original repo is here. An alternative version of the server has also been made here.

Unfortunately, the servers hosting the originals Cyberland have been taken down. Thus, I want to make a new one. I have chosen to make it from scratch instead of reusing one for two reasons. Firstly, I want to learn a bit about web technologies. Secondly, as the specifications of the Cyberland protocol have never been written, I want to make them.

Using cyberland

Server

I am hosting this server at cyberland.bobignou.red. Go check it out.

Client

To access the Cyberland server, you need a client. You can find plenty of them if you search for "cyberland client" on Github but I can always advertise mine.

On the other hand, if you want to use Cyberland the way it is intended, you should try to write your own client.

This server

Launching it

This Cyberland server is written in Python 3 using Flask. Running cyberland.py will launch it on port 8901. It's then up to you to route the internet traffic to it.

Configuration

The server is configurated from a single JSON file. The JSON file contains an array where each entry corresponds to a board the server will serve. For each board, the configuration fields are the following:

Name type Description
name string Name of the board as used in the URL.
description string A description of what this board is about.
max_post_size integer Maximum size of a post in bytes.
enable_ansi_code boolean Set to true to enable ANSI escape codes in a board.
max_replies_thread integer Maximum number of posts the server can present when the parameter thread is set. Set to 0 to disable.
max_replies_no_thread integer Maximum number of posts the server can present when the parameter thread is not set. Set to 0 to disable.

I included in this repository the configuration used on cyberland;github.com.

Database

As of now, the serer does not uses a proper database. All the posts are stored in a JSON file.

Default pages

This server also present some web pages that are not Cyberland boards. They are the following:

  • A welcome page at the root.
  • Configuration page: at /config/ .
  • At /status , there is a list of all board and the number of posts in each board.

Logging and banning

This server generate a line of log for each new message. For every new message, a new line will be added on the log file cyberland_log. The line contains a hash of the IP of the poster, the board where the post have been made and the ID of the post.

In order to bans some peoples from the server, you simply have to write the hash of their IP to a JSON array in the file bans.json. This file is optional, if it is not found, an error will be printed at the startup of the server but the server will run nonetheless.

Anti-spam

To prevent users from spamming, there is a delay between each post one user can do. The user is tracked with its IP. Furthermore, to prevent users from bypassing the delay, they must wait some time before their first connection. All the constants related to this are at the beginning of anti_spam.py.

To make sure that trusted users will not have to wait for the delay, you can put their hashed IPs in a list in the file verified.json.

Content filter

This server also provides some optional content filters. You can write an array of forbidden words in bad_words.js and the server will not accept any message containing those words.

Cyberland protocol

Boards

A Cyberland server hosts multiple boards. Each board is independent of the other and they are meant to be about various subjects. For example, the board /t/ form cyberland.bobignou.red is meant to be about technology while the board /n/ is meant to be about news.

Post

Cyberland posts are very simples. They have a unique id field which is a positive integer. This field corresponds to the order in the board they are posted. The first post on a board will have id 1, the second will have id 2. Two posts on the same board can not have the same id but two posts from two different boards can have the same id.

The posts also have a ReplyTo field. This field contains a positive integer that is the id of another post from the same board. If that field contains 0, that means that the post is not replying to any other and is the start of a new thread. Alternatively, the field can contain "null" to express the same thing.

Then, the posts have a time fields. This field should either contain the time-stamp of the post in UNIX seconds at UTC or 0 if this is not applicable or not computed.

Lastly, the post has a content field that contains the message in the post. The message can be made from Unicode characters or, if the board allows it, Unicode characters and ANSI escape code. The content field can have a maximum size and the server could reject messages that are bigger than this size.

Communication

A Cyberland server presents a REST API to the rest to let the client post and read messages.

A Cyberland server should have more than one board. The board is selected in the URL of the request. For example, to interact with the board /t/ of the server cyberland.bobignou.red, you should make requests to cyberland.bobignou.red/t/.

The operation to do is selected with the HTTP method used and the details of the operation are selected in the parameters of the request.

The server replies with JSON data or HTTP error codes.

Posting messages

Posting a message on a board is made with the POST HTTP method. The message and other info are in the form of the request. The form should be an URL encoded data form. The field content contains the message and the optional field replyTo can contain the id of a post we want to reply to.

If the form is valid, the server will reply with the code 200. If it is not, it will reply with the code 400 and with a message explaining what is wrong.

Reading posts

Reading what is on a board is made with the GET HTTP method. The request is specified with the parameters in the URL of the request.

The first valid parameter is num. It should contain a positive integer. It describes the maximum number of posts the server should send. If it is not specified, the server will send the maximum number of posts that are compliant with the rest of the request.

The second valid parameter is thread. It should contain an id. If it is set, the server will return the post with the given id and posts replying to it.

The server will reply with a JSON array containing all the posts requested. If the parameter thread is not set, the post with the greatest id will be at the index 0 of the array. The rest of the posts are sorted by decreasing id. If the parameter thread is set, the post with the smaller id will be at index 0 and the other post will be sorted by increasing id. This is made that way to ensure that a request with parameters num=1 and thread not set will return the latest post and a request where num=1&thread= will return the pos with id .

If the parameter makes sense, the server will reply with the status code 200. If there is an error the status code 400 will be replied and an error message will be sent.

To prevent clients from making too many requests, the server reserve itself the right to capping the maximum number of post to be sent. If the number is capped in a reply, it is up to the client to check for an error. I really advise against doing so when the thread field is set to ensure that users can read all threads completely.

Owner
Maxime Bouillot
Maxime Bouillot
Small flask based opds catalog designed to serve a directory via OPDS

teenyopds Small flask based opds catalog designed to serve a directory via OPDS, it has currently only been verified to work with KyBook 3 on iOS but

Adam Furbee 4 Jul 14, 2022
a flask zipkin extension based on py_zipkin.

flask-zipkin a flask zipkin extension based on py_zipkin. Installation pip install flask_zipkin usage you can simply use it as other flask extensions.

39 Jul 03, 2022
REST API built using flask framework that used for managing bookmarks by individual users.

Bookmarks REST API REST API built using flask framework that used for managing bookmarks by individual users. API Consumers Note This app is built usi

Venkatesh Tantravahi 1 Dec 27, 2021
REST API with Flask and SQLAlchemy. I would rather not use it anymore.

Flask REST API Python 3.9.7 The Flask experience, without data persistence :D First, to install all dependencies: python -m pip install -r requirement

Luis Quiñones Requelme 1 Dec 15, 2021
A clean and simple blog system based on Flask and MongoDB

CleanBlog A clean and simple blog system based on Flask and MongoDB You can access CleanBlog This is the source code of Flask Tutorial Pro,you can buy

shin 107 Oct 06, 2022
Flask Web DRY full-stack framework by Problem Fighter

In the name of God, the Most Gracious, the Most Merciful. PF-Flask-Web Documentation Install and update using pip: pip install -U PF-Flask-Web Please

Problem Fighter 2 Jan 20, 2022
A simple example using Flask inside a container

This is a simple example of how create a container for a Python Flask Web Application using Docker.

Fazt Web 8 Aug 30, 2022
Flask webassets integration.

Integrates the webassets library with Flask, adding support for merging, minifying and compiling CSS and Javascript files. Documentation: https://flas

Michael Elsdörfer 433 Dec 29, 2022
Companion code to my O'Reilly book "Flask Web Development", second edition.

Flasky This repository contains the source code examples for the second edition of my O'Reilly book Flask Web Development. The commits and tags in thi

Miguel Grinberg 8k Dec 27, 2022
A Python chat app built with Flask that runs in the browser.

A Python chat app built with Flask that runs in the browser. Designed for local area networks that are not connected to the Internet.

Leonard Kleber 1 Dec 23, 2021
A gRpc server like Flask (像Flask一样的gRpc服务)

Mask A gRpc server just like Flask. Install Mask support pypi packages, you can simply install by: pip install mask Document Mask manual could be fou

吴东 16 Jun 14, 2022
A basic CRUD application built in flask using postgres as database

flask-postgres-CRUD A basic CRUD application built in flask using postgres as database Taks list Dockerfile Initial docker-compose - It is working Dat

Pablo Emídio S.S 9 Sep 25, 2022
Flaskr: Intro to Flask, Test-Driven Development (TDD), and JavaScript

Flaskr - Intro to Flask, Test-Driven Development, and JavaScript Share on Twitter As many of you know, Flaskr -- a mini-blog-like-app -- is the app th

Michael Herman 2.2k Jan 04, 2023
Beautiful Interactive tables in your Flask templates.

flask-tables Beautiful interactive tables in your Flask templates Resources Video demonstration: Go to YouTube video. Learn how to use this code: Go t

Miguel Grinberg 209 Jan 05, 2023
A fairly common feature in web applications to have links that open a popover when hovered

Add Popovers to Links in Flask App It is a fairly common feature in web applications to have links that open a popover when hovered. Twitter does this

Gitau Harrison 1 Jan 22, 2022
Flask extension for Pusher

Flask-Pusher Flask extension for Pusher. It is a thin wrapper around the official client, binding Flask app to Pusher client. Installation Install Fla

Iuri de Silvio 9 May 29, 2021
flask-apispec MIT flask-apispec (🥉24 · ⭐ 520) - Build and document REST APIs with Flask and apispec. MIT

flask-apispec flask-apispec is a lightweight tool for building REST APIs in Flask. flask-apispec uses webargs for request parsing, marshmallow for res

Joshua Carp 617 Dec 30, 2022
A simple demo of using aiogram + async sqlalchemy 1.4+

aiogram-and-sqlalchemy-demo A simple demo of using aiogram + async sqlalchemy 1.4+ Used tech: aiogram SQLAlchemy 1.4+ PostgreSQL as database asyncpg a

Aleksandr 68 Dec 31, 2022
This is a repository for a playlist of videos where I teach building RESTful API with Flask and Flask extensions.

Build And Deploy A REST API with Flask This is code for a series of videos in which we look at the various concepts involved when building a REST API

Ssali Jonathan 10 Nov 24, 2022
A flask template with Bootstrap 4, asset bundling+minification with webpack, starter templates, and registration/authentication. For use with cookiecutter.

cookiecutter-flask A Flask template for cookiecutter. (Supports Python ≥ 3.6) See this repo for an example project generated from the most recent vers

4.3k Dec 29, 2022