Git Product home page Git Product logo

steffendx / gonorth Goto Github PK

View Code? Open in Web Editor NEW
566.0 27.0 30.0 41.26 MB

GoNorth is a story and content planning tool for RPGs and other open world games.

License: MIT License

C# 19.93% CSS 3.28% JavaScript 67.21% HTML 7.81% Shell 0.01% Ruby 0.01% PowerShell 0.01% Lua 0.14% Dockerfile 0.01% Batchfile 0.01% Handlebars 0.10% Less 1.30% SCSS 0.13% TypeScript 0.08%
gaming gamedev-tool storytelling map dotnet-core dotnetcore mongodb knockoutjs bootstrap dialog

gonorth's Introduction

GoNorth

GoNorth is a web application used for planning the story and world of RPGs or other open world games. GoNorth is cross-plattform ready, provides multilanguage support and is designed as a responsive layout.

It offers modules for:

  • Timeline view to provide a quick overview of changes
  • Planning Chapters as a Node System of Quests
  • Planning Quests as a Node System of Tasks
  • Planning Npcs and their different values
  • Planning dialogs of Npcs as Node System of dialog branches
  • Planning Items and their different values
  • Planning Skills and their different values
  • Exporting of Npcs, Dialogs, Items and skills
  • Bulk exporting / importing of Npc, Item and skill values
  • Wiki component with versioning and tight integration into the other modules
  • Map component to position Quest marker, Npcs, Items, Wiki pages and map changes
  • Tracking your implementation status and showing changed values after change to already implemented object
  • Task Tracker
  • GDPR support

Deployment

Badge

Please refer to the wiki for deployment details, docker deployment details, installer deployment details and the official documentation on how to host and deploy an ASP.NET Core application.

Brief Overview

Chapter and Quest Planning (Aika)

GoNorth provides a module for planning the different chapters of your game and the branching story. For this it provides a node system which allows you to connect the different quests and their possible outcomes together:

Chapter planning

A similiar node system can be created for the different quests.
Each quest will show the connections to Maps, Wiki pages and other objects to provide a view on the big picture while planning the quest.
More details can be found in the wiki.

Npc, Item and Skill Planning (Kortisto, Styr and Evne)

The web application provides functionality for planning Npcs, Items and Skills with flexible values. You can create templates and then create new Npcs, Items and Skills based on these templates:

Npc planning

Each object will display the different maps in which the Npc or Item is marked, the Wiki Pages in which its mentioned and all other connections. This way the user has a good overview what he or she has to consider when building the character or item.
To help with balancing and moving data, GoNorth supports bulk exporting and importing of values and objects.
More details can be found in the wiki for npcs, items and skills.

NPC State Machines

GoNorth supports the creation of state machines to aid in developing the AI of different monsters and Npcs:
State Machine

In addition to defining states and transitions you can also associate a script with each state in order to export the State Machine later on. More details can be found in the wiki.

Dialog Planning (Tale)

Using the dialog planning module a user can create the branching dialogs for the different game characters as a node system:

Dialog planning

GoNorth provides different dialog nodes for player or npc lines, player choices, conditions or actions. Statistics such as word count are also supported.
More details can be found in the wiki.

Daily routine planning

To help you build a living world, GoNorth allows you to easily define a daily routine for any Npc:

Daily Routines

You can define movement targets for npcs as well as scripts that are run at a certain time of day. This way you can really let your world come to live.
More details can be found in the wiki

Exporting

GoNorth supports exporting Npcs, Dialogs, Skills and Items to JSON and scripts.

Dialog planning

The scripts can be adjusted using a template system with different placeholders for values, learned skills, inventory and dialogs.
To enable a very flexible template system GoNorth uses Scriban to export the different objects.
For better localization support strings can be exported as language keys and localizable language files can be exported.
More details can be found in the wiki.

