From 7a930d76362dba9017e5afa02a79750d1c0236c5 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 23 Nov 2023 00:42:36 +0900 Subject: [PATCH 01/19] chore: bump version --- CHANGELOG.md | 8 ++++++++ dzgui.sh | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 097116e..4a9738f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [4.0.2] 2023-11-22 +## Fixed +- Query helper not loading: fixed a remote link pointing to the wrong destination and added a checksum verification to ensure file is present + +## [4.0.1] 2023-11-22 +## Fixed +- Emergency hotfix to remove build artifacts leaking into main script: if you updated DZGUI from 3.3.18 to 4.0.0 between 2023-11-22 15:00:02 and 2023-11-22 15:03:37 GMT, there is a small chance it will be unable to launch correctly. If so, please follow the instructions on the manual to reinstall. + ## [4.0.0] 2023-11-22 Hello players, this is a major version update which overhauls many of DZGUI's underlying systems to improve responsiveness of the application and make menus more intuitive to interact with. It should be considerably more difficult, if not impossible, to inadvertently crash a dialog, and nested dialogs should behave in a more expected fashion, such as when going back and forth between menus or changing options dynamically within a given menu. diff --git a/dzgui.sh b/dzgui.sh index d0cc9b1..bef441f 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.0.0-rc.11 +version=4.1.0-rc.1 aid=221100 game="dayz" @@ -1009,7 +1009,6 @@ toggle_branch(){ fi flip_branch="branch=\"$branch\"" awk -v "var=$flip_branch" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > $config_file - printf "[DZGUI] Toggled branch to '$branch'\n" source $config_file } generate_log(){ @@ -2005,11 +2004,10 @@ fetch_dzq(){ curl -Ls "$url" > $helpers_path/a2s/$repo.py } fetch_query(){ - [[ -f $helpers_path/query.py ]] && return + [[ $(md5sum $helpers_path/query.py | awk '{print $1}') == "7cbae12ae68b526e7ff376b638123cc7" ]] && return local author="aclist" - local repo="$branch" + local repo="dzgui" local url="https://raw.githubusercontent.com/$author/dztui/$repo/helpers/query.py" - local real="https://raw.githubusercontent.com/aclist/dztui/testing/helpers/query.py" curl -Ls "$url" > "$helpers_path/query.py" } fetch_helpers(){ @@ -2045,6 +2043,35 @@ steam_deps(){ fi logger INFO "steam_cmd set to $steam_cmd" } +update_steam_cmd(){ + local new_cmd + preferred_client="$steam_cmd" + new_cmd="preferred_client=\"$preferred_client\"" + mv $config_file ${config_path}dztuirc.old + nr=$(awk '/preferred_client=/ {print NR}' ${config_path}dztuirc.old) + awk -v "var=$new_cmd" -v "nr=$nr" 'NR==nr {$0=var}{print}' ${config_path}dztuirc.old > ${config_path}dztuirc +} +steam_deps(){ + logger INFO "${FUNCNAME[0]}" + local flatpak steam + [[ $(command -v flatpak) ]] && flatpak=$(flatpak list | grep valvesoftware.Steam) + steam=$(command -v steam) + if [[ -z "$steam" ]] && [[ -z "$flatpak" ]]; then + warn "Requires Steam or Flatpak Steam" + logger ERROR "Steam was missing" + exit + elif [[ -n "$steam" ]] && [[ -n "$flatpak" ]]; then + toggle_steam=1 + steam_cmd="steam" + [[ -n $preferred_client ]] && steam_cmd="$preferred_client" + [[ -z $preferred_client ]] && update_steam_cmd + elif [[ -n "$steam" ]]; then + steam_cmd="steam" + else + steam_cmd="flatpak run com.valvesoftware.Steam" + fi + logger INFO "steam_cmd set to $steam_cmd" +} initial_setup(){ echo "# Initial setup" run_depcheck From 31ebf4996d67f5da92f60864b7fd8812a6c93420 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 23 Nov 2023 00:46:10 +0900 Subject: [PATCH 02/19] chore: drop stale file --- custom.css | 427 ----------------------------------------------------- 1 file changed, 427 deletions(-) delete mode 100644 custom.css diff --git a/custom.css b/custom.css deleted file mode 100644 index d1f3eff..0000000 --- a/custom.css +++ /dev/null @@ -1,427 +0,0 @@ -/*! Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */ -/* Uncomment the following line when using as a custom stylesheet */ -/* @import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700"; */ -html{font-family:sans-serif;-webkit-text-size-adjust:100%} -h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 {color: #8a1414 !important} -a{background:none} -a:focus{outline:thin dotted} -a:active,a:hover{outline:0} -h1{font-size:2em;margin:.67em 0} -b,strong{font-weight:bold} -abbr{font-size:.9em} -abbr[title]{cursor:help;border-bottom:1px dotted #dddddf;text-decoration:none} -dfn{font-style:italic} -hr{height:0} -mark{background:#ff0;color:#000} -code,kbd,pre,samp{font-family:monospace;font-size:1em} -pre{white-space:pre-wrap} -q{quotes:"\201C" "\201D" "\2018" "\2019"} -small{font-size:80%} -sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} -sup{top:-.5em} -sub{bottom:-.25em} -img{border:0} -svg:not(:root){overflow:hidden} -figure{margin:0} -audio,video{display:inline-block} -audio:not([controls]){display:none;height:0} -fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em} -legend{border:0;padding:0} -button,input,select,textarea{font-family:inherit;font-size:100%;margin:0} -button,input{line-height:normal} -button,select{text-transform:none} -button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer} -button[disabled],html input[disabled]{cursor:default} -input[type=checkbox],input[type=radio]{padding:0} -button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0} -textarea{overflow:auto;vertical-align:top} -table{border-collapse:collapse;border-spacing:0} -*,::before,::after{box-sizing:border-box} -html,body{font-size:100%} -body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;line-height:1;position:relative;cursor:auto;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-wrap:anywhere;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased} -a:hover{cursor:pointer} -img,object,embed{max-width:100%;height:auto} -object,embed{height:100%} -img{-ms-interpolation-mode:bicubic} -.left{float:left!important} -.right{float:right!important} -.text-left{text-align:left!important} -.text-right{text-align:right!important} -.text-center{text-align:center!important} -.text-justify{text-align:justify!important} -.hide{display:none} -img,object,svg{display:inline-block;vertical-align:middle} -textarea{height:auto;min-height:50px} -select{width:100%} -.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em} -div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0} -a{color:#2156a5;text-decoration:underline;line-height:inherit} -a:hover,a:focus{color:#1d4b8f} -a img{border:0} -p{line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility} -p aside{font-size:.875em;line-height:1.35;font-style:italic} -h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em} -h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0} -h1{font-size:2.125em} -h2{font-size:1.6875em} -h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em} -h4,h5{font-size:1.125em} -h6{font-size:1em} -hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em} -em,i{font-style:italic;line-height:inherit} -strong,b{font-weight:bold;line-height:inherit} -small{font-size:60%;line-height:inherit} -code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)} -ul,ol,dl{line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit} -ul,ol{margin-left:1.5em} -ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0} -ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit} -ul.square{list-style-type:square} -ul.circle{list-style-type:circle} -ul.disc{list-style-type:disc} -ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0} -dl dt{margin-bottom:.3125em;font-weight:bold} -dl dd{margin-bottom:1.25em} -blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd} -blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)} -@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2} -h1{font-size:2.75em} -h2{font-size:2.3125em} -h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em} -h4{font-size:1.4375em}} -table{background:#fff;margin-bottom:1.25em;border:1px solid #dedede;word-wrap:normal} -table thead,table tfoot{background:#f7f8f7} -table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left} -table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)} -table tr.even,table tr.alt{background:#f8f8f7} -table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{line-height:1.6} -h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em} -h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400} -.center{margin-left:auto;margin-right:auto} -.stretch{width:100%} -.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table} -.clearfix::after,.float-group::after{clear:both} -:not(pre).nobreak{word-wrap:normal} -:not(pre).nowrap{white-space:nowrap} -:not(pre).pre-wrap{white-space:pre-wrap} -:not(pre):not([class^=L])>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background:#f7f7f8;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed} -pre{color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;line-height:1.45;text-rendering:optimizeSpeed} -pre code,pre pre{color:inherit;font-size:inherit;line-height:inherit} -pre>code{display:block} -pre.nowrap,pre.nowrap pre{white-space:pre;word-wrap:normal} -em em{font-style:normal} -strong strong{font-weight:400} -.keyseq{color:rgba(51,51,51,.8)} -kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background:#f7f7f7;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 0 rgba(0,0,0,.2),inset 0 0 0 .1em #fff;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap} -.keyseq kbd:first-child{margin-left:0} -.keyseq kbd:last-child{margin-right:0} -.menuseq,.menuref{color:#000} -.menuseq b:not(.caret),.menuref{font-weight:inherit} -.menuseq{word-spacing:-.02em} -.menuseq b.caret{font-size:1.25em;line-height:.8} -.menuseq i.caret{font-weight:bold;text-align:center;width:.45em} -b.button::before,b.button::after{position:relative;top:-1px;font-weight:400} -b.button::before{content:"[";padding:0 3px 0 2px} -b.button::after{content:"]";padding:0 2px 0 3px} -p a>code:hover{color:rgba(0,0,0,.9)} -#header,#content,#footnotes,#footer{width:100%;margin:0 auto;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em} -#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table} -#header::after,#content::after,#footnotes::after,#footer::after{clear:both} -#content{margin-top:1.25em} -#content::before{content:none} -#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0} -#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf} -#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px} -#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row wrap} -#header .details span:first-child{margin-left:-.125em} -#header .details span.email a{color:rgba(0,0,0,.85)} -#header .details br{display:none} -#header .details br+span::before{content:"\00a0\2013\00a0"} -#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)} -#header .details br+span#revremark::before{content:"\00a0|\00a0"} -#header #revnumber{text-transform:capitalize} -#header #revnumber::after{content:"\00a0"} -#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem} -#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em} -#toc>ul{margin-left:.125em} -#toc ul.sectlevel0>li>a{font-style:italic} -#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0} -#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none} -#toc li{line-height:1.3334;margin-top:.3334em} -#toc a{text-decoration:none} -#toc a:active{text-decoration:underline} -#toctitle{color:#7a2518;font-size:1.2em} -@media screen and (min-width:768px){#toctitle{font-size:1.375em} -body.toc2{padding-left:15em;padding-right:0} -#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto} -#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em} -#toc.toc2>ul{font-size:.9em;margin-bottom:0} -#toc.toc2 ul ul{margin-left:0;padding-left:1em} -#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em} -body.toc2.toc-right{padding-left:0;padding-right:15em} -body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}} -@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0} -#toc.toc2{width:20em} -#toc.toc2 #toctitle{font-size:1.375em} -#toc.toc2>ul{font-size:.95em} -#toc.toc2 ul ul{padding-left:1.25em} -body.toc2.toc-right{padding-left:0;padding-right:20em}} -#content #toc{border:1px solid #e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;border-radius:4px} -#content #toc>:first-child{margin-top:0} -#content #toc>:last-child{margin-bottom:0} -#footer{max-width:none;background:rgba(0,0,0,.8);padding:1.25em} -#footer-text{color:hsla(0,0%,100%,.8);line-height:1.44} -#content{margin-bottom:.625em} -.sect1{padding-bottom:.625em} -@media screen and (min-width:768px){#content{margin-bottom:1.25em} -.sect1{padding-bottom:1.25em}} -.sect1:last-child{padding-bottom:0} -.sect1+.sect1{border-top:1px solid #e7e7e9} -#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400} -#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em} -#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible} -#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none} -#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221} -details,.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em} -details{margin-left:1.25rem} -details>summary{cursor:pointer;display:block;position:relative;line-height:1.6;margin-bottom:.625rem;outline:none;-webkit-tap-highlight-color:transparent} -details>summary::-webkit-details-marker{display:none} -details>summary::before{content:"";border:solid transparent;border-left:solid;border-width:.3em 0 .3em .5em;position:absolute;top:.5em;left:-1.25rem;transform:translateX(15%)} -details[open]>summary::before{border:solid transparent;border-top:solid;border-width:.5em .3em 0;transform:translateY(15%)} -details>summary::after{content:"";width:1.25rem;height:1em;position:absolute;top:.3em;left:-1.25rem} -.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic} -table.tableblock.fit-content>caption.title{white-space:nowrap;width:0} -.paragraph.lead>p,#preamble>.sectionbody>[class=paragraph]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)} -.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%} -.admonitionblock>table td.icon{text-align:center;width:80px} -.admonitionblock>table td.icon img{max-width:none} -.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase} -.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6);word-wrap:anywhere} -.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0} -.exampleblock>.content{border:1px solid #e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;border-radius:4px} -.exampleblock>.content>:first-child{margin-top:0} -.exampleblock>.content>:last-child{margin-bottom:0} -.sidebarblock{border:1px solid #dbdbd6;margin-bottom:1.25em;padding:1.25em;background:#f3f3f2;border-radius:4px} -.sidebarblock>:first-child{margin-top:0} -.sidebarblock>:last-child{margin-bottom:0} -.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center} -.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0} -.literalblock pre,.listingblock>.content>pre{border-radius:4px;overflow-x:auto;padding:1em;font-size:.8125em} -@media screen and (min-width:768px){.literalblock pre,.listingblock>.content>pre{font-size:.90625em}} -@media screen and (min-width:1280px){.literalblock pre,.listingblock>.content>pre{font-size:1em}} -.literalblock pre,.listingblock>.content>pre:not(.highlight),.listingblock>.content>pre[class=highlight],.listingblock>.content>pre[class^="highlight "]{background:#f7f7f8} -.literalblock.output pre{color:#f7f7f8;background:rgba(0,0,0,.9)} -.listingblock>.content{position:relative} -.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:inherit;opacity:.5} -.listingblock:hover code[data-lang]::before{display:block} -.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:inherit;opacity:.5} -.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"} -.listingblock pre.highlightjs{padding:0} -.listingblock pre.highlightjs>code{padding:1em;border-radius:4px} -.listingblock pre.prettyprint{border-width:0} -.prettyprint{background:#f7f7f8} -pre.prettyprint .linenums{line-height:1.45;margin-left:2em} -pre.prettyprint li{background:none;list-style-type:inherit;padding-left:0} -pre.prettyprint li code[data-lang]::before{opacity:1} -pre.prettyprint li:not(:first-child) code[data-lang]::before{display:none} -table.linenotable{border-collapse:separate;border:0;margin-bottom:0;background:none} -table.linenotable td[class]{color:inherit;vertical-align:top;padding:0;line-height:inherit;white-space:normal} -table.linenotable td.code{padding-left:.75em} -table.linenotable td.linenos,pre.pygments .linenos{border-right:1px solid;opacity:.35;padding-right:.5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} -pre.pygments span.linenos{display:inline-block;margin-right:.75em} -.quoteblock{margin:0 1em 1.25em 1.5em;display:table} -.quoteblock:not(.excerpt)>.title{margin-left:-1.5em;margin-bottom:.75em} -.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify} -.quoteblock blockquote{margin:0;padding:0;border:0} -.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)} -.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0} -.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right} -.verseblock{margin:0 1em 1.25em} -.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans-serif;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility} -.verseblock pre strong{font-weight:400} -.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex} -.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic} -.quoteblock .attribution br,.verseblock .attribution br{display:none} -.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)} -.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none} -.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0} -.quoteblock.abstract{margin:0 1em 1.25em;display:block} -.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center} -.quoteblock.excerpt>blockquote,.quoteblock .quoteblock{padding:0 0 .25em 1em;border-left:.25em solid #dddddf} -.quoteblock.excerpt,.quoteblock .quoteblock{margin-left:0} -.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem} -.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;font-size:.85rem;text-align:left;margin-right:0} -p.tableblock:last-child{margin-bottom:0} -td.tableblock>.content{margin-bottom:1.25em;word-wrap:anywhere} -td.tableblock>.content>:last-child{margin-bottom:-1.25em} -table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede} -table.grid-all>*>tr>*{border-width:1px} -table.grid-cols>*>tr>*{border-width:0 1px} -table.grid-rows>*>tr>*{border-width:1px 0} -table.frame-all{border-width:1px} -table.frame-ends{border-width:1px 0} -table.frame-sides{border-width:0 1px} -table.frame-none>colgroup+*>:first-child>*,table.frame-sides>colgroup+*>:first-child>*{border-top-width:0} -table.frame-none>:last-child>:last-child>*,table.frame-sides>:last-child>:last-child>*{border-bottom-width:0} -table.frame-none>*>tr>:first-child,table.frame-ends>*>tr>:first-child{border-left-width:0} -table.frame-none>*>tr>:last-child,table.frame-ends>*>tr>:last-child{border-right-width:0} -table.stripes-all>*>tr,table.stripes-odd>*>tr:nth-of-type(odd),table.stripes-even>*>tr:nth-of-type(even),table.stripes-hover>*>tr:hover{background:#f8f8f7} -th.halign-left,td.halign-left{text-align:left} -th.halign-right,td.halign-right{text-align:right} -th.halign-center,td.halign-center{text-align:center} -th.valign-top,td.valign-top{vertical-align:top} -th.valign-bottom,td.valign-bottom{vertical-align:bottom} -th.valign-middle,td.valign-middle{vertical-align:middle} -table thead th,table tfoot th{font-weight:bold} -tbody tr th{background:#f7f8f7} -tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold} -p.tableblock>code:only-child{background:none;padding:0} -p.tableblock{font-size:1em} -ol{margin-left:1.75em} -ul li ol{margin-left:1.5em} -dl dd{margin-left:1.125em} -dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0} -li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em} -ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none} -ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em} -ul.unstyled,ol.unstyled{margin-left:0} -li>p:empty:only-child::before{content:"";display:inline-block} -ul.checklist>li>p:first-child{margin-left:-1em} -ul.checklist>li>p:first-child>.fa-square-o:first-child,ul.checklist>li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em} -ul.checklist>li>p:first-child>input[type=checkbox]:first-child{margin-right:.25em} -ul.inline{display:flex;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em} -ul.inline>li{margin-left:1.25em} -.unstyled dl dt{font-weight:400;font-style:normal} -ol.arabic{list-style-type:decimal} -ol.decimal{list-style-type:decimal-leading-zero} -ol.loweralpha{list-style-type:lower-alpha} -ol.upperalpha{list-style-type:upper-alpha} -ol.lowerroman{list-style-type:lower-roman} -ol.upperroman{list-style-type:upper-roman} -ol.lowergreek{list-style-type:lower-greek} -.hdlist>table,.colist>table{border:0;background:none} -.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none} -td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em} -td.hdlist1{font-weight:bold;padding-bottom:1.25em} -td.hdlist2{word-wrap:anywhere} -.literalblock+.colist,.listingblock+.colist{margin-top:-.5em} -.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top} -.colist td:not([class]):first-child img{max-width:none} -.colist td:not([class]):last-child{padding:.25em 0} -.thumb,.th{line-height:0;display:inline-block;border:4px solid #fff;box-shadow:0 0 0 1px #ddd} -.imageblock.left{margin:.25em .625em 1.25em 0} -.imageblock.right{margin:.25em 0 1.25em .625em} -.imageblock>.title{margin-bottom:0} -.imageblock.thumb,.imageblock.th{border-width:6px} -.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em} -.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0} -.image.left{margin-right:.625em} -.image.right{margin-left:.625em} -a.image{text-decoration:none;display:inline-block} -a.image object{pointer-events:none} -sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super} -sup.footnote a,sup.footnoteref a{text-decoration:none} -sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline} -#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em} -#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0} -#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em} -#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em} -#footnotes .footnote:last-of-type{margin-bottom:0} -#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0} -div.unbreakable{page-break-inside:avoid} -.big{font-size:larger} -.small{font-size:smaller} -.underline{text-decoration:underline} -.overline{text-decoration:overline} -.line-through{text-decoration:line-through} -.aqua{color:#00bfbf} -.aqua-background{background:#00fafa} -.black{color:#000} -.black-background{background:#000} -.blue{color:#0000bf} -.blue-background{background:#0000fa} -.fuchsia{color:#bf00bf} -.fuchsia-background{background:#fa00fa} -.gray{color:#606060} -.gray-background{background:#7d7d7d} -.green{color:#006000} -.green-background{background:#007d00} -.lime{color:#00bf00} -.lime-background{background:#00fa00} -.maroon{color:#600000} -.maroon-background{background:#7d0000} -.navy{color:#000060} -.navy-background{background:#00007d} -.olive{color:#606000} -.olive-background{background:#7d7d00} -.purple{color:#600060} -.purple-background{background:#7d007d} -.red{color:#bf0000} -.red-background{background:#fa0000} -.silver{color:#909090} -.silver-background{background:#bcbcbc} -.teal{color:#006060} -.teal-background{background:#007d7d} -.white{color:#bfbfbf} -.white-background{background:#fafafa} -.yellow{color:#bfbf00} -.yellow-background{background:#fafa00} -span.icon>.fa{cursor:default} -a span.icon>.fa{cursor:inherit} -.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default} -.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c} -.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111} -.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900} -.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400} -.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000} -.conum[data-value]{display:inline-block;color:#fff!important;background:rgba(0,0,0,.8);border-radius:50%;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold} -.conum[data-value] *{color:#fff!important} -.conum[data-value]+b{display:none} -.conum[data-value]::after{content:attr(data-value)} -pre .conum[data-value]{position:relative;top:-.125em} -b.conum *{color:inherit!important} -.conum:not([data-value]):empty{display:none} -dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility} -h1,h2,p,td.content,span.alt,summary{letter-spacing:-.01em} -p strong,td.content strong,div.footnote strong{letter-spacing:-.005em} -p,blockquote,dt,td.content,span.alt,summary{font-size:1.0625rem} -p{margin-bottom:1.25rem} -.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em} -.exampleblock>.content{background:#fffef7;border-color:#e0e0dc;box-shadow:0 1px 4px #e0e0dc} -.print-only{display:none!important} -@page{margin:1.25cm .75cm} -@media print{*{box-shadow:none!important;text-shadow:none!important} -html{font-size:80%} -a{color:inherit!important;text-decoration:underline!important} -a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important} -a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em} -abbr[title]{border-bottom:1px dotted} -abbr[title]::after{content:" (" attr(title) ")"} -pre,blockquote,tr,img,object,svg{page-break-inside:avoid} -thead{display:table-header-group} -svg{max-width:100%} -p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3} -h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid} -#header,#content,#footnotes,#footer{max-width:none} -#toc,.sidebarblock,.exampleblock>.content{background:none!important} -#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important} -body.book #header{text-align:center} -body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em} -body.book #header .details{border:0!important;display:block;padding:0!important} -body.book #header .details span:first-child{margin-left:0!important} -body.book #header .details br{display:block} -body.book #header .details br+span::before{content:none!important} -body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important} -body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always} -.listingblock code[data-lang]::before{display:block} -#footer{padding:0 .9375em} -.hide-on-print{display:none!important} -.print-only{display:block!important} -.hide-for-print{display:none!important} -.show-for-print{display:inherit!important}} -@media amzn-kf8,print{#header>h1:first-child{margin-top:1.25rem} -.sect1{padding:0!important} -.sect1+.sect1{border:0} -#footer{background:none} -#footer-text{color:rgba(0,0,0,.6);font-size:.9em}} -@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}} From 87ad1acb7d35e80000b8f19a4ac7659663f83f04 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 23 Nov 2023 00:57:09 +0900 Subject: [PATCH 03/19] fix: update installscript --- install.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 706f08d..f459a44 100644 --- a/install.sh +++ b/install.sh @@ -3,8 +3,6 @@ curl "https://raw.githubusercontent.com/aclist/dztui/testing/dzgui.sh" > dzgui.s chmod +x dzgui.sh xdg_file="$HOME/.local/share/applications/dzgui.desktop" share="$HOME/.local/share/dzgui" -conf="$HOME/.config/dztui" [[ -f $xdg_file ]] && rm $xdg_file -[[ -d $share ]] && rm -rf $share -[[ -d $conf ]] && rm -rf $conf +[[ -d $share ]] && rm -rf "$share" ./dzgui.sh From 1b6fb4c9e7cdf5a430cf48eb26a4ab9556a0f439 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 23 Nov 2023 13:23:23 +0900 Subject: [PATCH 04/19] chore: backports from stable --- dzgui.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index bef441f..79e0341 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -2004,7 +2004,11 @@ fetch_dzq(){ curl -Ls "$url" > $helpers_path/a2s/$repo.py } fetch_query(){ - [[ $(md5sum $helpers_path/query.py | awk '{print $1}') == "7cbae12ae68b526e7ff376b638123cc7" ]] && return + local sum="d52ff070b5bb36ace2fce2d914479f47" + local file="$helpers_path/query.py" + if [[ -f $file ]] && [[ $(md5sum $file | awk '{print $1}') == $sum ]]; then + return + fi local author="aclist" local repo="dzgui" local url="https://raw.githubusercontent.com/$author/dztui/$repo/helpers/query.py" From aa62d50a79d761da5feba35f463a297efbd7bb56 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Thu, 23 Nov 2023 13:23:34 +0900 Subject: [PATCH 05/19] chore: bump version --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 79e0341..09efa5c 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0-rc.1 +version=4.1.0-rc.2 aid=221100 game="dayz" From b5502f9675e9eacb6c81d92170cc5e270444a344 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 2 Dec 2023 22:37:37 +0900 Subject: [PATCH 06/19] feat: support kdialog --- dzgui.sh | 90 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 52 insertions(+), 38 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 2f66201..9b57304 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -375,7 +375,11 @@ steam_deck_mods(){ } test_display_mode(){ pgrep -a gamescope | grep -q "generate-drm-mode" - [[ $? -eq 0 ]] && gamemode=1 + if [[ $? -eq 0 ]]; then + echo gm + else + echo dm + fi } foreground(){ if [[ $(command -v wmctrl) ]]; then @@ -389,11 +393,6 @@ manual_mod_install(){ local ip="$1" local gameport="$2" - [[ $is_steam_deck -eq 1 ]] && test_display_mode - if [[ $gamemode -eq 1 ]]; then - popup 1400 - return - fi local ex="/tmp/dzc.tmp" [[ -f $ex ]] && rm $ex watcher(){ @@ -605,6 +604,10 @@ connect(){ compare [[ $auto_install -eq 2 ]] && merge_modlists > >(pdialog) if [[ -n $diff ]]; then + if [[ $is_steam_deck -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then + popup 1400 + return 1 + fi case $auto_install in 1|2) auto_mod_install "$ip" "$gameport" ;; *) manual_mod_install "$ip" "$gameport" ;; @@ -662,10 +665,9 @@ fetch_ip_metadata(){ curl -Ls "$url" } -#TODO: local servers -#local_ip(){ -#(^127\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.168\.) -#} +validate_local_ip(){ + <<< "$1" grep -qP '(^127.\d+.\d+.\d+:\d+$)|(^10\.\d+.\d+.\d+:\d+$)|(^172\.1[6-9]\.\d+.\d+:\d+$)|(^172\.2[0-9]\.\d+.\d+:\d+$)|(^172\.3[0-1]\.\d+.\d+:\d+$)|(^192\.168\.\d+.\d+:\d+$)' +} test_steam_api(){ local url="https://api.steampowered.com/IGameServersService/GetServerList/v1/?filter=\appid\221100&limit=10&key=$steam_api" local code=$(curl -ILs "$url" | grep -E "^HTTP") @@ -731,35 +733,50 @@ connect_by_ip(){ connect "$ip" "$gameport" "$qport" } parse_ips(){ + local res source $config_file check_steam_api [[ $? -eq 1 ]] && return while true; do local ip - ip=$($steamsafe_zenity --entry --text="Enter server IP (omit port)" --title="DZGUI" 2>/dev/null) + ip=$(edialog "Enter server IP (for LAN servers, include query port in IP:PORT format)") [[ $? -eq 1 ]] && return 1 - [[ $ip =~ ':' ]] && continue - if validate_ip "$ip"; then - local res - res=$(fetch_ip_metadata "$ip") - if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq '.response|length') -eq 0 ]]; then - warn "Failed to retrieve IP metadata. Check IP or API key and try again." - return 1 + if [[ $ip =~ ':' ]]; then + if ! validate_local_ip "$ip"; then + warn "Invalid local IP. Check IP:PORT combination and try again." + continue fi - local ct=$(<<< "$res" jq '.response.servers|length') - if [[ $ct -eq 1 ]]; then - local name=$(<<< $res jq -r '.response.servers[].name') - local address=$(<<< $res jq -r '.response.servers[].addr') - local ip=$(<<< "$address" awk -F: '{print $1}') - local qport=$(<<< "$address" awk -F: '{print $2}') - local gameport=$(<<< $res jq -r '.response.servers[].gameport') - echo "${name}%%${ip}:${gameport}%%${qport}" - return 0 + local lan_ip=$(<<< $ip awk -F: '{print $1}') + local lan_qport=$(<<< $ip awk -F: '{print $2}') + res=$(a2s $lan_ip $lan_qport info) + if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq '.response|length') -eq 0 ]]; then + warn "Failed to retrieve server metadata. Check IP:PORT combination and try again." + return 1 fi ip_table "$res" return 0 else - warn "Invalid IP" + if validate_ip "$ip"; then + res=$(fetch_ip_metadata "$ip") + if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq '.response|length') -eq 0 ]]; then + warn "Failed to retrieve server metadata. Check IP or API key and try again." + return 1 + fi + local ct=$(<<< "$res" jq '.response.servers|length') + if [[ $ct -eq 1 ]]; then + local name=$(<<< $res jq -r '.response.servers[].name') + local address=$(<<< $res jq -r '.response.servers[].addr') + local ip=$(<<< "$address" awk -F: '{print $1}') + local qport=$(<<< "$address" awk -F: '{print $2}') + local gameport=$(<<< $res jq -r '.response.servers[].gameport') + echo "${name}%%${ip}:${gameport}%%${qport}" + return 0 + fi + ip_table "$res" + return 0 + else + warn "Invalid IP" + fi fi done } @@ -953,8 +970,6 @@ list_mods(){ fi } connect_to_fav(){ - #TODO: test with broken/bogus fav - #TODO: test backing out of connection dialogs logger INFO "${FUNCNAME[0]}" local fav="$1" @@ -1126,7 +1141,7 @@ popup(){ 1100) pop "No results found." ;; 1200) pop "Timed out. Server may be temporarily offline or not responding to queries." ;; 1300) pop "No favorite server configured." ;; - 1400) pop "DZGUI must be run in Desktop Mode on Steam Deck, preferably via the desktop shortcut." ;; + 1400) pop "To install missing mods, run DZGUI via Desktop Mode on Steam Deck, preferably via the desktop shortcut." ;; esac } toggle_console_dl(){ @@ -1431,7 +1446,7 @@ choose_filters(){ if [[ $sels =~ Keyword ]]; then local search while true; do - search=$($steamsafe_zenity --entry --text="Search (case insensitive)" --width=500 --title="DZGUI" 2>/dev/null | awk '{print tolower($0)}') + search=$(edialog "Search (case insensitive)" | awk '{print tolower($0)}') [[ $? -eq 1 ]] && return 1 [[ -z $search ]] && warn "Cannot submit an empty keyword" [[ -n $search ]] && break @@ -1749,11 +1764,6 @@ check_architecture(){ if [[ -n "$cpu" ]]; then is_steam_deck=1 logger INFO "Setting architecture to 'Steam Deck'" - [[ $is_steam_deck -eq 1 ]] && test_display_mode - if [[ $gamemode -eq 1 ]]; then - popup 1400 && - exit 1 - fi else is_steam_deck=0 logger INFO "Setting architecture to 'desktop'" @@ -1839,7 +1849,11 @@ pdialog(){ $steamsafe_zenity --progress --pulsate --auto-close --title="DZGUI" --width=500 2>/dev/null } edialog(){ - $steamsafe_zenity --entry --text="$1" --width=500 --title="DZGUI" 2>/dev/null + if [[ $is_steam_deck -eq 1 ]] && [[ $(test_display_mode) == "gm" ]]; then + kdialog --inputbox "$1" --title "DZGUI" --geometry 500 2>/dev/null + else + $steamsafe_zenity --entry --text="$1" --width=500 --title="DZGUI" 2>/dev/null + fi } tdialog(){ $steamsafe_zenity --info --text="$1" --width=500 --title="DZGUI" 2>/dev/null From 3a99486cc223497b253bcca53cbdc1718ea14224 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 3 Dec 2023 17:22:52 +0900 Subject: [PATCH 07/19] feat: support kdialog --- dzgui.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 9b57304..42a96ce 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.0.4 +version=4.1.0.rc-3 aid=221100 game="dayz" @@ -32,9 +32,9 @@ sums_path="$helpers_path/sums.md5" scmd_file="$helpers_path/scmd.sh" km_helper_url="$releases_url/latlon" db_file="$releases_url/ips.csv.gz" -sums_url="$stable_url/helpers/sums.md5" -scmd_url="$stable_url/helpers/scmd.sh" -vdf2json_url="$stable_url/helpers/vdf2json.py" +sums_url="$testing_url/helpers/sums.md5" +scmd_url="$testing_url/helpers/scmd.sh" +vdf2json_url="$testing_url/helpers/vdf2json.py" forum_url="https://github.com/aclist/dztui/discussions" version_file="$config_path/versions" steamsafe_zenity="/usr/bin/zenity" @@ -132,6 +132,7 @@ items=( ) } warn(){ + logger WARN "$1" $steamsafe_zenity --info --title="DZGUI" --text="$1" --width=500 --icon-name="dialog-warning" 2>/dev/null } info(){ @@ -209,7 +210,7 @@ freedesktop_dirs(){ mkdir -p "$freedesktop_path" curl -s "$version_url" > "$sd_install_path/dzgui.sh" chmod +x "$sd_install_path/dzgui.sh" - img_url="$stable_url/images" + img_url="$testing_url/images" for i in dzgui grid.png hero.png logo.png; do curl -s "$img_url/$i" > "$sd_install_path/$i" done From a83933ee8f3d3f7845739cb5fce5b01371c9cc1c Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 3 Dec 2023 17:41:34 +0900 Subject: [PATCH 08/19] chore: add logging --- dzgui.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 42a96ce..9079d27 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0.rc-3 +version=4.1.0.rc-4 aid=221100 game="dayz" @@ -750,6 +750,8 @@ parse_ips(){ local lan_ip=$(<<< $ip awk -F: '{print $1}') local lan_qport=$(<<< $ip awk -F: '{print $2}') res=$(a2s $lan_ip $lan_qport info) + logger INFO "Local LAN response follows" + logger INFO "$res" if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq '.response|length') -eq 0 ]]; then warn "Failed to retrieve server metadata. Check IP:PORT combination and try again." return 1 From 72fc061abc2bb983ab02143518c8f68d753897b2 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 8 Dec 2023 02:59:50 +0900 Subject: [PATCH 09/19] fix: control flow --- dzgui.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 9079d27..f919964 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0.rc-4 +version=4.1.0.rc-5 aid=221100 game="dayz" @@ -749,13 +749,15 @@ parse_ips(){ fi local lan_ip=$(<<< $ip awk -F: '{print $1}') local lan_qport=$(<<< $ip awk -F: '{print $2}') + logger INFO "Given LAN IP was $lan_ip" + logger INFO "Given LAN port was $lan_qport" + logger INFO "LAN response follows" res=$(a2s $lan_ip $lan_qport info) - logger INFO "Local LAN response follows" - logger INFO "$res" if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq '.response|length') -eq 0 ]]; then warn "Failed to retrieve server metadata. Check IP:PORT combination and try again." return 1 fi + logger INFO "$res" ip_table "$res" return 0 else @@ -1250,6 +1252,7 @@ a2s(){ local ip="$1" local qport="$2" local mode="$3" + logger A2S "Querying '$ip:$qport' with mode '$mode'" python3 $helpers_path/query.py "$ip" "$qport" "$mode" } format_config_address(){ From ae14ebc327f27eb517f57a8852edf6c696671497 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:53:59 +0900 Subject: [PATCH 10/19] fix: parse local JSON response --- dzgui.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index f919964..4e2710b 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0.rc-5 +version=4.1.0.rc-6 aid=221100 game="dayz" @@ -753,7 +753,7 @@ parse_ips(){ logger INFO "Given LAN port was $lan_qport" logger INFO "LAN response follows" res=$(a2s $lan_ip $lan_qport info) - if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq '.response|length') -eq 0 ]]; then + if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq 'length') -eq 0 ]]; then warn "Failed to retrieve server metadata. Check IP:PORT combination and try again." return 1 fi From 93635d6af31cc00452ffbb8425d1bd2ff26aa56c Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:02:45 +0900 Subject: [PATCH 11/19] fix: format returned ip from local server --- dzgui.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 4e2710b..958e575 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0.rc-6 +version=4.1.0.rc-7 aid=221100 game="dayz" @@ -751,14 +751,18 @@ parse_ips(){ local lan_qport=$(<<< $ip awk -F: '{print $2}') logger INFO "Given LAN IP was $lan_ip" logger INFO "Given LAN port was $lan_qport" - logger INFO "LAN response follows" res=$(a2s $lan_ip $lan_qport info) if [[ ! $? -eq 0 ]] || [[ $(<<< $res jq 'length') -eq 0 ]]; then warn "Failed to retrieve server metadata. Check IP:PORT combination and try again." return 1 fi logger INFO "$res" - ip_table "$res" + local name=$(<<< $res jq -r '.address') + local ip=$(<<< $address awk -F: '{print $1}') + local gameport=$(<<< $address awk -F: '{print $2}') + local qport=$(<<< $res jq '.qport') + logger INFO "Found '${name}' at ${ip}:${gameport}:${qport}" + echo "${name}%%${ip}:${gameport}%%${qport}" return 0 else if validate_ip "$ip"; then From 34fcd5f3873de5b2d88646097222355690539f91 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Fri, 8 Dec 2023 22:04:21 +0900 Subject: [PATCH 12/19] fix: parse correct key --- dzgui.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 958e575..4db4d09 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -757,7 +757,8 @@ parse_ips(){ return 1 fi logger INFO "$res" - local name=$(<<< $res jq -r '.address') + local name=$(<<< $res jq -r '.name') + local address=$(<<< $res jq -r '.address') local ip=$(<<< $address awk -F: '{print $1}') local gameport=$(<<< $address awk -F: '{print $2}') local qport=$(<<< $res jq '.qport') From 08b9df450749ce9973a75edd313dea9a3b85567d Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sat, 9 Dec 2023 16:41:42 +0900 Subject: [PATCH 13/19] fix: use raw output --- dzgui.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index 4db4d09..c6b3a75 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0.rc-7 +version=4.1.0.rc-8 aid=221100 game="dayz" @@ -761,7 +761,7 @@ parse_ips(){ local address=$(<<< $res jq -r '.address') local ip=$(<<< $address awk -F: '{print $1}') local gameport=$(<<< $address awk -F: '{print $2}') - local qport=$(<<< $res jq '.qport') + local qport=$(<<< $res jq -r '.qport') logger INFO "Found '${name}' at ${ip}:${gameport}:${qport}" echo "${name}%%${ip}:${gameport}%%${qport}" return 0 From f4d153bad55e7fc78061b58aeaa1d18766ec39f7 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:07:32 +0900 Subject: [PATCH 14/19] chore: update changelog --- CHANGELOG.md | 25 +++++++++++++------------ news | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b7149..187a866 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,25 +1,26 @@ # Changelog -## 4.1.0 2023-12-03 -## Added +## [4.1.0] 2023-12-03 +### Added - Virtual keyboard support for text entry fields on Steam Deck Game Mode -- Validate LAN server IPs +- Validate and connect to LAN server IPs -#### 4.0.4 2023-12-23 -## Fixed +## [4.0.4] 2023-12-23 +### Fixed - Enforce version check for Python versions before 3.10 ## [4.0.3] 2023-11-22 -## Fixed +### Fixed - Query helper: backwards compatibility for pre-2021 versions of Python 3 ## [4.0.2] 2023-11-22 -## Fixed +### Fixed - Query helper not loading: fixed a remote link pointing to the wrong destination and added a checksum verification to ensure file is present ## [4.0.1] 2023-11-22 -## Fixed -- Emergency hotfix to remove build artifacts leaking into main script: if you updated DZGUI from 3.3.18 to 4.0.0 between 2023-11-22 15:00:02 and 2023-11-22 15:03:37 GMT, there is a small chance it will be unable to launch correctly. If so, please follow the instructions on the manual to reinstall. +### Fixed +- Emergency hotfix to remove build artifacts leaking into main script: if you updated DZGUI from 3.3.18 to 4.0.0 between 2023-11-22 15:00:02 and 2023-11-22 15:03:37 GMT, there is a small chance it + will be unable to launch correctly. If so, please follow the instructions on the manual to reinstall. ## [4.0.0] 2023-11-22 @@ -34,7 +35,7 @@ If you encounter any problems with this new release or with the migration of con Attention Fedora 38 users: problems with upstream GNOME packages causing crashes have been reported to GNOME development and a fix has been issued. You have the choice of compiling the zenity package from source or waiting until the latest version is merged into Fedora's package manager. -## Added +### Added - Change in game name: dynamically change your profile name via the Advanced Options menu - Connect by ID: supply a Battlemetrics ID to connect to a server; this can be used in lieu of the IP - Add by IP: supply a standard IP to add a server to your list; this can be used as a more direct way of saving servers @@ -42,7 +43,7 @@ from source or waiting until the latest version is merged into Fedora's package - Save connected server to favorites: prior to connecting, asks the user if they want to save this server for future use - Generate additional output when generating system logs -## Fixed +### Fixed - Rare cases where the keyword filter would not filter server results correctly - Handling of dialog exit signals: made it much more difficult to crash the application in rare cases when spamming input or returning from menus - Update menus in place: when toggling options in the Advanced Options menu, displays the current state/mode of the option for better readability into what option is currently enabled @@ -51,7 +52,7 @@ from source or waiting until the latest version is merged into Fedora's package - Fixed a rare case where dialogs would spawn twice during first-time setup - Properly remain inside of menus when looping where it would make sense to do so : e.g., Delete Servers list, Advanced Options -## Changed +### Changed - Query servers directly to reduce API hops: initial bootup and subsequent server queries should be considerably faster - Store complete IP:Port instead of server IDs - Make Battlemetrics API key optional: this is only used for the 'Connect by ID' and 'Add server by ID' methods and is not required. If you prefer, you can simply connect/add by IP. diff --git a/news b/news index 1108072..386f0c1 100644 --- a/news +++ b/news @@ -1 +1 @@ -NEWS: Major 4.0.0 update. Full details via the View Changelog menu option. +NEWS: Added support for LAN servers and restored Steam Deck Game Mode support. See changelog. From f28044051aead4835c49a8454ac94299f928431f Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:09:59 +0900 Subject: [PATCH 15/19] chore: update branch --- dzgui.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dzgui.sh b/dzgui.sh index c6b3a75..57168ee 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -32,9 +32,9 @@ sums_path="$helpers_path/sums.md5" scmd_file="$helpers_path/scmd.sh" km_helper_url="$releases_url/latlon" db_file="$releases_url/ips.csv.gz" -sums_url="$testing_url/helpers/sums.md5" -scmd_url="$testing_url/helpers/scmd.sh" -vdf2json_url="$testing_url/helpers/vdf2json.py" +sums_url="$stable_url/helpers/sums.md5" +scmd_url="$stable_url/helpers/scmd.sh" +vdf2json_url="$stable_url/helpers/vdf2json.py" forum_url="https://github.com/aclist/dztui/discussions" version_file="$config_path/versions" steamsafe_zenity="/usr/bin/zenity" @@ -210,7 +210,7 @@ freedesktop_dirs(){ mkdir -p "$freedesktop_path" curl -s "$version_url" > "$sd_install_path/dzgui.sh" chmod +x "$sd_install_path/dzgui.sh" - img_url="$testing_url/images" + img_url="$stable_url/images" for i in dzgui grid.png hero.png logo.png; do curl -s "$img_url/$i" > "$sd_install_path/$i" done From 875784a138b9cbdbcad21e8f5bac2c31b5841b58 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:10:24 +0900 Subject: [PATCH 16/19] Update CHANGELOG.md --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 187a866..639d7f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,8 +19,7 @@ ## [4.0.1] 2023-11-22 ### Fixed -- Emergency hotfix to remove build artifacts leaking into main script: if you updated DZGUI from 3.3.18 to 4.0.0 between 2023-11-22 15:00:02 and 2023-11-22 15:03:37 GMT, there is a small chance it - will be unable to launch correctly. If so, please follow the instructions on the manual to reinstall. +- Emergency hotfix to remove build artifacts leaking into main script: if you updated DZGUI from 3.3.18 to 4.0.0 between 2023-11-22 15:00:02 and 2023-11-22 15:03:37 GMT, there is a small chance it will be unable to launch correctly. If so, please follow the instructions on the manual to reinstall. ## [4.0.0] 2023-11-22 From 5259c2f48a4887ed874f439d2f557b736954f26c Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:11:00 +0900 Subject: [PATCH 17/19] chore: bump version --- dzgui.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dzgui.sh b/dzgui.sh index 57168ee..7673eca 100755 --- a/dzgui.sh +++ b/dzgui.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash set -o pipefail -version=4.1.0.rc-8 +version=4.1.0 aid=221100 game="dayz" From b7fc8c049cdaa576127daa3793a2ca05757d84e5 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 17 Dec 2023 07:19:07 +0900 Subject: [PATCH 18/19] chore: update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 639d7f9..c37d045 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Changelog ## [4.1.0] 2023-12-03 + +This update adds support for DayZ servers running on a local area network. To connect or add to your server list, supply the server IP and query port in the format IP:PORT. + +Support for Steam Deck Game Mode has also been restored, with a new dialog format that allows for virtual keyboard input. This should allow you to enter text in form fields by activating the Steam +button + X. In addition, you can unlock the mouse and keyboard input when launching DZGUI through Steam by using an internal binding provided by Steam Deck: long-press the three dots button on the +right of the device for three seconds to toggle the input state. This allows you to use mouse and keyboard-style bindings on Game Mode and vice versa. + ### Added - Virtual keyboard support for text entry fields on Steam Deck Game Mode - Validate and connect to LAN server IPs From c90f23756d03cfe527a76fd9d6cec9173e66fc3a Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Sun, 17 Dec 2023 11:12:02 +0900 Subject: [PATCH 19/19] Update CHANGELOG.md --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c37d045..db81c5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,7 @@ This update adds support for DayZ servers running on a local area network. To connect or add to your server list, supply the server IP and query port in the format IP:PORT. -Support for Steam Deck Game Mode has also been restored, with a new dialog format that allows for virtual keyboard input. This should allow you to enter text in form fields by activating the Steam -button + X. In addition, you can unlock the mouse and keyboard input when launching DZGUI through Steam by using an internal binding provided by Steam Deck: long-press the three dots button on the -right of the device for three seconds to toggle the input state. This allows you to use mouse and keyboard-style bindings on Game Mode and vice versa. +Support for Steam Deck Game Mode has also been restored, with a new dialog format that allows for virtual keyboard input. This should allow you to enter text in form fields by activating the Steam button + X. In addition, you can unlock the mouse and keyboard input when launching DZGUI through Steam by using an internal binding provided by Steam Deck: long-press the three dots button on the right of the device for three seconds to toggle the input state. This allows you to use mouse and keyboard-style bindings on Game Mode and vice versa. ### Added - Virtual keyboard support for text entry fields on Steam Deck Game Mode