Jump to content

Converting huge project from Au3 to multiplatform GUI application


Recommended Posts

Hello everyone,

Finally I decide to ask hard question about one of the project which I currently maintain:

Big World Setup aka mod installer for infinity engine games like BG, IWD, PST etc

Project page: https://bitbucket.org/BigWorldSetup/bigworldsetup/overview

More screenshot: https://forums.beamdog.com/discussion/44476/tool-big-world-setup-bws-mod-manager-for-baldurs-gate-enhanced-edition-trilogy-for-windows/p1

General Features

  • downloading mods (please see remarks!)
  • easy mod installation
  • correct install order of mods/components
  • handle mod and components conflicts and auto solve them
  • easy backup creation/restoring
  • ability to add you own mods

Internal Features (every single feature which you see here is already working in autoit)

Spoiler

Big World Setup features list for developing new version of it:

 

General guides:
- next version of Big World Setup should not be named "Big World Setup <something>"
- threat changing of the options by players as hacking of the pentagon
- ideally, next BWS should be developed using language which doesn't require compilation for rapid development/recreation of every important features of old BWS

 

What things next Big World Setup don't need:
- beautiful GUI:

 

Next BWS needs a GUI Framework which will be able to dynamically add/modify/remove mod components/provided values directly from the mod list in order to add new mod components directly via right-click at mod name > "Add new component"

 

Auto-Update of the main application:
- this should be the first feature which you should develop and test. Do not make the same mistake as 90% of application aka "we will develop auto-update later, now we will just point to archive download" - it will stay this way forever
- proper, best and flawless auto-update process, exactly the same which Spotify application has:

1. No popups, questions, confirmation dialog etc for auto-update
2. Application silently check for updates
3. when it finds it, it  silently download and extract new version of the application to update folder
4. at the next start of the application, it will check if there is a new folder with new version of the app
5. if yes, app will be launched from the new folder
6. exept when the installation process was stoped and the application will resume already ongoing weidu mods installation

- this way, users will always get latest version of the app without any interference and without possibility to break ongoing installation with changes made to install order

 


