{"id":20118009,"url":"https://github.com/oscar-tark/squirrel-ees","last_synced_at":"2026-05-06T15:34:18.417Z","repository":{"id":44396972,"uuid":"125895098","full_name":"Oscar-Tark/Squirrel-EES","owner":"Oscar-Tark","description":"Squirrel Execution Engine Server","archived":false,"fork":false,"pushed_at":"2023-02-19T10:12:34.000Z","size":324834,"stargazers_count":2,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-25T18:15:32.845Z","etag":null,"topics":["csharp","database","dotnet6","executor","framework","ironpython","parsing-engine","server"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Oscar-Tark.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-19T17:24:41.000Z","updated_at":"2023-01-31T16:58:08.000Z","dependencies_parsed_at":"2023-02-16T10:46:29.756Z","dependency_job_id":null,"html_url":"https://github.com/Oscar-Tark/Squirrel-EES","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oscar-Tark%2FSquirrel-EES","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oscar-Tark%2FSquirrel-EES/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oscar-Tark%2FSquirrel-EES/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Oscar-Tark%2FSquirrel-EES/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Oscar-Tark","download_url":"https://codeload.github.com/Oscar-Tark/Squirrel-EES/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241564434,"owners_count":19982958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","database","dotnet6","executor","framework","ironpython","parsing-engine","server"],"created_at":"2024-11-13T19:09:09.049Z","updated_at":"2026-05-06T15:34:13.395Z","avatar_url":"https://github.com/Oscar-Tark.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![IMG](/dotnet/img/Cropped.png)\n\n[Squirrel EES:Quickstart Guide]\n-------------------------------------------------------------------\n[Tested only on Manjaro and Linux mint!]\n\nIs a framework that uses its own syntax in order to call functions of a defined c# accessibility level with a specific type of structure. You can also compile and link C# scripts to squirrel with functions you created in order to call them. Squirrel contains its own memory and XML-database system. Each function call is done on an isolated thread.\n\n!NOTE: Call the `manual` function in order to view all available manuals and runnable functions for squirrel. You may use the `manual::*manual_name` function to view a manual.\n\n[General syntax]\n---------------\n\n**Variables:**\n\n`\\*`   = Asterisk denotes a variable this refers to a defined variable that exists in the squirrel memory pool.\n\n`*''` = Denotes a value to use as a variable, This allows you to use values without adding them to the squirrel memory pool such as something that is temporary.\n\n`*f''` = Denotes a value variable which can be formatted. You may insert other variables into the current formatted value variable with the {(( ))} denotations.\n\n(Example):\n\n`vardictionary::*store \u003e\u003e vardictionaryappend::*store, *'store_name', *'My computer store'`\n\n`output::*f'Hello {((store[store_name]))}!`\n\n**Arrays**\n\nArrays can replace an existing variable and transport it's value into index 0 of the array or as an empty array. Arrays may initialize a new variable and set it as an array.\n\n`vararray::*name_or_existing, *if_existing_copy_value_into_new_array`\n\nDictionary variables can be manipulated or gotten using the inbuilt functions or by using index notation with multiple-depth/dimensions '[][][]..':\n\n`output::*array[7][54][8][0]`\n\n**Dictionaries**\n\nDictionaries act equally to arrays, except that they are arrays with key:value items. It a dictionary replaces a current array, there is no option to copy the current variable's value into the dictionary that substitutes it.\n\n`vardictionary::*name_or_existing`\n\nDictionary variables can be manipulated or gotten using the inbuilt functions or by using index notation with single-depth/dimension '[]':\n\n`output::*dictionary[key]`\n\n**String escape sequences**\n\nSince certain symbols may be used for command execution, we have come up with some escape sequences that allow you to use those symbols within your strings of data similar to escape sequences in C such as \\' for a single quote. Squirrel's escape sequences are abit different but the principal is the same. All escape sequences use the following format:\n\n`{\u0026escapee}`\n\nwhere 'escapee' is a character denoting the type of escape.\n\nHere they are:\n\n- {\u0026c} = ,\n- {\u0026v} = *\n- {\u0026q} = '\n- {\u0026r} = \u003e\u003e\n- {\u0026l} = \u003c\u003c\n- {\u0026d} = ::\n- {\u0026fl} = {((\n- {\u0026fr} = ))}\n\n**Multithread function calls:**\n\nAre made with the following syntax:\n\n`*return_var\u003c\u003cfunction::*var1, *var2...`\n\nThe first variable is a return variable. Any variable that the function returns will be shifted left and stored there, if you would not like a return variable to be stored or the function you are calling does not return a variable you may ignore this section. 'function' denotes the name of the function to call. :: denotes that you are sending variables as agruments to the functions and subsequently all variables seperated by commas. any extra variables sent that do not interest the function call will be ignored such as a function call that requires 2 arguments but gets passed 5. The last 3 wil be ignored\n\n(Example):\n\n`listvars`\n\n`var::*var1`\n\n`varset::*var1, *'Squirrels are SO misunderstood..'`\n\n**Same thread function calls:**\n\nSquirrel allows you to run multiple functions in one single thread. Squirrels execution is always left to right. To shift execution right on the same thread consecutively use the \u003e\u003e symbol.\n\n`var::*name \u003e\u003e varset::*name, *'Richard Stallman' \u003e\u003e output::*f'Hi {((name))}!. Let us play the GNU SONG!' \u003e\u003e exit`\n\nAll of the above functions will be executed one after the other. Without using \u003e\u003e functions are executed on seperate threads.\n\n[Scripts]\n---------------\n\n**Running Squirrel syntax scripts:**\n\nYou may run external files as scripts which contain various squirrel function calls delimited by newlines. You may call a script by sending a path argument to the function 'scriptrun', it is reccomended to not use an extension for filenames:\n\n`scriptrun::*'/home/user/myscript', *false`\n\nYou can also put other runscript calls inside of a script. *false (BOOL) is used to denote if all lines run on seperate threads or if every line is executed top down on a single thread.\n\n**WARNING!** Currently all function calls in a script will be called on the thread of the initial runscript function call. Multithreading for scripts is not yet supported.\n\n**Compiling C# scripts (mono_legacy only):**\n\nYou may compile a C# script and load it into squirrel by namespace and class. Be warned that Squirrel only supports loading one class at a time for each assembly load.\n\nSyntax:\n\n`asmcompile::*path, *namespacedotclass, *reference, *reference...`\n\nExample:\n\n`asmcompile::*'/home/myhome/test.cs', *'test.Test', *'System.IO', *'System.Threading'`\n\n[Loading C# scripts (mono_legacy only)]\n---------------\n\nIn order to use any compiled C# script we must load them into Squirrel. This will allow us to call any function within a class. Please note that loading a C# library only supports loading one class at a time from all assemblies, this means that in order to load multiple classes from one assembly is currently not possible.\n\nSyntax:\n\n`asmload::*path, *namespacedotclass`\n\nExample:\n\n`asmload::*'/home/myhome/test.dll', *'test.Test'`\n\n**Running C# script functions (mono_legacy only)**\n\nYou may now run a compiled function within a loaded assembly. This will allow you to call a function or a chain of functions. The beuty is that the sourcecoude can be modified recompiled and run on the fly. The current assembly must be removed from memory before loading in the new instance.\n\nSyntax:\n\n`asmcall::*path, *functionname, *arg, *arg...`\n\n[Processes]\n---------------\n\n**Running external processes**\n\nRunning and controlling external processes is important for various use cases. You cannot control a process that is already running. You may create a process, view its output, kill a process or kill all running processes. Processes can run fully controlled by Squirrel or can be started as a new seperate process outsode of Squirrel Input insertion is coming soon!\n\n**Starting an external process**\n\nSyntax:\n\n`process::*main_program_or_program_path, *arguments, *name, *isnotcontrolled`\n\nExample:\n\n`process::*'ping', *'127.0.0.1', *'mypingprocess', *false`\n\nThis example will run a ping process with the argument of '127.0.0.1'. false denotes that you would like the process to be controlled by Squirrel.\n\n**Viewing process output**\n\nViewing processoutput is important. By default processes have their own stdout instances so that they will not print their output onto the main stdout seperating output and evading clutter. In order to see a processes stdout you may call the 'processio' function.\n\nSyntax:\n\n`processio::*name`\n\nExample\n\n`processio::*'mypingprocess'`\n\n[Databases:XMLDB]\n---------------\n\nDatabases are based of the XML standard and are simple encrypted files on your hard drive for storing static data. Squirrel's XMLDB allows you to get, set and query data.\n\n**Creating a database:XMLDB**\n\nSyntax:\n\n`dbcreate::*dbpath, *password`\n\nExample:\n\n`dbcreate::*f'{((path))}/Databases/database.db', *'12345'`\n\n**Opening a database:XMLDB**\n\nDatabases can be opened by providing a path and a name which can be used to identify the database when working with it.\n\nSyntax:\n\n`dbopen::*dbname, *dbpath, *password`\n\nExample:\n\n`dbopen::*'mydatabase', *f'{((path))}/Databases/database.db', *'12345'`\n\n**Closing a database:XMLDB**\n\nSyntax:\n\n`dbclose::*dbname`\n\nExample:\n\n`dbclose::*'mydatabase'`\n\n**Saving a database:XMLDB**\n\nAlways remember to save changes before closing or reloading a database, if you do not all changes will be lost. It is reccomended to create a script that saves your database state every few minutes if the database is an active one.\n\nSyntax:\n\n`dbsave::*dbname, *password`\n\nExample:\n\n`dbsave::*'mydatabase', *'12345'`\n\n**Reloading a database::XMLDB**\n\nIf you want to loose any changes made or want a fresh copy of a database in its previously last saved state you may reload a database.\n\nSyntax:\n\n`dbreload::*dbname, *password`\n\nExample:\n\n`dbreload::*'mydatabase', *'12345'`\n\n**Querying data in XMLDB**\n\nXMLDB is mostly reccomended as a static database for storing string data that you'd like to use later on. This can be HTML for a website which you can then process with formatted strings or image links. Data must be only in a string format. Saving images or videos may not work and will corrupt a database you may test it at your own perrill.\n\nAll data in XMLDB is represented by the following characteristics:\n\n- tag : A group to which many data elements can belong to (Example: you as a person, a car or any class or classification of data)\n- subtag : What does your data represent within the tag or classification of data (Example: your name or age)\n- data : Contained data\n\n**Getting data:XMLDB**\n\nYou may get data in XMLDB using either tags or/and subtags or/and data. If you do not have the value of one of them say you are fetching data relating to 'Tag:John Doe' but don't know what data is contained, you may pass the `*null` value as a parameter, all parameters are nullable. All queries return an array.\n\nSyntax:\n\n`*return_var\u003c\u003cdbget::*dbname, *data|OR NULL, *tag|OR NULL, *subtag|OR NULL`\n\nExample:\n\n`*result\u003c\u003cdbget::*dbname, *null, *'first_name', *null`\n\n**Getting all data:XMLDB**\n\nYou may also get all available data from an XMLDB database, this will be returned as an array.\n\nSyntax:\n\n`*return_var::*dbname`\n\n**Setting data:XMLDB**\n\nYou may insert but not update data in XMLDB, hence we reccomend using XMLDB mostly for static data such as containing a webpage.\n\nSyntax:\n\n`dbset::*dbname, *data, *tag|OR NULL, *subtag|OR NULL`\n\nExample:\n\n`dbset::*dbname, *'\u003cp\u003eWelcome!\u003c/p\u003e', *'www.mywebsite.com', *'HTML'`\n\n**Deleting data:XMLDB**\n\nData may be deleted in XMLDB using the query syntax allowing you to delete one or more elements partaining to a tag or subtag. Deleting all elements with a subtag deletes the subtag, deleting all elements with a tag deletes that tag.\n\nSyntax:\n\n`dbdelete::*dbname, *data|OR NULL, *tag|OR NULL, *subtag|OR NULL`\n\nExample:\n\n`dbdelete::*dbname, *null, *'first_name', *'John Doe'`\n\n**Updating data:XMLDB**\n\nData just as it may be inserted it may also be updated:\n\n`dbupdate::*dbname, *tag, *subtag, *new_data`\n\n**Listing all open databases:XMLDB**\n\nYou may view a list of all open databases by using the following commands:\n\n- `listdbs`\n- `ld`\n\n**Editing data using an external editor**\n\nData can be edited using an external editor of your choice. Each data entry will open a seperate tab or window depending on the editor:\n\n`xmldbedit::*dbname, *password, *string tag, *string editor_bin_name, *string subtag_or_null`\n\n[Databases:MYSQL]\n---------------\n\nIt is imperative that you have already set up a database and a user for your MYSQL instance in order to use Squirrel with it. Squirrel has a limited number of functionalities it can perform with MYSQL at the moment. This will be expanded in future releases to include fullscale MYSQL integration.\n\n**Creating a new MYSQL connection string**\n\nYou may create a mysql connection string on your own and store it in a variable, type it out as a value variable. Squirrel allows you to automatically create a new mysql connection string and store it within a Squirrel variable as a returnable variable.\n\nSyntax:\n\n`*return_var\u003c\u003cmysqlcreatestring::*host|OR IP, *port|OR '3306', *database, *user, *password`\n\nExample:\n\n`result\u003c\u003cmysqlcreatestring::*'localhost', *'3306', *'mydatabase', *'user', *'12345'`\n\n**Creating a new mysql table in the default format**\n\nYou may create a new mysql table from squirrel in it's default format or so in the XMLDB format. In order to simplify the way squirrel databases store data squirrel will automatically generate specific columns:\n\n- id : An identifier for every row\n- tag : A group to which many data elements can belong to (Example: you as a person, a car or any class or classification of data)\n- subtag : What does your data represent within the tag or classification of data (Example: your name or age)\n- data : Contained data\n- token : Contains a squirrel based token for creating user based applications. The token can be used to verify that the user belongs to a specific user\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscar-tark%2Fsquirrel-ees","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foscar-tark%2Fsquirrel-ees","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foscar-tark%2Fsquirrel-ees/lists"}