To give an additional form of flexibility during exporting, GoNorth supports so called export snippets. These can be used to specify certain hooks in the templates that can be filled by the different npcs, items or skills. This way you can have a special behaviour when picking up an item like adding a quest log message for example.
More details can be found in the wiki.

Wiki Component (Kirja)

Kirja is the wiki component of GoNorth. Apart from allowing the user to write wiki pages it also features versioning and a tight integration into the other systems:

Wiki

Kirja also allows the users to attach additional planning files.
A review system is also integrated into the wiki system, allowing you to collect feedback and easily merging the feedback into the page.
External sharing of wiki reviews can also be enabled, offering support to generate a link with a strong token to get external feedback on a wiki page.
More details can be found in the wiki.

Map Planning (Karta)

A user can upload a high resolution map image to GoNorth which will then be transformed into an interactive map similiar to Google Maps. On this map a user can mark the position of Quest Markers, Npcs, Items, Wiki Pages and Map Changes:

Map planning

Each marker provides brief informations about the different objects and allow the users to jump of the detail page.
A user can add addtional geometry like rectangles or polygons to a marker to indicate the affected area of the marker. More details can be found in the wiki.

Implementation Status Tracking

GoNorth allows you to mark objects as implemented once they are integrated into your game. If a user changes relevant values of theses objects afterwards GoNorth will reset the implemented flag and show you which values where changed:

Implementation Status Tracking

This way its much easier to keep track of the integration progress and not forget changes.
More details can be found in the wiki.

Task Management

A Kanban Board supporting different task types is integrated into GoNorth:

Task Management

More details can be found in the wiki.

Technology

GoNorth is implemented using .Net Core for the backend. Since .Net Core provides cross-plattform support you can host the portal on Windows, Linux and Mac OS.
To store the values GoNorth currently uses a MongoDB System. Since GoNorth uses dependency injection and all database access is done through an interface it is possible to integrate a different database system. More details on this topic can be found in the wiki.
Knockout is used for the frontend together with Bootstrap. The whole frontend is optimized for a responsive layout.

Browser Support

I've tested the web application using Chrome and Firefox. The portal might have problems running under Internet Explorer since this is a hobby, spare time project and I did not want to bother with all the Internet Explorer problems.

Plans for the future

The next steps which I will implement in the future are:

  • Usability improvments
  • I am very open for feature requests and good ideas

License

GoNorth is open source and released under the MIT LICENSE.

Copyright (c) 2018, 2019, 2020, 2021, 2022, 2023 Steffen Werhahn, former Noertershaeuser.

Acknowledgement

GoNorth uses the following libraries:

gonorth's People

Contributors

alekratz avatar dependabot[bot] avatar jsnee avatar karl-barbour avatar steffendx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gonorth's Issues

[Feature Request] Karta zoom/size

Using any resolution images in karta seems to result in a similiarly small tile that, when loaded initially is pretty tiny (fully zoomed out) and somewhat unreadable when filled with markers.
As it seems to stay approximately the same size (2048 is almost the same as 128), maybe initially load it with a zoom that makes it fit the frame or something similar.

Unable to run Deployment First run from Docker

I ran the command docker-compose up to bring up the web app. After the docker machines are brought up, I was able to navigate to http://localhost:5000 and saw the login screen. I set a password in appsettings.json for "FirstTimeDeploymentPassword," I then went to http://localhost:5000/Deployment. I keep getting a 500 response with the app console reading:

web_1    | warn: GoNorth.Controllers.DeploymentController[0]
web_1    |       User tried to access first time deployment page while not valid.

Any idea on what can resolve this?

Attached is a screenshot with my current docker version running on macOS 10.13.3 (17D47).

screen shot 2018-02-27 at 14 25 59

Document docker deployment, diligently

Couldn't resist the alliteration.

