diff --git a/CHANGELOG.md b/CHANGELOG.md index 439779d3ab..78896c2dda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ Up requirements to Django 3.2+ - New Channel-System using the `channel` command and nicks. Removed the `ChannelHandler` and the concept of a dynamically created `ChannelCmdSet`. - Add `Msg.db_receiver_external` field to allowe external, string-id message-receivers. +- Renamed `app.css` to `website.css` for consistency. Removed old prosimii-css files. ### Evennia 0.9.5 (2019-2020) diff --git a/docs/source/Components/Web-Admin.md b/docs/source/Components/Web-Admin.md index fc048d80c2..ddb2e59d1e 100644 --- a/docs/source/Components/Web-Admin.md +++ b/docs/source/Components/Web-Admin.md @@ -1,9 +1,158 @@ # The Web Admin The Evennia _Web admin_ is a customized [Django admin site](https://docs.djangoproject.com/en/3.2/ref/contrib/admin/) -and is used for manipulating the game database using a graphical interface. +used for manipulating the game database using a graphical interface. You +have to be logged into the site to use it. It then appears as an `Admin` link +the top of your website. You can also go to [http://localhost:4001/admin](http://localhost:4001/admin) when +running locally. -All actions done in the admin can also be done in-game by use of Admin- or -Builder-commands. The only exception is the assigning of `staff` flags for -allowing users access to the admin itself. +Almost all actions done in the admin can also be done in-game by use of Admin- +or Builder-commands. +## Usage + +The admin is pretty self-explanatory - you can see lists of each object type, +create new instances of each type and also add new Attributes/tags them. The +admin frontpage will give a summary of all relevant entities and how they are +used. + +There are a few use cases that requires some additional explanation though. + +### Adding objects to Attributes + +The `value` field of an Attribute is pickled into a special form. This is usually not +something you need to worry about (the admin will pickle/unpickle) the value +for you), _except_ if you want to store a database-object in an attribute. Such +objects are actually stored as a `tuple` with object-unique data. + +1. Find the object you want to add to the Attribute. At the bottom of the first section + you'll find the field _Serialized string_. This string shows a Python tuple like + + ('__packed_dbobj__', ('objects', 'objectdb'), '2021:05:15-08:59:30:624660', 358) + + Mark and copy this tuple-string to your clipboard exactly as it stands (parentheses and all). +2. Go to the entity that should have the new Attribute and create the Attribute. In its `value` + field, paste the tuple-string you copied before. Save! +3. If you want to store multiple objects in, say, a list, you can do so by literally + typing a python list `[tuple, tuple, tuple, ...]` where you paste in the serialized + tuple-strings with commas. At some point it's probably easier to do this in code though ... + +### Linking Accounts and Characters + +In `MULTISESSION_MODE` 0 or 1, each connection can have one Account and one +Character, usually with the same name. Normally this is done by the user +creating a new account and logging in - a matching Character will then be +created for them. You can however also do so manually in the admin: + +1. First create the complete Account in the admin. +2. Next, create the Object (usually of `Character` typeclass) and name it the same + as the Account. It also needs a command-set. The default CharacterCmdset is a good bet. +3. In the `Puppeting Account` field, select the Account. +4. Make sure to save everything. +5. Click the `Link to Account` button (this will only work if you saved first). This will + add the needed locks and Attributes to the Account to allow them to immediately + connect to the Character when they next log in. This will (where possible): + - Set `account.db._last_puppet` to the Character. + - Add Character to `account.db._playabel_characters` list. + - Add/extend the `puppet:` lock on the Character to include `puppet:pid()` + +### Building with the Admin + +It's possible (if probably not very practical at scale) to build and describe +rooms in the Admin. + +1. Create an `Object` of a Room-typeclass with a suitable room-name. +2. Set an Attribute 'desc' on the room - the value of this Attribute is the + room's description. +3. Add `Tags` of `type` 'alias' to add room-aliases (no type for regular tags) + +Exits: + +1. Exits are `Objects` of an `Exit` typeclass, so create one. +2. The exit has `Location` of the room you just created. +3. Set `Destination` set to where the exit leads to. +4. Set a 'desc' Attribute, this is shown if someone looks at the exit. +5. `Tags` of `type` 'alias' are alternative names users can use to go through + this exit. + +## Grant others access to the admin + +The access to the admin is controlled by the `Staff status` flag on the +Account. Without this flag set, even superusers will not even see the admin +link on the web page. The staff-status has no in-game equivalence. + + +Only Superusers can change the `Superuser status` flag, and grant new +permissions to accounts. The superuser is the only permission level that is +also relevant in-game. `User Permissions` and `Groups` found on the `Account` +admin page _only_ affects the admin - they have no connection to the in-game +[Permissions](Permissions) (Player, Builder, Admin etc). + +For a staffer with `Staff status` to be able to actually do anything, the +superuser must grant at least some permissions for them on their Account. This +can also be good in order to limit mistakes. It can be a good idea to not allow +the `Can delete Account` permission, for example. + +```important:: + + If you grant staff-status and permissions to an Account and they still cannot + access the admin's content, try reloading the server. + +``` + +```warning:: + + If a staff member has access to the in-game ``py`` command, they can just as + well have their admin ``Superuser status`` set too. The reason is that ``py`` + grants them all the power they need to set the ``is_superuser`` flag on their + account manually. There is a reason access to the ``py`` command must be + considered carefully ... + +``` + +## Customizing the web admin + +Customizing the admin is a big topic and something beyond the scope of this +documentation. See the [official Django docs](https://docs.djangoproject.com/en/3.2/ref/contrib/admin/) for +the details. This is just a brief summary. + +See the [Website](./Website) page for an overview of the components going into +generating a web page. The Django admin uses the same principle except that +Django provides a lot of tools to automate the admin-generation for us. + +Admin templates are found in `evennia/web/templates/admin/` but you'll find +this is relatively empty. This is because most of the templates are just +inherited directly from their original location in the Django package +(`django/contrib/admin/templates/`). So if you wanted to override one you'd have +to copy it from _there_ into your `mygame/templates/admin/` folder. Same is true +for CSS files. + +The admin site's backend code (the views) is found in `evennia/web/admin/`. It +is organized into `admin`-classes, like `ObjectAdmin`, `AccountAdmin` etc. +These automatically use the underlying database models to generate useful views +for us without us havint go code the forms etc ourselves. + +The top level `AdminSite` (the admin configuration referenced in django docs) +is found in `evennia/web/utils/adminsite.py`. + + +### Change the title of the admin + +By default the admin's title is `Evennia web admin`. To change this, add the +following to your `mygame/web/urls.py`: + +```python +# in mygame/web/urls.py + +# ... + +from django.conf.admin import site + +#... + +site.site_header = "My great game admin" + + +``` + +Reload the server and the admin's title header will have changed. diff --git a/docs/source/Components/Webclient.md b/docs/source/Components/Webclient.md index ac49fd91fe..da2e3a5506 100644 --- a/docs/source/Components/Webclient.md +++ b/docs/source/Components/Webclient.md @@ -1,6 +1,4 @@ -# Webclient - -# **Web client** +# Web Client Evennia comes with a MUD client accessible from a normal web browser. During development you can try it at `http://localhost:4001/webclient`. The client consists of several parts, all under diff --git a/docs/source/Components/Webserver.md b/docs/source/Components/Webserver.md index 01593140da..64fe964052 100644 --- a/docs/source/Components/Webserver.md +++ b/docs/source/Components/Webserver.md @@ -17,7 +17,7 @@ environment. It leverages the Django web framework and provides: game. Users logged into the website will be auto-logged into the game if they do so with the webclient since they share the same login credentials (there is no way to safely do auto-login with telnet clients). -- The [Web Admin](Web-Admin) is based on the Django web admin and allows you to +- The [Web Admin](./Web-Admin) is based on the Django web admin and allows you to edit the game database in a graphical interface. - The [Webclient](./Webclient) page is served by the webserver, but the actual game communication (sending/receiving data) is done by the javascript client diff --git a/docs/source/Components/Website.md b/docs/source/Components/Website.md index 4b0429f47b..c3df4603cc 100644 --- a/docs/source/Components/Website.md +++ b/docs/source/Components/Website.md @@ -1,9 +1,10 @@ -# Game Website +# Game website When Evennia starts it will also start a [Webserver](./Webserver) as part of the [Server](./Portal-And-Server) process. This uses [Django](https://docs.djangoproject.com) to present a simple but functional default game website. With the default setup, -open your browser to `localhost:4001` or `127.0.0.1:4001` to see it. +open your browser to [localhost:4001](http://localhost:4001) or [127.0.0.1:4001](http://127.0.0.1:4001) +to see it. The website allows existing players to log in using an account-name and password they previously used to register with the game. If a user logs in with @@ -16,22 +17,27 @@ resources. It also shows some statistics about how many players are currently connected. In the top menu you can find -- Home - Get back to front page. -- Document - A link to the latest stable Evennia documentation. -- Characters - This is a demo of connecting in-game characters to the website. +- _Home_ - Get back to front page. +- _Documentation_ - A link to the latest stable Evennia documentation. +- _Characters_ - This is a demo of connecting in-game characters to the website. It will display a list of all entities of the _typeclasses.characters.Character` typeclass and allow you to view their description with an optional image. The list is only available to logged-in users. -- Channels - This is a demo of connecting in-game chats to the website. It will +- _Channels_ - This is a demo of connecting in-game chats to the website. It will show a list of all channels available to you and allow you to view the latest discussions. Most channels require logging in, but the `Public` channel can also be viewed by non-loggedin users. -- Help - This ties the in-game [Help system](./Help-System) to the website. All +- _Help_ - This ties the in-game [Help system](./Help-System) to the website. All database-based help entries that are publicly available or accessible to your account can be read. This is a good way to present a body of help for people to read outside of the game. -- Play Online - This opens the [Webclient](./Webclient) in the browser. +- _Play Online_ - This opens the [Webclient](./Webclient) in the browser. +- _Admin_ The [Web admin](Web admin) will only show if you are logged in. +- _Log in/out_ - Allows you to authenticate using the same credentials you use + in the game. +- _Register_ - Allows you to register a new account. This is the same as + creating a new account upon first logging into the game). ## Modifying the default Website @@ -263,7 +269,7 @@ your copy. Just remember to reload. ### Using Flat Pages The absolutely simplest way to add a new web page is to use the `Flat Pages` -app available in the [Web Admin](Web-Admin). The page will appear with the same +app available in the [Web Admin](./Web-Admin). The page will appear with the same styling as the rest of the site. For the `Flat pages` module to work you must first set up a _Site_ (or diff --git a/docs/source/toc.md b/docs/source/toc.md index e24d284528..1731b1a46c 100644 --- a/docs/source/toc.md +++ b/docs/source/toc.md @@ -48,6 +48,7 @@ - [Components/Tags](Components/Tags) - [Components/TickerHandler](Components/TickerHandler) - [Components/Typeclasses](Components/Typeclasses) +- [Components/Web Admin](Components/Web-Admin) - [Components/Webclient](Components/Webclient) - [Components/Webserver](Components/Webserver) - [Components/Website](Components/Website) diff --git a/evennia/settings_default.py b/evennia/settings_default.py index 86ed6b99a1..65f753f4a1 100644 --- a/evennia/settings_default.py +++ b/evennia/settings_default.py @@ -26,7 +26,7 @@ import sys SERVERNAME = "Evennia" # Short one-sentence blurb describing your game. Shown under the title # on the website and could be used in online listings of your game etc. -GAME_SLOGAN = "Python MU* creation system" +GAME_SLOGAN = "The Python MUD/MU* creation system" # Lockdown mode will cut off the game from any external connections # and only allow connections from localhost. Requires a cold reboot. LOCKDOWN_MODE = False diff --git a/evennia/web/admin/accounts.py b/evennia/web/admin/accounts.py index dae11d9e33..6f3f1aa9eb 100644 --- a/evennia/web/admin/accounts.py +++ b/evennia/web/admin/accounts.py @@ -77,15 +77,15 @@ class AccountChangeForm(UserChangeForm): required=False, ) - # is_superuser = forms.BooleanField( - # label = "Superuser status", - # required=False, - # help_text="Superusers bypass all in-game locks and has all " - # "permissions without explicitly assigning them. Usually " - # "only one superuser (user #1) is needed, new superusers " - # "can be created by setting the `is_superuser` flag in code " - # "or by the `evennia createsuperuser` CLI command." - # ) + is_superuser = forms.BooleanField( + label = "Superuser status", + required=False, + help_text="Superusers bypass all in-game locks and has all " + "permissions without explicitly assigning them. Usually " + "only one superuser (user #1) is needed and only a superuser " + "can create another superuser.
" + "Only Superusers can change the user/group permissions below." + ) def clean_username(self): """ @@ -312,7 +312,17 @@ class AccountAdmin(BaseUserAdmin): help_texts["puppeted_objects"] = self.puppeted_objects.help_text kwargs["help_texts"] = help_texts - return super().get_form(request, obj, **kwargs) + # security disabling for non-superusers + form = super().get_form(request, obj, **kwargs) + disabled_fields = set() + if not request.user.is_superuser: + disabled_fields |= { + 'is_superuser', 'user_permissions', 'user_groups' + } + for field_name in disabled_fields: + if field_name in form.base_fields: + form.base_fields[field_name].disabled = True + return form @sensitive_post_parameters_m def user_change_password(self, request, id, form_url=""): diff --git a/evennia/web/static/website/css/prosimii-print.css b/evennia/web/static/website/css/prosimii-print.css deleted file mode 100644 index 568882b860..0000000000 --- a/evennia/web/static/website/css/prosimii-print.css +++ /dev/null @@ -1,225 +0,0 @@ -/************************************** - * TITLE: Prosimii Print Stylesheet * - * URI : prosimii/prosimii-print.css * - * MODIF: 2003-Apr-30 19:15 +0800 * - **************************************/ - - -/* ##### Common Styles ##### */ - -body { - color: black; - background-color: white; - font-family: "times new roman", times, roman, serif; - font-size: 12pt; - margin: 0; - padding: 0; -} - -acronym, .titleTip { - font-style: italic; - border-bottom: none; -} - -acronym:after, .titleTip:after { /* Prints titles after the acronyms/titletips. Doesn't work in MSIE */ - content: "(" attr(title) ")"; - font-size: 90%; - font-style: normal; - padding-left: 1ex; -} - -a { - color: black; - background-color: transparent; - text-decoration: none; -} - -a[href]:after { /* Prints the links' URIs after the links' texts. Doesn't work in MSIE */ - content: "<" attr(href) ">"; - font-size: 90%; - padding-left: 1ex; -} - -ol { - margin: -0.25em 0 1em 0; - padding: 0; -} - -ul { - list-style-type: square; - margin: -0.25em 0 1em 0; - padding: 0; -} - -dl { - margin: 0 0 1em 0; - padding: 0; -} - -ul li { - margin: 1ex 0 0 1.5em; - padding: 0; -} - -ol li { - margin: 1ex 0 0 1.5em; - padding: 0; -} - -dt { - font-weight: bold; - margin: 0; - padding: 0; -} - -dd { - margin: 0 0 0 1.5em; - padding: 0; -} - -.doNotPrint { - display: none; -} - - -/* ##### Header ##### */ - -#header { -} - -.superHeader { - display: none; -} - -.midHeader { - color: black; - background-color: transparent; - margin: 0; - padding: 0; - border-bottom: 1px solid black; -} - -.headerTitle { - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-size: 200%; - font-weight: normal; - margin: 0; - padding: 0; -} - -.headerSubTitle { - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-size: 110%; - font-weight: normal; - font-style: italic; - margin: 0; - padding: 0 0 1ex 0; -} - -.headerLinks { - display: none; -} - -.subHeader { - display: none; -} - - -/* ##### Side Menu ##### */ - -#side-bar { - display: none !important; -} - - -/* ##### Main Copy ##### */ - -#main-copy { - text-align: justify; - margin: 0 !important; - padding: 0; -} - -#main-copy h1 { - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-size: 120%; - margin: 2ex 0 1ex 0; - padding: 0; -} - -#main-copy h2 { - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-weight: normal; - font-size: 100%; - margin: 0; - padding: 2ex 0 0.5ex 0; -} - -#main-copy h1 + h2 { - padding-top: 0; -} - -#main-copy p { - margin: 0 0 2ex 0; - padding: 0; -} - -h2 a:after { - content: "" !important; -} - -.newsDate { - font-style: italic; - margin: 0; - padding: 0; - display: inline; -} - -.newsDate:before { /* Prints an '[' before the news item's date. Doesn't work in MSIE */ - content: "["; - font-style: normal; -} - -.newsDate:after { /* Prints a ']' after the news item's date. Doesn't work in MSIE */ - content: "]"; - font-style: normal; -} - -.newsSummary { - display: inline; - margin: 0 0 0 1ex !important; - padding: 0; -} - -.more { - display: none; -} - -.smallCaps { - font-variant: small-caps; -} - -.quarter, .oneThird, .half, .twoThirds, .fullWidth { - margin: 0; - padding: 0; -} - - -/* ##### Footer ##### */ - -#footer { - color: black; - background-color: transparent; - font-size: 100%; - text-align: center; - margin: 2em 0 0 0; - padding: 1ex 0 0 0; - border-top: 1px solid black; - display: block; -} - -#footer a { - color: black; - background-color: transparent; - text-decoration: none; -} \ No newline at end of file diff --git a/evennia/web/static/website/css/prosimii-screen-alt.css b/evennia/web/static/website/css/prosimii-screen-alt.css deleted file mode 100644 index b422ddba9b..0000000000 --- a/evennia/web/static/website/css/prosimii-screen-alt.css +++ /dev/null @@ -1,342 +0,0 @@ -/************************************************* - * TITLE: Prosimii Alternative Screen Stylesheet * - * URI : prosimii/prosimii-screen-alt.css * - * MODIF: 2004-Apr-28 21:56 +0800 * - *************************************************/ - - -/* ##### Common Styles ##### */ - -body { - font-family: verdana, helvetica, arial, sans-serif; - font-size: 73%; /* Enables font size scaling in MSIE */ - margin: 0; - padding: 0; -} - -html > body { - font-size: 9pt; -} - -acronym, .titleTip { - border-bottom: 1px dotted rgb(61,92,122); - cursor: help; - margin: 0; - padding: 0 0 0.4px 0; -} - -a { - color: rgb(61,92,122); - background-color: transparent; - text-decoration: underline; - margin: 0; - padding: 0 1px 2px 1px; -} - -a:hover { - color: rgb(117,144,174); - text-decoration: none; -} - -ol { - margin: 1em 0 1.5em 0; - padding: 0; -} - -ul { - list-style-type: square; - margin: 1em 0 1.5em 0; - padding: 0; -} - -dl { - margin: 1em 0 0.5em 0; - padding: 0; -} - -ul li { - line-height: 1.5em; - margin: 1.25ex 0 0 1.5em; - padding: 0; -} - -ol li { - line-height: 1.5em; - margin: 1.25ex 0 0 2em; - padding: 0; -} - -dt { - font-weight: bold; - margin: 0; - padding: 0 0 1ex 0; -} - -dd { - line-height: 1.75em; - margin: 0 0 1.5em 1.5em; - padding: 0; -} - -.doNotDisplay { - display: none !important; -} - - -.smallCaps { - font-size: 117%; - font-variant: small-caps; -} - - -/* ##### Header ##### */ - -.superHeader { - color: rgb(130,128,154); - background-color: rgb(33,50,66); - text-align: right; - margin: 0; - padding: 0.5ex 10px; -} - -.superHeader span { - color: rgb(195,196,210); - background-color: transparent; - font-weight: bold; - text-transform: uppercase; -} - -.superHeader a { - color: rgb(195,196,210); - background-color: transparent; - text-decoration: none; - margin: 0; - padding: 0 0.25ex 0 0; -} - -.superHeader a:hover { - color: rgb(193,102,90); - background-color: transparent; - text-decoration: none; -} - -.midHeader { - color: white; - background-color: rgb(61,92,122); - margin: 0; - padding: 0.26ex 10px; -} - -.headerTitle { - font-size: 300%; - margin: 0; - padding: 0; -} - -.headerSubTitle { - font-size: 151%; - font-weight: normal; - font-style: italic; - margin: 0 0 1ex 0; - padding: 0; -} - -.headerLinks { - text-align: right; - margin: 0; - padding: 0 0 2ex 0; - position: absolute; - right: 1.5em; - top: 3.5em; -} - -.headerLinks a { - color: white; - background-color: transparent; - text-decoration: none; - margin: 0; - padding: 0 0 0.5ex 0; - display: block; -} - -.headerLinks a:hover { - color: rgb(195,196,210); - background-color: transparent; - text-decoration: underline; -} - -.subHeader { - color: white; - background-color: rgb(117,144,174); - margin: 0; - padding: 0.5ex 10px; -} - -.subHeader a, .subHeader .highlight { - color: white; - background-color: transparent; - font-size: 110%; - font-weight: bold; - text-decoration: none; - margin: 0; - padding: 0 0.25ex 0 0; -} - -.subHeader a:hover, .subHeader .highlight { - color: rgb(255,204,0); - background-color: transparent; - text-decoration: none; -} - - -/* ##### Side Menu ##### */ - -#side-bar { - color: rgb(204,204,204); - background-color: transparent; - list-style-type: square; - list-style-position: inside; - width: 10em; - margin: 0; - padding: 1ex 0; - border: 1px solid rgb(204,204,204); - position: absolute; - left: 1.5ex; - top: 12em; -} - -[id="side-bar"] { - position: fixed !important; /* Makes the side menu scroll with the page. Doesn't work in MSIE */ -} - -#side-bar a { - text-decoration: none; -} - -#side-bar:hover { - color: rgb(117,144,174); - background-color: transparent; - border-color: rgb(117,144,174); -} - -#side-bar li { - margin: 0; - padding: 0.75ex 0 1ex 1.75ex; -} - -#side-bar li:hover { - color: rgb(61,92,122); - background-color: transparent; -} - - -#side-bar li a:hover { - text-decoration: underline; -} - - -/* ##### Main Copy ##### */ - -#main-copy { - text-align: justify; - margin: -0.5ex 1em 1em 12.5em; - padding: 0.5em 10px; - clear: left; -} - -#main-copy h1 { - color: rgb(117,144,174); - background-color: transparent; - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-size: 186%; - margin: 0; - padding: 1.5ex 0 0 0; -} - -#main-copy h2 { - color: rgb(61,92,122); - background-color: transparent; - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-weight: normal; - font-size: 151%; - margin: 0; - padding: 1ex 0 0 0; -} - -#main-copy p { - line-height: 1.75em; - margin: 1em 0 1.5em 0; - padding: 0; -} - -.newsHeading { - color: rgb(61,92,122); - background-color: transparent; - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-size: 145%; - text-decoration: none; - margin: 0; - padding: 1ex 0 0 0; - display: block; -} - -.newsHeading:hover { - color: rgb(117,144,174); - background-color: transparent; - text-decoration: underline; -} - -.newsDate { - font-style: italic; - margin: 0 !important; - padding: 0; -} - -.newsSummary { - margin: 1.5ex 0 2.5ex 0.75ex !important; - padding: 0; -} - -.more { - text-align: right; - margin: 0; - padding: 0.5em 0; -} - -.more a { - color: rgb(61,92,122); - background-color: transparent; - font-size: 92%; - text-decoration: underline; - margin: 0; - padding: 0.25ex 0.75ex; -} - -.more a:hover { - color: rgb(117,144,174); - text-decoration: none; -} - - -/* ##### Footer ##### */ - -#footer { - color: rgb(51,51,102); - background-color: rgb(239,239,239); - font-size: 87%; - text-align: center; - line-height: 1.25em; - margin: 2em 0 0 0; - padding: 1ex 10px; - clear: left; -} - -#footer a { - color: rgb(0,68,204); - background-color: transparent; - text-decoration: underline; -} - -#footer a:hover { - text-decoration: none; -} \ No newline at end of file diff --git a/evennia/web/static/website/css/prosimii-screen.css b/evennia/web/static/website/css/prosimii-screen.css deleted file mode 100644 index f4a2712d59..0000000000 --- a/evennia/web/static/website/css/prosimii-screen.css +++ /dev/null @@ -1,359 +0,0 @@ -/*************************************** - * TITLE: Prosimii Screen Stylesheet * - * URI : prosimii/prosimii-screen.css * - * MODIF: 2004-Apr-28 21:43 +0800 * - ***************************************/ - - -/* ##### Common Styles ##### */ - -body { - font-family: verdana, helvetica, arial, sans-serif; - font-size: 73%; /* Enables font size scaling in MSIE */ - margin: 0; - padding: 0; -} - -html > body { - font-size: 9pt; -} - -acronym, .titleTip { - border-bottom: 1px dotted rgb(61,92,122); - cursor: help; - margin: 0; - padding: 0 0 0.4px 0; -} - -a { - color: rgb(61,92,122); - background-color: transparent; - text-decoration: underline; - margin: 0; - padding: 0 1px 2px 1px; -} - -a:hover { - color: rgb(117,144,174); - text-decoration: none; -} - -ol { - margin: 1em 0 1.5em 0; - padding: 0; -} - -ul { - list-style-type: square; - margin: 1em 0 1.5em 0; - padding: 0; -} - -dl { - margin: 1em 0 0.5em 0; - padding: 0; -} - -ul li { - line-height: 1.5em; - margin: 1.25ex 0 0 1.5em; - padding: 0; -} - -ol li { - line-height: 1.5em; - margin: 1.25ex 0 0 2em; - padding: 0; -} - -dt { - font-weight: bold; - margin: 0; - padding: 0 0 1ex 0; -} - -dd { - line-height: 1.75em; - margin: 0 0 1.5em 1.5em; - padding: 0; -} - -.doNotDisplay { - display: none !important; -} - - -.smallCaps { - font-size: 117%; - font-variant: small-caps; -} - - -/* ##### Header ##### */ - -.superHeader { - color: rgb(130,128,154); - background-color: rgb(33,50,66); - text-align: right; - margin: 0; - padding: 0.5ex 10px; -} - -.superHeader span { - color: rgb(195,196,210); - background-color: transparent; - font-weight: bold; - text-transform: uppercase; -} - -.superHeader a { - color: rgb(195,196,210); - background-color: transparent; - text-decoration: none; - margin: 0; - padding: 0 0.25ex 0 0; -} - -.superHeader a:hover { - color: rgb(193,102,90); - background-color: transparent; - text-decoration: none; -} - -.midHeader { - color: white; - background-color: rgb(61,92,122); - margin: 0; - padding: 0.26ex 10px; -} - -.headerTitle { - font-size: 300%; - margin: 0; - padding: 0; -} - -.headerSubTitle { - font-size: 151%; - font-weight: normal; - font-style: italic; - margin: 0 0 1ex 0; - padding: 0; -} - -.headerLinks { - text-align: right; - margin: 0; - padding: 0 0 2ex 0; - position: absolute; - right: 1.5em; - top: 3.5em; -} - -.headerLinks a { - color: white; - background-color: transparent; - text-decoration: none; - margin: 0; - padding: 0 0 0.5ex 0; - display: block; -} - -.headerLinks a:hover { - color: rgb(195,196,210); - background-color: transparent; - text-decoration: underline; -} - -.subHeader { - color: white; - background-color: rgb(117,144,174); - margin: 0; - padding: 0.5ex 10px; -} - -.subHeader a, .subHeader .highlight { - color: white; - background-color: transparent; - font-size: 110%; - font-weight: bold; - text-decoration: none; - margin: 0; - padding: 0 0.25ex 0 0; -} - -.subHeader a:hover, .subHeader .highlight { - color: rgb(255,204,0); - background-color: transparent; - text-decoration: none; -} - - -/* ##### Main Copy ##### */ - -#main-copy { - margin: 0; - padding: 0.5em 10px; - clear: left; -} - -#main-copy h1 { - color: rgb(117,144,174); - background-color: transparent; - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-size: 200%; - margin: 0; - padding: 0; -} - -#main-copy h2 { - color: rgb(61,92,122); - background-color: transparent; - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-weight: normal; - font-size: 151%; - margin: 0; - padding: 1ex 0 0 0; -} - -#main-copy p { - line-height: 1.75em; - margin: 1em 0 1.5em 0; - padding: 0; -} - -.newsHeading { - color: rgb(61,92,122); - background-color: transparent; - font-family: "trebuchet ms", verdana, helvetica, arial, sans-serif; - font-size: 145%; - text-decoration: none; - margin: 0; - padding: 1ex 0 0 0; - display: block; -} - -.newsHeading:hover { - color: rgb(117,144,174); - background-color: transparent; - text-decoration: underline; -} - -.newsDate { - font-style: italic; - margin: 0 !important; - padding: 0; -} - -.newsSummary { - margin: 1.5ex 0 2.5ex 0.75ex !important; - padding: 0; -} - -.more { - text-align: right; - margin: 0; - padding: 0.5em 0; -} - -.more a { - color: rgb(61,92,122); - background-color: transparent; - font-size: 92%; - text-decoration: underline; - margin: 0; - padding: 0.25ex 0.75ex; -} - -.more a:hover { - color: rgb(117,144,174); - text-decoration: none; -} - -.rowOfBoxes { - clear: both; -} - -.quarter, .oneThird, .half, .twoThirds, .fullWidth { - margin: 1em 0; - float: left; - border-left: 1px solid rgb(204,204,204); -} - -.quarter { - width: 21%; - padding: 0 1.9%; -} - -.oneThird { - width: 28%; - padding: 0 1.9%; -} - -.half { - text-align: justify; - width: 46%; - padding: 0 1.9%; -} - -.twoThirds { - text-align: justify; - width: 63%; - padding: 0 1.9%; -} - -.fullWidth { - text-align: justify; - width: 96%; - padding: 0 1.2em; - border-left: none; -} - -.filler { /* use with an empty

