From 0.1.0 Beta 1 to 0.1.0 Beta 2
Guide for upgrading 0.1.0 Beta 1 mods to 0.1.0 Beta 2
This page lists all the changes that have been made from 0.1.0 Beta 1 to 0.1.0 Beta 2. For upgrading your mods from 0.0.24.x directly to the 0.1.0 series, use the main upgrade page where it highlights the most important changes.
From Beta 1 to Beta 2
During Beta 2's development, we have made the following breaking changes:
Employed ColorPrint.Core
for color wheel
ColorPrint.Core
for color wheelThe color wheel was implemented in the kernel to allow color selection. However, it lacked features such as the color blindness simulation, so we decided to make an entirely new library dedicated to this. As a result, we've replaced the kernel's implementation with ColorPrint.Core
, which is more portable and easier to use.
Merge your calls to the ColorWheelOpen
class to ColorPrint.Core
as it's easier to use and more portable than the former class.
Removed the country-based RSS feed selector
The feed selector used to prompt you for a country so that you can select a feed according to the minimal list of known RSS feeds operating from the selected country. Recently, we've discovered many broken links (404's) across many feeds, so we decided to remove it as the source was out of date.
Its functionality will be replaced with the bookmarked feed selector. Meanwhile, it's advisable to stop using this function on your mods.
Removed UseCtrlCAsInput
from ReadLine()
's
UseCtrlCAsInput
from ReadLine()
'sUseCtrlCAsInput
used to tell ReadLine.Reboot to treat Ctrl + C
as input to try to aid in cancelling prompts. Apparently, that library was deprecated and replaced with TermRead. As a result, this feature is removed.
We advice you to cease using this variable in the above functions.
Removed SaveCurrDir()
SaveCurrDir()
This function used to save the current directory value to the kernel configuration file stored in the %LOCALAPPDATA%/KS/KernelMainConfig.json
for Windows or the $HOME/.config/ks/KernelMainConfig.json
. Following the recent improvements in the configuration system that took place two times during 0.1.0's development, the SaveCurrDir()
function was effectively reduced to a single call to the Config.CreateConfig()
function, which already deals with this kind of change, rendering this function useless. As a result, we decided to remove this function as it added no value and was just an extraneous wrapper function.
If you want to save the current directory value in the future, please use the kernel settings application to save the configuration. Programmatically, you'll have to call the Config.CreateConfig()
function instead of the two above functions.
Group system and the User Management API
We've added a real group system to the KS.Users namespace under Groups in order to group the users and give them shared permissions. In consequence, we had to rework the user management system, causing several API removals.
The following functions were documented:
LoadUserToken()
: Tries to manually deserialize the user configuration JSON file to be usable with all the user management functions.InitializeSystemAccount()
: Tries to initialize a root account with a defined password from the same user token.GetUserProperty()
: Gets a user property as a JSON token, JToken, which has to be manually cast to either a string, boolean, or array of strings.SetUserProperty()
: Sets a user property, taking an uncasted JSON token that represents either a string, boolean, or array of strings.
The first two functions were removed, because they were deemed to be unnecessary for a long time. A re-work to the user management API made it reasonable to remove these functions.
However, the last two functions were removed because it was found to be complicated for having to cast to their appropriate types manually. We also removed the ability to directly set a user's properties security-wise.
Because the user management API reached to a stage when it was re-written to simplify things, we advice you to cease using these functions.
Initial implementation of the TUI
The following classes are affected:
The following functions are affected:
The three CLIs used to implement their own CLI based on data for contacts, kernel threads, and files respectively. Now, with the introduction of the IInteractiveTui
interface and the BaseInteractiveTui
class, we've made the three above classes implement both the classes, removing the static
modifier from the three CLIs.
As a result, we've removed the OpenMain()
function from all of them. However, you can still open the CLI as follows:
This removal was necessary to avoid code repetition, effectively making maintenance easier.
If you want to open the three CLIs, refer to the above code snippet about the usage of OpenInteractiveTui()
.
Added warning reports to the splash interface
The splash reporter used to only report the progress and the error messages during the kernel startup. Now, we've added warnings to extend the possibility of accurately reporting warnings without having to rely on special conditions on the progress report.
Mods that implement splashes now have to implement the above function to be able to report warnings.
Added ReadToEndAndSeek()
to filesystem driver
ReadToEndAndSeek()
to filesystem driverAs part of the removal of Extensification dependency from Nitrocid KS as a result of its deprecation, we decided to adapt the kernel to remove all references to Extensification and re-implement things. The commit states:
Since this library is deprecated starting today, we've removed all references to Extensification by updating all libraries and making necessary changes to the API to restore the used Extensification functions to
TextTools
,IntegerTools
, andStreamRead
. Custom filesystem drivers in your mods will now have to implementReadToEndAndSeek()
to be compatible with this revision of N-KS, so we've increased the mod API version to3.0.25.7
.
Mods that implement filesystem drivers now have to implement the above function to be able to be installed on N-KS mod API 3.0.25.7 or later.
Removed ConsoleWrapper.WindowTop
ConsoleWrapper.WindowTop
Console.WindowTop
is always 0 on both the Windows and the Unix operating systems, but you can set this value only on Windows systems, which kills the potential of cross-platform. This is deemed unnecessary for most of the things, which makes it redundant, so we've removed this function from both the ConsoleWrapper
and the Console
driver.
We advice you to replace all instances of this function from ConsoleWrapper
with 0
, and remove all implementations of this property from all your Console
drivers.
Converted string char variables to chars
The above char variables used to hold only one character, but they were defined as strings instead of chars, so users made it possible to place more than one character to these variables. Usually, the handlers only take the first character from the string.
Since the config entries defined these variables as configurable under the SChar
type, the config app made enough checking to make sure that only one character can be input. This caused us to convert all these variables to strings, affecting the following classes:
NotificationManager
Notification
BarRotSettings
IndeterminateSettings
ProgressClockSettings
RampSettings
BorderTools
ProgressTools
The following writers are also affected and are found to be using characters as strings before the change:
WriteBorder()
andWriteBorderPlain()
WriteBoxFrame()
andWriteBoxFramePlain()
WriteInfoBox()
andWriteInfoBoxPlain()
WriteProgress()
andWriteProgressPlain()
WriteVerticalProgress()
andWriteVerticalProgressPlain()
For mods that treat characters as strings and use one of the above classes and variables that hold only one character, you'll have to refactor the logic to treat these characters as chars. However, if you use char variables and convert them to string in either the writers or the char variables, such as CustomLowerLeftCornerChar
, you'll no longer need to convert your char variables to strings.
Added finding files using regular expressions
The following functions are added to the filesystem driver:
This function gets all the filesystem entries found under the specified parent directory, with the regular expression pattern. This uses the regular expression driver to handle the regex work.
Mods that implement filesystem drivers now have to implement the above function to be able to use it. It's also advisable to use the regex driver in the function implementation.
Removed configurable maintenance mode
Long ago, we used to allow users to force the kernel to maintenance mode upon setting this value right from the configuration application. However, this can be abused, so we decided to remove it as a configuration entry, but the mode itself stays. You can still run the kernel in maintenance mode by passing maintenance
as a command line argument to Nitrocid's entry point. Refer to the below page for more information:
We advice you to cease using this flag. Maintenance mode doesn't allow mods to load, anyways.
Migrated two speed dial types to one JSON file
To migrate two different JSON files holding speed dial entries for FTP and SFTP servers, we decided to replace FTPSpeedDial
and SFTPSpeedDial
with SpeedDial
and FTPSpeedDialPath
and SFTPSpeedDialPath
with SpeedDialPath
, effectively removing a function from SpeedDialTools
, GetPathTypeFromSpeedDialType()
, and the remaining functions removing the (SpeedDialType SpeedDialType)
signature, causing them not to take any speed dial type.
The commit said:
This migration is necessary to efficiently put speed dials to one JSON file as we have the Type key already in speed dial properties.
We advice you to replace all calls to type-specific enumerations and paths with a single speed dial enumeration value, SpeedDial
, and path, SpeedDialPath
, respectively. Also, we advice you to use the three functions that stay, but without the type, and cease using the GetPathTypeFromSpeedDialType()
function.
Added support for SwitchInfo
SwitchInfo
CommandArgumentInfo
and the UESH shell used to hold HelpUsage
classes to get info about help usages, but they didn't become aware of unknown switches, so we decided to split HelpUsage
to a string of command arguments and command switches, using SwitchInfo
as a class to hold help information for each switch, including the properties for each switch, like the requirement and the value requirement.
This causes us to remove all help helpers that hold info about the supported switches, especially since the later commands that do support switches didn't have their help helpers that tell the users about the command switches.
In consequence, CommandArgumentInfo
has been changed to hold only one constructor that holds both array of arguments and array of switch information class instances.
We advice you to use the below constructor to accommodate the above changes made:
An example is provided below:
Migrated text tools
As TextTools
matured with different string tools, we decided to migrate the following functions from their respective classes to that class under the KS.Misc.Text
namespace:
FormatString(string Format, params object[] Vars)
IsStringNumeric(string Expression)
As a result, we advice you to use the TextTools
class to execute the above two functions. Their signatures and behavior remains unchanged. This means removing any reference to the two classes found under the KS.Misc.Reflection
namespace.
Moved BannerFigletFont
to WelcomeMessage
BannerFigletFont
to WelcomeMessage
As this property doesn't have to do with the kernel tools, we decided to move from the KernelTools
class to the WelcomeMessage
class found under the KS.Misc.Writers.MiscWriters
namespace.
If you want to continue using this property, we suggest that you change the using KS.Kernel
line to replace the namespace with the KS.Misc.Writers.MiscWriters
namespace in order to be able to reference BannerFigletFont
under WelcomeMessage
.
Easier way to render info into the second pane
When we first introduced the interactive TUI feature, we had to leave the entire "rendering to the second pane" logic to your interactive TUI instance. However, since this involves having to wrap the informational pane and to work out the text lengths and console positions yourself, we've placed these requirements so that it's up to the handler to handle printing the information, effectively replacing the function above with GetInfoFromItem
.
It's now easier to render the information pane using just your text! Just form your final informational text by implementing the GetInfoFromItem
function to return said information. The function signature is found below:
Enhanced the screen locking feature
The screen locking feature was malfunctioning for a long time. Unfortunately, it went under the radar, so it wasn't looked at. We've finally managed to enhance the screen locking feature by checking our heuristics. Moreover, we had to separate the ShowPasswordPrompt
function from trying to log the user in, as this was the requirement in enhancing the screen lock, since it was used by this feature.
The ShowPasswordPrompt
function now contains a return type of bool
, which returns true
if the password was valid or if the user database concluded that the password was empty, and false
if the password was invalid. The new signature is now:
Moved journaling related classes to KS.Kernel.Journaling
KS.Kernel.Journaling
We used to place all the journaling-related classes and tools to the KS.Kernel.Administration.Journalling
namespace, until we've found out that said namespace wasn't needed because we didn't have plans to add another namespace to the Administration
namespace, so we decided to move journaling-related classes to the KS.Kernel.Journaling
namespace.
To continue using these journaling classes, you have to change the using
statements to point to KS.Kernel.Journaling
.
Time and Date API enhancements
The TimeDate API was left untouched for a long time, and its structure was a bit too old for the modern API system that Nitrocid KS uses to be usable for mods and general purpose, so we have decided to create the following namespaces:
KS.Kernel.Time.Converters
KS.Kernel.Time.Renderers
KS.Kernel.Time.Timezones
KS.Kernel.Time
We have moved relevant functions according to their action to the above namespaces. For example, the Render()
function was moved to TimeDateRenderers
class in the Renderers
namespace.
We have also isolated the FormatType
enumeration from the TimeDateTools
class so that the mods don't have to reference the class name in order to access this enumeration.
Also, some functions like GetRemainingTimeFromNow()
have their return types changed from string
to TimeSpan
. To get a string, you must now use the RenderRemainingTimeFromNow()
function to continue using strings to render the remaining time from the current date and time.
To keep using these functions, you must now change the imports in relevant code files to KS.Kernel.Time
and its ancestors to be able to use their classes. You may need to adjust your usage of the functions and/or classes so that the behavior you're expecting remains unchanged.
Manual page parsing now uses the interactive TUI
The manual page viewer used to be so limited in features; you could only advance to the next pages of the manual and exit back to the shell. You had to specify the full manual page title after listing it with the -list
switch.
The migration of the viewer to the TUI required the following changes:
The above functions have their return values changed to a List<Manual>
type. It was done because we needed to store a kernel modification name inside the Manual
instance, so we have done the below changes:
The two above functions have changed their signature so they they take a mod name (string modName
) before every element.
The above function has its signature changed so that instead of the manual page name (title), it now takes an instance of the Manual
class to remove a selected manual page.
You should adjust the changes as necessary in order for your mod to continue working.
ChoiceOutputType
is now standalone
ChoiceOutputType
is now standaloneWe have separated the ChoiceOutputType
enumeration from the ChoiceStyle
class so that we can simplify its access. Now, you can access this enumeration directly; you don't have to append ChoiceStyle
before the enumeration so that it becomes easier for you to access.
You need to remove the ChoiceStyle reference and make it only reference the ChoiceOutputType enumeration so that your mods keep working. For example:
Breaking changes following the OpenConnectionForShell()
implementation
OpenConnectionForShell()
implementationIn order for OpenConnectionForShell()
to be able to distinguish the shells that accept the network connections from the shells that don't, we needed to add the above property to the interface implementation of the ShellInfo
class. The base class has been updated so that it implements the above property as false so that you don't have to override this property in the non-networked shells implemented either by Nitrocid or by your mods:
For most shells that don't connect to any network, you don't have to override the above property. Nitrocid KS 0.1.0 with API versions lower than 3.0.25.34 are unable to use ShellInfo
instances implemented for such versions.
Renamed Shell to ShellManager
The shell management module used to have just Shell
without the Manager
suffix, because it was introduced on 0.0.1, which was the first version of Kernel Simulator as a whole that released on February 22nd, 2018. You can view the historical representation of the shell management class by clicking on this link.
However, this naming has introduced problems for us because we needed to write Shell
twice before being able to write its function names for reference, which is messy. As a result, we had to rename this class to ShellManager
so that its access is easier.
We advice you to change the references to the Shell
class to use the ShellManager
class.
ColorTools
class renamed to KernelColorTools
ColorTools
class renamed to KernelColorTools
The ColorTools
class used to hold color tools which have to do directly with the kernel and its console driver so that it can manipulate with the colors, like setting the console color, setting the console background color, and so on.
However, it has been recently concluded that there is a class under the same name from the ColorSeq library, which caused us to have to add an extra imports clause to rename the ColorTools
class so that it doesn't conflict with ColorSeq's class.
We were being fed up of this, so we decided to rename the entire class to KernelColorTools
.
You no longer have to add the imports clause that would rename the abovementioned class. The clause that is to be removed looks like this:
All calls to the kernel's ColorTools
will now have to be called through the KernelColorTools
class. Example below:
Namespace movements
To better organize these namespaces, we decided to move them to more appropriate places outlined below:
First, the Execution
namespace had to do with executing processes, which was only being done by the shell and by the TMUX pane size detector. While it was referenced outside any shell code, we feel that it would be more appropriate to move it to the shell code.
Second, the kernel threading functionality got so mature that it was moved to the kernel code, showing that it really had great importance.
Third, all of the writers had to do with the console upon analyzing the namespace. As a result, we had to move them to the ConsoleBase
namespace so that it reflects the purpose more appropriately namespace-wise.
As for the scripting, the only code which was calling it was the UESH shell command parser, which was part of the shell. For this reason, we decided to move the namespace to better show that it was part of the shell code.
FInally, for the hardware code, it went straight to the kernel namespace as it felt that it's really a part of the kernel. The hardware code gets called each time the kernel starts and as the hwinfo
command gets executed.
You'll have to adjust the namespaces as indicated in the second code block that shows the new namespaces for your mod to continue working.
Moved JSON beautifier and minifier functions to JsonTools
JsonTools
These functions used to exist in their own namespace with their own classes that are categorized based on the JSON formatting type on serialization. However, JsonTools
looked like that it'd be the better place for them, so we've moved them into said class.
To continue using these functions, you'll now have to change the using clause to point to the KS.Misc.Editors.JsonShell
namespace and the class to JsonTools
.
Moved path lookup properties
These path lookup properties used to exist in the shell management code, which indicated that these variables were exclusive for the shell command parser. However, at the same time, PathLookupTools
existed, and we thought that it would be more appropriate to move these into that class, so we decided to move them into said class.
PathLookupDelimiter
has become a property, because it was included in the public API.
If you want to continue using these variables, we suggest you to change the class in all your references to them from ShellManager
to PathLookupTools
.
Removed the field manager
When this was implemented, we relied on it for kernel configuration to get the variable values by name from the kernel configuration declaration file (known as SettingsEntries.json and its ancestors for screensaver and splash settings).
However, following several configuration system improvements that occurred two times:
We've started working on the Reflection-based configuration reader and writer back at very early development stages by the following commits (in chronological order):
We've removed the Reflection-based configuration as it was deemed to be very slow, and replaced its implementation with the serialization-based approach. The first commit has extensive information about the two config system merges. The following commits were done in the chronological order:
With regards to the last breaking change, which was done by commit b96a724, the last "delimiter string variable" was changed from it being a field to it being a property, causing us to remove the entire field manager from the Reflection
namespace.
We advice you to cease using this class and its functions, especially since it's useless for public fields that will either get converted to properties or get removed (if any).
Last updated