I figured I'd make an issue for this so it doesn't fall off of the radar (mine, or anyone else's). Although docker exists for this repo, Github's wiki system is not friendly to contributions. Once the documentation repository, website, or directory gets created, I plan on making those changes ASAP.

[Feature Request] Map marker export with coordinates

I can see that the movement targets for the daily routine events has latitude and longitude like so:

"MovementTarget": { "MapId": "84b13232-7897-44fb-a7de-2d35aa651430", "Lat": 55.379112, "Lng": -65.03201, "Name": "testEvent", "ExportName": "testEventMarker" },

in the NPC export.
As such, it would be good to attach these coordinate variables to marker exports. I think the easiest place to do this is just add it as fields to the marker exports along with the ID of the marker and map (such as adding to the actionData for actions):

"ActionData": "{\"mapId\":\"84b13232-7897-44fb-a7de-2d35aa651430\",\"markerId\":\"7cee098b-b36a-4c80-880c-92f36d0ff0cc\",\"markerType\":\"Note\",\"movementState\":\"\"}",

However, a better way might be to export the map in terms of marker exports with their types similar to the movement target above and we just use the Ids to link them. This would be extremely useful for things like auto-generating maps from this export and using coordinates to place items/npcs. Something like:

mapID: <string>, markers: [ {markerType: <string>, markerId: <string>, lat: <float>, lng: <float>, exportName: <string> }, .... ] }

While the map and marker Id's can be exported, however, to my knowledge, there isn't a way to use it without manually creating objects and copy-pasting Id's.

Empty Screen.

I've followed the directions, went perfectly smooth. I go to localhost:5000 and all I have is a screen that has "Welcome to Project ". Nothing else.
BlankScreen

JSON Export for NPC's

With the NPC export, under dialogs, how do you know which is the first node to interact with?

In the export array I'd expect a field start or first_node with the uuid of the node, how else do you tell which is the first dialog to appear? Is it that links[][0] is always the first step in a dialog and then you connect the nodes from there?

Improve linking towards other components from quest & dialogue boards

Hello again!

I come with another improvement to propose; hopefully you don't mind. We like this tool and we hope to share some of our thoughts with you on how we can improve it.

During our time with GoNorth, we currently notice how something is missing which we think could add value. Basically, we'd like to propose workflow improvements to making quests & dialogue. I'll elaborate below.

When designing a quest, there's naturally multiple steps to go through. Most noticeably, during a single quest, there may be several dialogues. Currently the dialogue board and quest boards are fully separate, which can remain as it, but I think workflow wise there could be an improvement where we could link / reference between the two.

For example, let's say I'm designing the "My awesome quest" quest. During this awesome quest, we have five dialogue sequences. Workflow wise, it's is rather tedious to go back and forth between this quest and the dialogues, having to manually look for these entries. We propose to add something like a generic "link box" (similar to Player line, NPC line, Choice, Action and Condition boxes) in which one could create a direct reference to a quest, another dialogue, or even things like items. This box could be used in both quest boards and dialogue boards, because both have their use cases for referencing something.

I hope I'm not asking too much, but when linking between quest boards and dialogue boards (and visa versa), we're hoping it would also be possible to link to a specific box within these boards, and have the screen automatically center / focus on said box.

If you find it useful, below are some user stories I could think of if this helps;

  • As a user, I want to have a link/reference box in the quest board, so that I can reference and navigate to referenced items, NPCs, other quests, dialogues, skills, .... and improve my workflow efficiency.
  • As a user, I want to have a link/reference box in the dialogue board, so that I can reference and navigate to referenced items, NPCs, quests, dialogues, skills, .... and improve my workflow efficiency.

Please share us your thoughts.

Feature request: Being able to color notes on map views

Hello again,

Today I come with a small feature request; being able to specify a color when creating a note on the map view. Currently they are all white. When having a large number of these notes, it may become difficult to navigate. Having the ability to color these notes would allow users to give each note its own category. This could make navigation on maps with lots of notes considerably easier.

Still rocking GoNorth internally!

Would love to hear back

Publish executable releases for installers and/or portable versions of the app (e.g., via GitHub Actions)