Main Features:
- support for single game: BG2, BG1EE, BG2EE, IWD1, IWD1EE, IWD2, PST, PSTEE
- support for multi games: BGT, EET
- auto-detection of the game paths ( registry, default location )
- detection of the proper game installations for games with different releases (BG1/BG2 CD's full installation)
- detection of the missing patches for classic version of the games
- verifying clean installation state of the games, no files inside overide + empty weidu log
- creating and restoring special backups of the games which skips Data\* files for much smaller size

- ability to choose multiple languages for available mods list: PO,EN,GE means 'give me all mods in polish and use it as main language, when there is no polish, choose english, if there is no polish or english, choose greman, dont show mods without atleast one of the selected language)

 

Compilation of mods aka Custom Mod Packs
- build-in compilation of the mods: minimal, recommended, standard, expert + few user-made compilation
- enabling expert components should be possible only by choosing expert compilation
- different colors/icons for different mods category (expert=red, recommended=green)

 

Downloading:
- multi-thread mods download from various filehosting
- some of the filehosting require workarounds

 

Extraction:
- proper extraction of the mods archive, including taking care of unnecessary duplicated folders
- hacking of the NSIS installers which doesn't provide a way to extract the mod files unless extracted
  (invoke exe, redirect and wait for extraction, kill NSIS process)
- OverwriteFiles function


Conflicts types:
- All mods/components depend another, so the mods will not be allowed to be installed alone. Only in a bunch of all mods.
- Multiple mods/components need another (to coexist). The mods X1, X2, [...Xn] need Y if installed together. Y is not needed if any of X is missing.
- One mod/component need multiple others. The mod X needs Y1, Y2, [...Yn] to be installed. This does not mean that Y1 needs Y2.

- One (or more) components need one of multiple possible components. So if any of the components on the right are installed, the dependency is solved.

- Advanced conflict - check Splits String by ':' (lets call it area). If one of the items is selected (or all of a group if '&' is used), it's displayed as a conflict. Advantage to normal conflicts: *Mods in an area are not treated as conflicts. *Mods can have conflicts in groups. So if two combined mods have a conflict with a third one, this is the ways to go.
The mods X1, X2, [...Xn] all have a conflict with Y. X1 and X2 do not have a conflict, so they can be installed without problems.

- One mod needs another - not opposite
- One or more mod has conflicts with another
- One or more component has conflicts with another. You can use combination of (-) and (number).

- Mods that depend on BGT/EET, a special language-selection or a version of the game are listed in the Game.ini's [Purge]-section. These are not shown in the selection-menu if the conditions are not matched, so people don't get confused.
- a connection for some specific fix for another mod but only for main language of the mods translation that is on top of "BWS Translation" section.


Conflicts Solve:
- automatically
- manually via GUI
 

Additional Logic:
- continue installation
- report errors
- pause when errors occur
- ignore errors and continue installation
- do not pause installation for skipped components

 

Saving and loading user chosen mod/component lists
- export/import of the mod selection along with custom user answers

 

Comandline hook:
- save all output without affecting performance
- detect certain events (weidu errors, weidu skipped components)
- providing answers to questions displayed inside commandline

 

Save game backups
- since every installation is different, next BWS should backup all save games

 

Logging/Debbuging
- log for checking if the mod packages are online
- log for mod extraction
- log for weidu installation

 

It look as simple GUI application but it has quite complicated logic regarding "handle mod and components conflicts and auto solve them" - this is most important feature of the app.

This app needs to be converted into multi-platform GUI application because Enhanced Editions of the game can be played on OSX and Linux also. But for the past 6 years, there wasn't a single gamer/developer who would try to convert this app using multi-platform language and GUI. 

This is the moment when I'm asking for help:

- Which language would suit the best for multi-platform GUI application?  c#,python,java or other?

- Is there any general approach for such conversion? 

- Does autoit community/developer have some experience with converting autoit GUI applications into multi-platform GUI app by using multi-platform language like c#,python,java

- Is there someone who isn't scared by looking at the source code of the application and feature list to help me with converting or even begin with creating multi-platform GUI app template which will just simply run the same commandline for every system ? 

If there is something else which you would know, pleas ask and I will try to answer my best.

 

Edited by ALIENQuake
Link to post
Share on other sites

 

Maybe my suspended project may help

 

First start with running the exampels under

https://github.com/gileli121/CU3-Library/tree/master/Examples/main

The examples cover all the functions (https://github.com/gileli121/CU3-Library/blob/master/gui.h) I wrote.
use the examples and play with them in depth.

I do not have much time at the moment to give a lot of support. I checked the functions but that does not guarantee they are bug free. If you find a problem, please report it (inside github platform) 

 

I would note that I am not going to continue to develop these functions in the coming months. Feel free to implement any missing function you need.
please share the code of these missing functions so I'll add them later (of course, I will mention the name of author).
If you want me to add missing functions in my project page, follow the same  standard of organizing the code:

  • If you make new function for GUI - The function must be inside gui.h under "CU3_NAMESPACE_START" .
  • If the function have the same name of it's parallel function (in Autoit), the function must be the same also in it's parameters and behavior (as described in the Help file of Autoit)
  • If the function is not exactly the same like in Autoit, The function name must end with "_C"
  • Use the the standard retun type "CU3_CTRL" If necessary.  If you think to change this standard, do it after very careful thought.
    • Don't make any changes that will force you to change the functions I worte

 

 

EDIT:

Oops, I had a misunderstanding .. I thought you wanted to do this work yourself. I understand that you are asking someone else to do it .. I do not have time to perform such work. I am currently busy with other things. 

 

Edited by Guest
Link to post
Share on other sites
  • Jos locked this topic
  • Developers

Currently locked and under review by the Mod team for:

  • Check whether this is in conflict with our Forum rules.
  • "rent-a-coder" type question.

Jos

SciTE4AutoIt3 Full installer Download page   - Beta files       Read before posting     How to post scriptsource   Forum etiquette  Forum Rules 
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Link to post
Share on other sites
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Colduction
      Hi AutoIt programmers, excuse me for bothering you with multiple topics.

      In AutoIt we can use Number() function to convert Hex string to number but it's output is different of C# output & and i wanna make it's output like AutoIt code.

      For e.g I use this in AutoIt:
      Local $dBinary = Binary("Hello") ; Create binary data from a string. Local $dExtract = Number(BinaryMid($dBinary, 1, 5)) ConsoleWrite($dExtract & @CRLF) And i use this for C#:
      using System; using System.Text; //NameSpace Is Use of Project Name namespace TEST { class Program { public static void Main(string[] args) { //declaring a variable and assigning hex value string dd = ToHex("Hello", Encoding.ASCII); decimal d = Int64.Parse(dd, System.Globalization.NumberStyles.HexNumber); Console.WriteLine("Result: " + d); //hit ENTER to exit Console.ReadLine(); } public static string ToHex(string sInput, Encoding oEncoding, bool b0x_Prefix = false) { byte[] a_binaryOutput = oEncoding.GetBytes(sInput); string sOutput = BitConverter.ToString(a_binaryOutput).Replace("-", ""); if (b0x_Prefix == false) { return sOutput; } else { return "0x" + sOutput; } } } }
      I say once again that excuse me for creating new topic, in fact i'm making a library for GAuthOTP from a topic in AutoIt.
    • By DJ143
      I have a autoit exe file which is used in upload/browse file functionality.  This has been integrated with selenium framework and I am invoking the autoit exe using Java process and runtime. 
      Now the issue is when I run the scripts and invoke the autoit exe in local it works perfectly.  But when I use selenium grid or jenkins to run the scripts in another windows server it is not working.
      Can anyone please suggest any solution for this?
    • By Hermes
      Hello, the script below will read column A from an excel file - and if a value matches in the browser, it will click the corresponding link and click on a specific button to paste the data, then writes "Completed" in Column B. It will continue to read from the excel file and do the same thing for all the remaining rows.
      #Include "Chrome.au3" #Include "wd_core.au3" #Include "wd_helper.au3" #Include "WinHttp.au3" #include <MsgBoxConstants.au3> #include <File.au3> #include <IE.au3> #include <Array.au3> #include <INet.au3> #include <AutoItConstants.au3> #include <WinAPIFiles.au3> #include <GDIPlus.au3> #include <Excel.au3> #Include "WinHttp.au3" #Include "_HtmlTable2Array.au3" Local $sDesiredCapabilities, $sSession SetupChrome() _WD_Startup() $sSession = _WD_CreateSession($sDesiredCapabilities) _WD_LoadWait($sSession) _WD_Navigate($sSession, "table1.html") _WD_LoadWait($sSession) _WD_WaitElement($sSession, $_WD_LOCATOR_ByXPath, "//table[@class='main']") Local $sElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, "//table[@class='main']") ;ConsoleWrite ("mat-table " & $sElement & @CRLF) Local $aArray1 = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, ".//td[contains(@class,'data')]", $sElement, True) sleep(1000) For $i = 0 to UBound($aArray1) - 1 $aArray1[$i] = _WD_ElementAction($sSession, $aArray1[$i], 'text') Next ;_ArrayDisplay($aArray1) ;Email variables $SmtpServer = "" ; address for the smtp-server to use - REQUIRED $FromName = "Hermes" ; name from who the email was sent $FromAddress = "sender@gmail.com" ; address from where the mail should come $ToAddress = "recipient@gmail.com" ; destination address of the email - REQUIRED, use commas (,) to add more email addresses $Subject = "File not found" ; subject from the email - can be anything you want it to be $Body = "File not found!" ; the messagebody from the mail - can be left blank but then you get a blank mail $AttachFiles = "" ; the file(s) you want to attach seperated with a ; (Semicolon) - leave blank if not needed $CcAddress = "" ; address for cc - leave blank if not needed $BccAddress = "" ; address for bcc - leave blank if not needed $Importance = "High" ; Send message priority: "High", "Normal", "Low" $Username = "" ; username for the account used from where the mail gets sent - REQUIRED $Password = "" ; password for the account used from where the mail gets sent - REQUIRED $IPPort = 25 ; port used for sending the mail $ssl = 0 ; enables/disables secure socket layer sending - put to 1 if using httpS $tls = 0 ; enables/disables TLS when required Local $oAppl = _Excel_Open() Local $sWorkbook = "c:\test.xlsx" Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook) ;open excel and pass both parameters If FileExists($sWorkbook) Then ;Check if the file exist. Local $oAppl = _Excel_Open() Local $sWorkbook = "c:\test.xlsx" Local $oWorkbook = _Excel_BookOpen($oAppl, $sWorkbook) ;open excel and pass both parameters Local $aArray2 = _Excel_RangeRead($oWorkbook,Default,$oWorkbook.ActiveSheet.Usedrange.Columns("A:A")) Local $iIdx Local $Skipline = 0 ;0==> first line Do Local $temprf For $i = 0 To UBound($aArray2) - 1 $temprf &= $aArray2[$i] _WD_WaitElement($sSession, $_WD_LOCATOR_ByXPath, ".//a[contains(@class,'edit') and contains(text(),'Edit')]") Local $aElement = _WD_FindElement($sSession, $_WD_LOCATOR_ByXPath, ".//a[contains(@class,'edit') and contains(text(),'Edit')]", $sElement, True) $iIdx = _ArraySearch($aArray1, $aArray2[$i]) If @error Then ContinueLoop _WD_ElementAction($sSession, $aElement[$iIdx], 'click') If $i < $Skipline Then ContinueLoop $oRange = $oWorkbook.ActiveSheet.Range("B" & $i + 1 & ":XFD" & $i + 1) _Excel_RangeCopyPaste($oWorkbook.Activesheet, $oRange) ;Paste Local $oTest4 = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "pastebutton") _WD_ElementAction($sSession, $oTest4, 'click') Sleep(1000) ;Save Button Local $save3 = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "button.button") _WD_ElementAction($sSession, $save3, 'click') _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, "Completed", "B" & $i+1) sleep(1000) Next Until (Not @error) _Excel_Close($oWorkbook) Else _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl, $tls) Exit EndIf _WD_LoadWait($sSession) ;Attaching files to emails Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0, $tls = 0) Local $objEmail = ObjCreate("CDO.Message") $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>' $objEmail.To = $s_ToAddress Local $i_Error = 0 Local $i_Error_desciption = "" If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress $objEmail.Subject = $s_Subject If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then $objEmail.HTMLBody = $as_Body Else $objEmail.Textbody = $as_Body & @CRLF EndIf $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer If Number($IPPort) = 0 then $IPPort = 25 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort ;Authenticated SMTP If $s_Username <> "" Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password EndIf ; Set security params If $ssl Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True If $tls Then $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendtls") = True ;Update settings $objEmail.Configuration.Fields.Update ; Set Email Importance Switch $s_Importance Case "High" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High" Case "Normal" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal" Case "Low" $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low" EndSwitch $objEmail.Fields.Update ; Sent the Message $objEmail.Send $objEmail="" EndFunc ;==>_INetSmtpMailCom Local $aDir = _FileListToArrayRec(@TempDir, "scoped_dir*;chrome_*", $FLTAR_FOLDERS, $FLTAR_NORECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) Sleep(2000) For $i = 1 To $aDir[0] DirRemove($aDir[$i], $DIR_REMOVE) Next _WD_LoadWait($sSession) _WD_Shutdown() Func SetupChrome() _WD_Option('Driver', 'chromedriver.exe') _WD_Option('Port', 9515) _WD_Option('DriverParams', '--log-path="' & @ScriptDir & '\chrome.log"') $sDesiredCapabilities = '{"capabilities": {"alwaysMatch": {"goog:chromeOptions": {"w3c": true, "args":["start-maximized","disable-infobars"]}}}}' EndFunc ;==>SetupChrome If the excel file doesn't exists in the folder, it will send an email to a specific recipient.
      What i am trying figure out now is if the excel crashes while the script/loop is running, I want to relaunch the excel file continue to the last row before the excel crashed. So if the value of column B is not marked as "completed", it should continue from that row
      Appreciate any help that I can get to achieve this.
      table1.html test.xlsx
    • By adityaparakh
      Hello ,
      I am trying to use Websockets in AutoIt.
      It is to fetch live stock market prices , API is provided and documentation available for python language.
      The link for the code snippet is :
      https://symphonyfintech.com/xts-market-data-front-end-api-v2/#tag/Introduction
      https://symphonyfintech.com/xts-market-data-front-end-api-v2/#tag/Instruments/paths/~1instruments~1subscription/post
       
      https://github.com/symphonyfintech/xts-pythonclient-api-sdk
       
      Second Link is to subscribe to a list of ExchangeInstruments.
      Now I would like to get live stock ltp (LastTradedPrice) for a few stocks whose "ExchangeInstrumentID" I know.
      I am able to use the WinHttp object to perform actions using simple codes like below :
      I have the secretKey and appkey and can generate the needed token. And get the unique ExchangeInstrumentID.

      Below code is just for example of how I am using WinHttp. Unrelated to socket part.
      Global $InteractiveAPItoken = IniRead(@ScriptDir & "\Config.ini", "token", "InteractiveAPItoken", "NA") $baseurl = "https://brokerlink.com/interactive/" $functionurl = "orders" $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") $oHTTP.Open("POST", $baseurl & $functionurl, False) $oHTTP.SetRequestHeader("Content-Type", "application/json;charset=UTF-8") $oHTTP.SetRequestHeader("authorization", $InteractiveAPItoken) $pD = '{ "exchangeSegment": "NSEFO", "exchangeInstrumentID": ' & $exchangeInstrumentID & ', "productType": "' & $producttype & '", "orderType": "MARKET", "orderSide": "' & $orderside & '", "timeInForce": "DAY", "disclosedQuantity": 0, "orderQuantity": ' & $qty & ', "limitPrice": 0, "stopPrice": 0, "orderUniqueIdentifier": "' & $orderidentifier & '"}' $oHTTP.Send($pD) $oReceived = $oHTTP.ResponseText $oStatusCode = $oHTTP.Status
          
          
      But am struggling to understand and use socket.
      Would be of great help if you can have a look at the link mentioned above and help with the code sample for AutoIt.
      To connect and listen to a socket.
      Thanks a lot
       
    • By Hermes
      Hi, I have a site that has the following elements below: 
      <div>More element here</div> <div>More element here</div> <div>More element here</div> When I do this in Auto It:
      Local $oSelectDiv = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "div") _WD_HighlightElement($sSession, $oSelectDiv, 1) I also tried to add [3], but it doesnt seems to work:
      Local $oSelectDiv = _WD_FindElement($sSession, $_WD_LOCATOR_ByCSSSelector, "div[3]") _WD_HighlightElement($sSession, $oSelectDiv, 1) It always highlight the first one, but I am trying to highlight the 3rd in the list. Is there anyway to select the 3rd div without having to add any class/id in the divs, and without using XPATH? The structure of the elements in that site were built that way.
×
×
  • Create New...