element to add padding to the end of a text box */ - border: 1px solid white; -} - -.noBorderOnLeft { - border-left: none; -} - -.dividingBorderAbove { - border-top: 1px solid rgb(204,204,204); -} - -/* More elegant alternatives to .noBorderOnLeft & .dividingBorderAbove - * that don't require the creation of new classes - but which are not - * supported by MSIE - are the following: - * - * .rowOfBoxes > div:first-child { - * border-left: none; - * } - * - * .rowOfBoxes + .rowOfBoxes { - * border-top: 1px solid rgb(204,204,204); - * } - */ - - -/* ##### Footer ##### */ - -#footer { - color: rgb(51,51,102); - background-color: rgb(239,239,239); - font-size: 87%; - text-align: center; - line-height: 1.25em; - margin: 2em 0 0 0; - padding: 1ex 10px; - clear: left; -} - -#footer a { - color: rgb(0,68,204); - background-color: transparent; - text-decoration: underline; -} - -#footer a:hover { - text-decoration: none; -} diff --git a/evennia/web/static/website/css/app.css b/evennia/web/static/website/css/website.css similarity index 68% rename from evennia/web/static/website/css/app.css rename to evennia/web/static/website/css/website.css index 264d51c6a9..e10593b8dd 100644 --- a/evennia/web/static/website/css/app.css +++ b/evennia/web/static/website/css/website.css @@ -1,3 +1,6 @@ +/* Evennia CSS styles for the game website */ + + /* Old site styles, left in just in case. Shouldn't break anything! */ @media (max-width: 570px) { @@ -49,16 +52,6 @@ body { background-color: #eee; } -.footer { - position: absolute; - bottom: 0; - width: 100%; - /* Set the fixed height of the footer here */ - height: 60px; - line-height: 60px; /* Vertically center the text there */ - background-color: #7590ae; -} - .navbar-brand-logo { height: 64px; width: 64px; @@ -69,3 +62,40 @@ body { .navbar { background-color: #3d5c7a; } + +.footer { + position: absolute; + bottom: 0; + width: 100%; + /* Set the fixed height of the footer here */ + height: 60px; + line-height: 60px; /* Vertically center the text there */ + background-color: #3d5c7a; +} + + +/* Fancy play - button */ + +a.playbutton { + box-shadow: 0px 1px 10px 5px #9fb4f2; + background:linear-gradient(to bottom, #7892c2 5%, #476e9e 100%); + background-color:#7892c2; + border-radius:12px; + border:1px solid #4e6096; + display:inline-block; + cursor:pointer; + color:#ffffff; + font-family:Arial; + font-size:19px; + padding:14px 37px; + text-decoration:none; + text-shadow:0px 1px 0px #283966; +} +a.playbutton:hover { + background:linear-gradient(to bottom, #476e9e 5%, #7892c2 100%); + background-color:#476e9e; +} +a.playbutton:active { + position:relative; + top:1px; +} diff --git a/evennia/web/templates/website/_menu.html b/evennia/web/templates/website/_menu.html index 13d56f0e5d..65b84ea8ae 100644 --- a/evennia/web/templates/website/_menu.html +++ b/evennia/web/templates/website/_menu.html @@ -25,13 +25,6 @@ folder and edit it to add/remove links to the menu.

  • Home
  • - -
  • - About -
  • -
  • Documentation
  • - -
  • Characters
  • Channels
  • diff --git a/evennia/web/templates/website/base.html b/evennia/web/templates/website/base.html index 820f1351db..8a544daf56 100644 --- a/evennia/web/templates/website/base.html +++ b/evennia/web/templates/website/base.html @@ -12,10 +12,11 @@ - + + - + {% comment %} Allows for loading custom styles without overriding the base site styles @@ -55,7 +56,9 @@ diff --git a/evennia/web/templates/website/index.html b/evennia/web/templates/website/index.html index 6b35257798..f26be70131 100644 --- a/evennia/web/templates/website/index.html +++ b/evennia/web/templates/website/index.html @@ -8,42 +8,37 @@ {% block content %}
    -
    +
    -

    Welcome!

    + +

    Welcome to Evennia!


    - Welcome to your new installation of Evennia, your friendly - neighborhood next-generation MUD development system and server. + The Python MUD/MU* creation system.

    - You are looking at Evennia's web - presence, which can be expanded to a full-fledged site as needed.
    - Through the admin interface you can view and edit the - database without logging into the game. + You are looking at the start of your game's website, generated out of + the box by Evennia. It has several example pages and can be expanded + into a full-fledged home for your game.

    {% if webclient_enabled %}

    - You can also connect to the game directly from your browser using our - online client!
    + Play in the browser!

    {% endif %}

    For more info, take your time to - peruse our extensive online documentation. + peruse Evennia's extensive online manual.

    - Should you have any questions, concerns, bug reports, or - if you want to help out, don't hesitate to join the Evennia community - to make your voice heard! Drop a mail to the mailing - list or to come say hi in the developer chatroom. + If you have any questions, don't hesitate to join the Evennia community! Drop a message in the Evennia forums + or come say hi in the support/chat channels (IRC + or Discord).

    - If you find bugs, please report them to our Issue tracker. + If you find bugs, please report them to our Issue tracker on GitHub.

    @@ -99,16 +94,16 @@
    -
    +

    Evennia

    -

    Evennia is an open-source MUD server built in - Python, on top of the +

    Evennia is an open-source MUD/MU*-creation framework built in + Python, using Twisted and - Django frameworks. This - combination of technologies allows for the quick and easy creation - of the game of your dreams - as simple or as complex as you like.

    + Django.
    + Create the text-based multiplayer-game of your dreams - as + simple or as complex as you like.