As you've probably noticed, multiple people have remarked on the setup process being too complicated and error-prone. As a potential user, I'd also agree that there should be a very simple way of running the application locally that "just works ". The possibility of things not working aside, it should also be very fast to get started since otherwise some users won't bother giving the app a try.

Where I'm unsure is in how far there exist tools to create this for the technology you're using. Once that's been researched, you could set up a build pipeline to automatically attach the installer/portables to each release.

That part I've recently set up myself, using GitHub actions, which seems to be the simplest method of doing this. I could provide some assistance since I still remember most of the details :)

Feature: Autosave, save shortcut or local storage progress

Hello again,

Today, I bring forth another feature request we'd like to propose after extensively using GoNorth. We've noticed that, currently, there is no auto save feature, nor any temporarily saving based on local storage for instance. When building content end to end (NPCs, monsters, skills, quests, dialogue), and having many tabs open as a result, one will likely accidentally close the page or navigate to a different page. Doing either of those causes all unsaved progress to get lost.

I'd like to propose a few options to improve the overall saving functionality & workflow. There are a few options, which I'll elaborate below;

  • As a content creator, I want to have an auto save feature, so that I don't lose major progress when forgetting to use the button

A lot of modern web-based content editing software has an autosave, shortcut or local storage implementation. It has come to an unfortunate surprise to some of my team members that GoNorth currently does not have any of these, resulting in a bit of work getting lost.

  • As a content creator, I want to have a save shortcut (such as CTRL+S) to save my document, so that I don't have to remove my hand from the keyboard towards my house

While nothing major, a small addition could include a shortcut to save. I can imagine that, while working on the larger pages, writing out wiki's, quest setups or dialogue flows, one doesn't want to manually use the mouse to press the save button. A short-cut to save could be a small improvement to workflow.

  • As a content creator, I want to have unsaved progress be saved in the browser's local storage, so that even if I don't save, the progress is still kept after accidentally navigating to a different page or closing the page entirely

Perhaps the most important one; when auto saving is not an option (which currently there isn't yet), most users would expect their progress to be saved in the browsers local storage. This allows them to swap pages, close tabes, close the browser entirely, and they would still have their work-in-progress changes. This feature naturally does not replace the save functionality all together, but can greatly help a user in preventing loss of work.

As always, we are currently very pleased with GoNorth and we hope you'll consider these three features. Would love to hear back from you.

[Enhancement] adding page for monster

I would like to suggest that adding some pages for monster data will be helped in documenting. it's the same as NPC or items but focusing on monsters.

[Feature Request] Hiding children nodes

Creation of very large number of nodes can become quickly overwhelming, even with the navigation window at the top left. Being able to hide all child nodes from any parent could be very helpful in organizing the node graph.

Especially since I'm writing dialogue for the player per chapter, grouping nodes and hiding them under a specific node (a reference to the chapter for example), would make it easier to focus on another branch.

[NotAnIssue] Upgrading note

Just wanted to leave that here in case anyone else stumbles upon this too: when upgrading from 1.0 to 1.1 i was missing the new Evne module. I figured out that i had to assign the new roles to my account in the admin panel (and it only appeared after logging out and in again, refresh didn't do it).

Feature request: Export quests

Happy new year!

It seems that GoNorth has a set of export features, combined with a scripting language, which can allow anyone to create a smoother end-to-end integration from design into actual game implementation. This is very awesome. What we did notice is that quests are currently excluded from this, as we do not see the same functionality being available there.

We would like the export & scripting capabilities to be extended into quests, so that we can create our own export script and optimize our design to implementation flow. Is there any possibility in getting this added?

Bug / improvement: Lock times are too long

Hello!

I want to start off by stating that this is a wonderful peace of software, and we're very pleased with some testing we have given it the past couple of days.

While our testing, we did notice that some page locks were very long. We we're testing it out with several users. Even though these users closed the page in question, and clicked around in other pages of GoNorth, all the pages visited before this remained locked for a pretty extensive time (we didn't explicitly count, but could've been 15 minutes easily). Especially when trying to work on a large map with several people, this becomes quite the issue.

Please let me know if this is intended or not. Perhaps some kind of lock time configuration setting could be added, or perhaps going to a different page will unlock the previous one.

Let me know, and thanks again for making this great software!

Bug: Text doesn't properly scale with zooming in and out

Good day,

When zooming in and out, in the quest and dialogue box view, the text does not scale together with the boxes. The text seems to always remain the same size. In larger quests and dialogues, where zooming out would be very useful, the feature becomes unusable because the text doesn't scale down with the boxes, resulting in text falling behind the borders of the box and not being readable anywhere.

Another small annoyance that we noticed together with this; when zooming in and out, the zooming doesn't happen on the cursor, but rather the top left of the screen. It makes zooming in and out on specific locations rather difficult, and requires the user to also active move towards the right position during the zooming action.

Currently we run v1.8.1.0. Have not updated yet to the latest version, but I don't see any mention of this issue in the history, so I assume this issue is still there.

Still loving the software; keep it up!

Feature request: Word count in dialogue and quest boards

Hello!

Best wishes for 2021! I come again today with a proposal, which I hope can be added to the base product.

What I come to propose today is a small feature to add a word count on quest (text boxes) and dialogue boards. Allow me to explain the use case, as I can imagine that this doesn't seem very useful at first glance.

When building a game, one may hire contractors to do small parts of the game. For example, side quests. These contractors are commonly paid on a per-word basis. When someone, as a contractor, builds a side quest, then the payout of this is done based on the amount of words in that quest and/or dialogue. Currently, we didn't find an easy or straight forward way to simply count the words, hence why I'd like to propose this improvement. Alternatives, such as ArcWeave, do have this functionality (but are in return missing a lot of functionality that GoNorth does offer).

Please refer to the below user story if this adds further clearance;

As a project manager / team lead, I would like to be able to see a word count on quest and dialogue boards, so that I can easily calculate contractor payouts for quests/dialogue that this person worked on.

Please share us your thoughts.

[Feature Request] Concept map editor?

Hello! What do you think about adding a simple tile map editor to the Karta module?
I think it can be useful for people. Making maps in a different app is an option too, but after that we need to make map img, and modify map everytime we want to change something.

It's just a loose idea, I believe that it would be hard to implement.
Something like this: https://www.mipui.net/app
Example Map.

[Feature Request] Thumbnails/Size Reduction for Pictures

is there any chance we could have a feature for when you upload an image to items or (soon to be) categories, it can run image-magick(or another library) to reduce the size? (to 300x300) etc. I've been utilizing some place holder images that are quite large in size (2mb+).

Pulling several mb and many requests across the web can be slow.

Storing the original image is important and will still need the ability to download the fullsize image(on demand?).
but for when I'm on Item screens, they should be thumbnails of very small size.

Karta Map Marker Links Not Switching Map

When placing a Karta marker on a map in the Karta module, clicking on the marker title link doesn't cause the map to switch.

Note: I think the root problem was that with the change from hash to query notation, Map.KartaMarker.prototype.loadContent wasn't updated.

Removing non-empty chapters

Currently, removing a chapter with the 'x' button removes it from the canvas, but clicking save afterwards just spits out errors if it was not empty when removing. It should not be removable when being non-empty (maybe print an error at this point). Or if possible give a confirmation dialog with the option to force remove it (i guess this needs more work with handling missing references/cleanup etc. but could be nice to have)

[Enhancement] Additional Nodes

Looking to see if it would be possible to add more actions that are player oriented.

1: Player speak to NPC - enables the ability to view NPC data as well as get the outcome of the interaction, whether it be conversation, updating objectives, or quest completion.

2: Player Interact - enables the ability to target a location or item objective.

Additionally - It would be nice to have smarter Location, NPC, and Item nodes to be used in the Node editors as referencing objects/items/npcs feels overly nested and difficult to follow when replicating into non-importable sources.

Antiforgery deserialization token error

After updating to the latest release (1.8.1.0), I'm seeing this error in the console, and it might explain why the map and quest page is empty for me. I don't see anything specifically mentioned in the update log. Did I miss anything?

      An exception was thrown while deserializing the token.
      Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The antiforgery token could not be decrypted.
       ---> System.Security.Cryptography.CryptographicException: The key {3f9a4971-7bcb-4458-a3a7-bfb6ca1b6644} was not found in the key ring.
         at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
         at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
         at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
         at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
         --- End of inner exception stack trace ---
         at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
         at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.GetCookieTokenDoesNotThrow(HttpContext httpContext)```

docker builds appear to be failing

I'm trying to rehome my laptop install of gonorth to a server so I can use it less tethered to one machine but am running into issues. I've tried cloning over the gonorth install from my laptop and rebuilding with that i end up with the below but am allowed to login (all data appears to be missing however):

sudo docker-compose up
Creating mongodb ... done
Creating gonorthlaptop_web_1 ... done
Attaching to mongodb, gonorthlaptop_web_1
web_1      | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
web_1      |       No XML encryptor configured. Key {04d4c90c-d6dc-4b55-bfa0-6c40efb0afff} may be persisted to storage in unencrypted form.
web_1      | Hosting environment: Production
web_1      | Content root path: /app
web_1      | Now listening on: http://[::]:80
web_1      | Application started. Press Ctrl+C to shut down.
web_1      | fail: Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery[7]
web_1      |       An exception was thrown while deserializing the token.
web_1      | System.InvalidOperationException: The antiforgery token could not be decrypted. ---> System.Security.Cryptography.CryptographicException: The key {bdcb965b-99ac-4e9b-836e-b81d840227bc} was not found in the key ring.
web_1      |    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
web_1      |    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
web_1      |    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
web_1      |    at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
web_1      |    --- End of inner exception stack trace ---
web_1      |    at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
web_1      |    at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.GetCookieTokenDoesNotThrow(HttpContext httpContext)

If I try to start from scratch and just copy over the dbdata i get a much longer series of errors:

GoNorth]$ sudo docker-compose up
Creating mongodb ... done
Creating gonorth_web_1 ... done
Attaching to mongodb, gonorth_web_1
web_1      | warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
web_1      |       No XML encryptor configured. Key {6a1b47d2-7348-42b8-9689-2fb2b1e720c9} may be persisted to storage in unencrypted form.
web_1      | Hosting environment: Production
web_1      | Content root path: /app
web_1      | Now listening on: http://[::]:80
web_1      | Application started. Press Ctrl+C to shut down.
web_1      | fail: Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery[7]
web_1      |       An exception was thrown while deserializing the token.
web_1      | System.InvalidOperationException: The antiforgery token could not be decrypted. ---> System.Security.Cryptography.CryptographicException: The key {04d4c90c-d6dc-4b55-bfa0-6c40efb0afff} was not found in the key ring.
web_1      |    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
web_1      |    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
web_1      |    at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)
web_1      |    at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
web_1      |    --- End of inner exception stack trace ---
web_1      |    at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
web_1      |    at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery.GetCookieTokenDoesNotThrow(HttpContext httpContext)
web_1      | fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[0]
web_1      |       An unhandled exception has occurred: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/mongo:27017" }", EndPoint: "Unspecified/mongo:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address
web_1      |          at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
web_1      |          at System.Net.Dns.ResolveCallback(Object context)
web_1      |       --- End of stack trace from previous location where exception was thrown ---
web_1      |          at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |          at System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult)
web_1      |          at System.Net.Dns.EndGetHostAddresses(IAsyncResult asyncResult)
web_1      |          at System.Net.Dns.<>c.<GetHostAddressesAsync>b__25_1(IAsyncResult asyncResult)
web_1      |          at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
web_1      |       --- End of stack trace from previous location where exception was thrown ---
web_1      |          at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |          at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |          at MongoDB.Driver.Core.Connections.TcpStreamFactory.<ResolveEndPointsAsync>d__10.MoveNext()
web_1      |       --- End of stack trace from previous location where exception was thrown ---
web_1      |          at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |          at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |          at MongoDB.Driver.Core.Connections.TcpStreamFactory.<CreateStreamAsync>d__4.MoveNext()
web_1      |       --- End of stack trace from previous location where exception was thrown ---
web_1      |          at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |          at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |          at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
web_1      |          --- End of inner exception stack trace ---
web_1      |          at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
web_1      |       --- End of stack trace from previous location where exception was thrown ---
web_1      |          at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |          at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |          at MongoDB.Driver.Core.Servers.ServerMonitor.<HeartbeatAsync>d__27.MoveNext()" }] }.
web_1      | System.TimeoutException: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/mongo:27017" }", EndPoint: "Unspecified/mongo:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address
web_1      |    at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
web_1      |    at System.Net.Dns.ResolveCallback(Object context)
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Net.Dns.HostResolutionEndHelper(IAsyncResult asyncResult)
web_1      |    at System.Net.Dns.EndGetHostAddresses(IAsyncResult asyncResult)
web_1      |    at System.Net.Dns.<>c.<GetHostAddressesAsync>b__25_1(IAsyncResult asyncResult)
web_1      |    at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.Core.Connections.TcpStreamFactory.<ResolveEndPointsAsync>d__10.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.Core.Connections.TcpStreamFactory.<CreateStreamAsync>d__4.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
web_1      |    --- End of inner exception stack trace ---
web_1      |    at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.Core.Servers.ServerMonitor.<HeartbeatAsync>d__27.MoveNext()" }] }.
web_1      |    at MongoDB.Driver.Core.Clusters.Cluster.ThrowTimeoutException(IServerSelector selector, ClusterDescription description)
web_1      |    at MongoDB.Driver.Core.Clusters.Cluster.WaitForDescriptionChangedHelper.HandleCompletedTask(Task completedTask)
web_1      |    at MongoDB.Driver.Core.Clusters.Cluster.<WaitForDescriptionChangedAsync>d__50.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.Core.Clusters.Cluster.<SelectServerAsync>d__43.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.MongoClient.<AreSessionsSupportedAfterSeverSelctionAsync>d__37.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.MongoClient.<AreSessionsSupportedAsync>d__34.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.MongoClient.<StartImplicitSessionAsync>d__26.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.MongoCollectionImpl`1.<UsingImplicitSessionAsync>d__91`1.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at MongoDB.Driver.IAsyncCursorSourceExtensions.<FirstOrDefaultAsync>d__5`1.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at GoNorth.Data.User.UserMongoDbAccess.<GetUserByNormalizedUserName>d__6.MoveNext() in /app/Data/User/UserMongoDbAccess.cs:line 80
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at GoNorth.Authentication.GoNorthUserStore.<FindByNameAsync>d__7.MoveNext() in /app/Authentication/GoNorthUserStore.cs:line 96
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
web_1      |    at Microsoft.AspNetCore.Identity.SignInManager`1.<PasswordSignInAsync>d__34.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at GoNorth.Controllers.AccountController.<Login>d__14.MoveNext() in /app/Controllers/AccountController.cs:line 132
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__10.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeInnerFilterAsync>d__14.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextResourceFilter>d__22.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeFilterPipelineAsync>d__17.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeAsync>d__15.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.<Invoke>d__6.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.<Invoke>d__4.MoveNext()
web_1      | --- End of stack trace from previous location where exception was thrown ---
web_1      |    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
web_1      |    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
web_1      |    at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>d__6.MoveNext()
^CGracefully stopping... (press Ctrl+C again to force)
Stopping gonorth_web_1 ... done
Stopping mongodb       ... done

Any thoughts on how to get this working?

[Feature Request] Export a quest

I think the real strength of GN as a lore/story building tool is that you can export the data in an easy way. I've already worked on being able to automatically generate characters purely off the NPC JSON, items and skills also.

I think its worth having one for quests. Currently it cannot be exported

Adding skills, npcs, and other things.

I go into the skills management screen. I click on "Create Template" and from there I proceed to create a skills. It doesn't show up. I'm honestly not sure what I am supposed to do, and I hate to use the "Issues" thread to ask for help.

Unhandled exception: The GuidRepresentation for the reader is CSharpLegacy

I'm working on a docker container for this so it can be prop'd up on a laptop easily (and technically a swarm? not there yet.) I've run into the following exception when attempting to use the 'configure database' option inside server administration (full error log):

gonorth_1  |       An unhandled exception has occurred: The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be UuidLegacy, not UuidStandard.
gonorth_1  | System.FormatException: The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be UuidLegacy, not UuidStandard.

Minified JS file incorrect case

the file projectManagement.viewmodel.min.js should be named
projectManagement.ViewModel.min.js

I built a new server today with the latest release, and this issue prevented me from created a project. I'm not sure if Windows and IIS ignores capitilization. But my combination of Firefox+Ubuntu Client & Server+Nginx as a proxy is particular about it.

I've fixed it myself, by renaming the file.

Now I can get stuck in :)

Redeploying Docker Drops Project Object Folders

After code updates are made, rebuilding and redeploying with docker-compose will discard all contents of the internal project folders (NpcImages, KirjaFiles, ItemImages, MapImages, TaskImages, SkillImages). This is presumably due to these folders being hosted completely within the docker container which is discarded following a build.

Feature Request: GoNorth Backup system

It would be very convenient to be able to backup/restore the GoNorth system in case of system failure. Do you have any suggestions on how this could be done?

[Feature Request] Pictures/Icons for Categories

This is primarily for the Items section, but could be for other parts of GoNorth.

A description field for categories would also be useful, and this could be viewed as part of a 'tooltip'/hovering over the category before clicking.

[Feature Request] Karta Labels title display

Currently Karta Labels only reveal their title when clicked like the other Markers. But for those especially it would be more fitting if they displayed it at all times, similar to a typical map label you can find on real world maps.
Otherwise (or maybe additionally :-) ) it would be nice to be able to assign them custom icons.

[Feature Request] Kirja (Wiki) Editor QoL Changes

I've been having some trouble with the editor used for the Wiki pages (Kirja). Most notably, I have difficulty removing formatting (heading styles) or a table of contents when set/inserted by accident. I have a few suggestions/thoughts:

  • My initial thoughts led me to try to update the 'bootstrap-wysiwyg' library to latest version of the actively developed fork (steveathon/bootstrap-wysiwyg). However, I found a few issues that hindered my ability to simply update the library. I noticed you appear to be using a customized version of bootstrap-wysiwyg and you introduced a localization transformations to the library.
  • My second thought is a suggestion for either introducing a toggle button to the editor that would allow direct modification of the underlying HTML (Similar to how you can using Summernote).

Feature request: annotate arrows / lines between nodes in quest and dialogue views

Good day once again;

I come today with a small feature request I hope you can consider. It's a small, but handy option. When making larger quests & dialogue nodes, it is sometimes unclear what the flow is between nodes is when there are multiple possible flows. We'd like to propose a small addition to both the quest and dialogue view, to be able to annotate (add text on) lines & arrows between nodes. With this, we should be able to easily specify what each flow means by annotating the lines.

In the form of a user story;

As a content creator, I want to be able to annotate the lines between quest & dialogue nodes, so that I can better clarify what each possible flow does or is caused by

I also want to mention that we are very happy and thankful for your continued support towards all of our feature requests & bug reports. Can we buy you a coffee or beer somewhere?

Usability - node canvas initial view with nodes

When placing nodes on the canvas while it is offset (Position not at 0,0), i.e. a large negative value, the next time the graph loads they are out of view and one could easily think it is empty (maybe a minimap could help?).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.