diff --git a/Client/.gitignore b/Client/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/Client/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Client/.idea/.gitignore b/Client/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/Client/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Client/.idea/gradle.xml b/Client/.idea/gradle.xml new file mode 100644 index 0000000..ff6204c --- /dev/null +++ b/Client/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/Client/.idea/kotlinc.xml b/Client/.idea/kotlinc.xml new file mode 100644 index 0000000..8d81632 --- /dev/null +++ b/Client/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Client/.idea/misc.xml b/Client/.idea/misc.xml new file mode 100644 index 0000000..8685da8 --- /dev/null +++ b/Client/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Client/.idea/vcs.xml b/Client/.idea/vcs.xml new file mode 100644 index 0000000..288b36b --- /dev/null +++ b/Client/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Client/.run/desktop.run.xml b/Client/.run/desktop.run.xml new file mode 100644 index 0000000..4f43224 --- /dev/null +++ b/Client/.run/desktop.run.xml @@ -0,0 +1,21 @@ + + + + + + + true + + + \ No newline at end of file diff --git a/Client/build.gradle.kts b/Client/build.gradle.kts new file mode 100644 index 0000000..553fa17 --- /dev/null +++ b/Client/build.gradle.kts @@ -0,0 +1,35 @@ +import org.jetbrains.compose.desktop.application.dsl.TargetFormat + +plugins { + kotlin("jvm") + id("org.jetbrains.compose") +} + +group = "me.joshuafhiggins" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + google() +} + +dependencies { + // Note, if you develop a library, you should use compose.desktop.common. + // compose.desktop.currentOs should be used in launcher-sourceSet + // (in a separate module for demo project and in testMain). + // With compose.desktop.common you will also lose @Preview functionality + implementation(compose.desktop.currentOs) +} + +compose.desktop { + application { + mainClass = "MainKt" + + nativeDistributions { + targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) + packageName = "Client" + packageVersion = "1.0.0" + } + } +} diff --git a/Client/gradle.properties b/Client/gradle.properties new file mode 100644 index 0000000..98aed13 --- /dev/null +++ b/Client/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +kotlin.code.style=official +kotlin.version=1.9.22 +compose.version=1.6.0 diff --git a/Client/gradle/wrapper/gradle-wrapper.jar b/Client/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..249e583 Binary files /dev/null and b/Client/gradle/wrapper/gradle-wrapper.jar differ diff --git a/Client/gradle/wrapper/gradle-wrapper.properties b/Client/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..db9a6b8 --- /dev/null +++ b/Client/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/Client/gradlew b/Client/gradlew new file mode 100644 index 0000000..1b6c787 --- /dev/null +++ b/Client/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/Client/gradlew.bat b/Client/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/Client/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Client/settings.gradle.kts b/Client/settings.gradle.kts new file mode 100644 index 0000000..62a1ae6 --- /dev/null +++ b/Client/settings.gradle.kts @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + google() + gradlePluginPortal() + mavenCentral() + } + + plugins { + kotlin("jvm").version(extra["kotlin.version"] as String) + id("org.jetbrains.compose").version(extra["compose.version"] as String) + } +} + +rootProject.name = "Client" diff --git a/Client/src/main/kotlin/Main.kt b/Client/src/main/kotlin/Main.kt new file mode 100644 index 0000000..fed3f24 --- /dev/null +++ b/Client/src/main/kotlin/Main.kt @@ -0,0 +1,31 @@ +import androidx.compose.desktop.ui.tooling.preview.Preview +import androidx.compose.material.Button +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.window.Window +import androidx.compose.ui.window.application + +@Composable +@Preview +fun App() { + var text by remember { mutableStateOf("Hello, World!") } + + MaterialTheme { + Button(onClick = { + text = "Hello, Desktop!" + }) { + Text(text) + } + } +} + +fun main() = application { + Window(onCloseRequest = ::exitApplication) { + App() + } +} diff --git a/Server/.gitignore b/Server/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/Server/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Server/.idea/.gitignore b/Server/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/Server/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Server/.idea/inspectionProfiles/Project_Default.xml b/Server/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..df543e3 --- /dev/null +++ b/Server/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/Server/.idea/kotlinc.xml b/Server/.idea/kotlinc.xml new file mode 100644 index 0000000..5cba058 --- /dev/null +++ b/Server/.idea/kotlinc.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/Server/.idea/libraries/KotlinJavaRuntime.xml b/Server/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 0000000..2985bc3 --- /dev/null +++ b/Server/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Server/.idea/misc.xml b/Server/.idea/misc.xml new file mode 100644 index 0000000..4444b22 --- /dev/null +++ b/Server/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Server/.idea/modules.xml b/Server/.idea/modules.xml new file mode 100644 index 0000000..7ec00e1 --- /dev/null +++ b/Server/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Server/.idea/vcs.xml b/Server/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/Server/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Server/Server.iml b/Server/Server.iml new file mode 100644 index 0000000..43dd653 --- /dev/null +++ b/Server/Server.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Server/src/Main.kt b/Server/src/Main.kt new file mode 100644 index 0000000..7265465 --- /dev/null +++ b/Server/src/Main.kt @@ -0,0 +1,14 @@ +//TIP To Run code, press or +// click the icon in the gutter. +fun main() { + val name = "Kotlin" + //TIP Press with your caret at the highlighted text + // to see how IntelliJ IDEA suggests fixing it. + println("Hello, " + name + "!") + + for (i in 1..5) { + //TIP Press to start debugging your code. We have set one breakpoint + // for you, but you can always add more by pressing . + println("i = $i") + } +} \ No newline at end of file diff --git a/client/Cargo.toml b/client/Cargo.toml deleted file mode 100644 index ad90271..0000000 --- a/client/Cargo.toml +++ /dev/null @@ -1,33 +0,0 @@ -[package] -name = "realm_client" -version = "0.1.0" -edition = "2021" - -[package.metadata.docs.rs] -all-features = true -targets = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"] - -[dependencies] -realm_server = { version = "0.1", path = "../server" } - -log = "0.4" -tarpc = { version = "0.34.0", features = ["full"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -uuid = { version = "1.8", features = ["v4", "fast-rng", "serde"] } -directories-next = "2.0" -tracing-subscriber = "0.3" -async-std = "1.12.0" -once_cell = "1.19.0" -env_logger = "0.11.3" - -[dependencies.iced] -git = "https://github.com/iced-rs/iced.git" -rev = "e6d0b3bda5042a1017a5944a5227c97e0ed6caf9" - -[profile.release] -opt-level = 2 # fast and small wasm - -# Optimize all dependencies even in debug builds: -[profile.dev.package."*"] -opt-level = 2 diff --git a/client/assets/icons.ttf b/client/assets/icons.ttf deleted file mode 100644 index 7b65fd3..0000000 Binary files a/client/assets/icons.ttf and /dev/null differ diff --git a/client/iced-todos.desktop b/client/iced-todos.desktop deleted file mode 100644 index dd7ce53..0000000 --- a/client/iced-todos.desktop +++ /dev/null @@ -1,4 +0,0 @@ -[Desktop Entry] -Name=Todos - Iced -Exec=iced-todos -Type=Application diff --git a/client/index.html b/client/index.html deleted file mode 100644 index ee5570f..0000000 --- a/client/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - Todos - Iced - - - - - - diff --git a/client/src/app.rs b/client/src/app.rs deleted file mode 100644 index 0fa1b83..0000000 --- a/client/src/app.rs +++ /dev/null @@ -1,161 +0,0 @@ -use iced::alignment::{self, Alignment}; -use iced::{keyboard, Renderer, Theme}; -use iced::widget::{ - self, button, center, checkbox, column, container, keyed_column, row, - scrollable, text, text_input, Text, -}; -use iced::window; -use iced::{Command, Element, Font, Length, Subscription}; -use iced::futures::StreamExt; - -use once_cell::sync::Lazy; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; -use realm_server::types::Message; - -static INPUT_ID: Lazy = Lazy::new(text_input::Id::unique); - -#[derive(Default, Debug)] -pub struct RealmApp { - input_value: String, - messages: Vec, -} - -#[derive(Debug, Clone)] -pub enum Events { - // Loaded(Result), - // Saved(Result<(), SaveError>), - InputChanged(String), - SendMessage, -} - -impl RealmApp { - pub fn load() -> Command { - //Command::perform(SavedState::load(), Events::Loaded) - Command::none() - } - - pub fn title(&self) -> String { - "Realm Chat".to_string() - } - - pub fn update(&mut self, event: Events) -> Command { - let command = match event { - Events::InputChanged(value) => { - self.input_value = value; - - Command::none() - } - Events::SendMessage => { - self.messages.push(Message { - guid: "".to_string(), - text: Some(self.input_value.clone()), - attachments: None, - reply_to_guid: None, - reaction_emoji: None, - redact: false, - }); - - //TODO - self.input_value.clear(); - Command::none() - } - }; - - Command::batch(vec![command]) - } - - pub fn view(&self) -> Element { - let input = text_input("New Message", &*self.input_value) - .id(INPUT_ID.clone()) - .on_input(Events::InputChanged) - .on_submit(Events::SendMessage) - //.padding(15) - .size(12); - - let mut all_messages: String = String::new(); - for message in self.messages.iter() { - match message.clone().text { - None => {} - Some(text) => { - all_messages = format!("{}{}\n", all_messages, text) - } - } - } - - let messages = text(all_messages) - .size(12) - .width(Length::Fill) - .height(600) - .horizontal_alignment(alignment::Horizontal::Left); - - // let content = column![title, input] - // .spacing(20); - //.max_width(800); - - column!(scrollable( - container(messages).center_x(Length::Fill).padding(40)), input).into() - } - - pub fn subscription(&self) -> Subscription { - use keyboard::key; - - keyboard::on_key_press(|key, modifiers| { - let keyboard::Key::Named(key) = key else { - return None; - }; - - match (key, modifiers) { - // (key::Named::Tab, _) => Some(Events::TabPressed { - // shift: modifiers.shift(), - // }), - // (key::Named::ArrowUp, keyboard::Modifiers::SHIFT) => { - // Some(Events::ToggleFullscreen(window::Mode::Fullscreen)) - // } - // (key::Named::ArrowDown, keyboard::Modifiers::SHIFT) => { - // Some(Events::ToggleFullscreen(window::Mode::Windowed)) - // } - _ => None, - } - }) - } -} - -fn loading_message<'a>() -> Element<'a, Events> { - center( - text("Loading...") - .horizontal_alignment(alignment::Horizontal::Center) - .size(50), - ) - .into() -} - -fn empty_message(message: &str) -> Element<'_, Events> { - center( - text(message) - .width(Length::Fill) - .size(25) - .horizontal_alignment(alignment::Horizontal::Center) - .color([0.7, 0.7, 0.7]), - ) - .height(200) - .into() -} - -// Fonts -const ICONS: Font = Font::with_name("Iced-Todos-Icons"); - -fn icon(unicode: char) -> Text<'static> { - text(unicode.to_string()) - .font(ICONS) - .width(20) - .horizontal_alignment(alignment::Horizontal::Center) -} - -fn edit_icon() -> Text<'static> { - icon('\u{F303}') -} - -fn delete_icon() -> Text<'static> { - icon('\u{F1F8}') -} \ No newline at end of file diff --git a/client/src/components.rs b/client/src/components.rs deleted file mode 100644 index e69de29..0000000 diff --git a/client/src/lib.rs b/client/src/lib.rs deleted file mode 100644 index 62cc189..0000000 --- a/client/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod app; -mod components; -pub use app::RealmApp; \ No newline at end of file diff --git a/client/src/main.rs b/client/src/main.rs deleted file mode 100644 index b2b3beb..0000000 --- a/client/src/main.rs +++ /dev/null @@ -1,11 +0,0 @@ -use realm_client::RealmApp; - -pub fn main() -> iced::Result { - tracing_subscriber::fmt::init(); - iced::program(RealmApp::title, RealmApp::update, RealmApp::view) - .load(RealmApp::load) - .subscription(RealmApp::subscription) - .font(include_bytes!("../assets/icons.ttf").as_slice()) - .window_size((1280.0, 720.0)) - .run() -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..5b16745 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 21 00:57:31 EDT 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/server/Cargo.toml b/server/Cargo.toml deleted file mode 100644 index cde8220..0000000 --- a/server/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "realm_server" -version = "0.1.0" -edition = "2021" - -[dependencies] -anyhow = "1.0" -futures = "0.3" -tarpc = { version = "0.34.0", features = ["full"] } -tokio = { version = "1.0", features = ["macros", "net", "rt-multi-thread"] } -tracing = "0.1.40" -clap = { version = "4.5.7", features = ["derive"] } \ No newline at end of file diff --git a/server/src/lib.rs b/server/src/lib.rs deleted file mode 100644 index ce433f0..0000000 --- a/server/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod server; -pub mod types; \ No newline at end of file diff --git a/server/src/main.rs b/server/src/main.rs deleted file mode 100644 index f09d6ef..0000000 --- a/server/src/main.rs +++ /dev/null @@ -1,45 +0,0 @@ -use std::future::Future; -use std::net::{IpAddr, Ipv6Addr}; -use futures::future::{self}; -use futures::StreamExt; -use tarpc::{ - server::{Channel}, - tokio_serde::formats::Json, -}; -use tarpc::server::incoming::Incoming; -use tarpc::server::BaseChannel; -use realm_server::server::RealmChatServer; -use realm_server::types::RealmChat; - -async fn spawn(fut: impl Future + Send + 'static) { - tokio::spawn(fut); -} - -#[tokio::main] -async fn main() -> anyhow::Result<()> { - let server_addr = (IpAddr::V6(Ipv6Addr::LOCALHOST), 5051); - - // JSON transport is provided by the json_transport tarpc module. It makes it easy - // to start up a serde-powered json serialization strategy over TCP. - let mut listener = tarpc::serde_transport::tcp::listen(&server_addr, Json::default).await?; - tracing::info!("Listening on port {}", listener.local_addr().port()); - listener.config_mut().max_frame_length(usize::MAX); - listener - // Ignore accept errors. - .filter_map(|r| future::ready(r.ok())) - .map(BaseChannel::with_defaults) - // Limit channels to 1 per IP. - .max_channels_per_key(1, |t| t.transport().peer_addr().unwrap().ip()) - // serve is generated by the service attribute. It takes as input any type implementing - // the generated World trait. - .map(|channel| { - let server = RealmChatServer(channel.transport().peer_addr().unwrap()); - channel.execute(server.serve()).for_each(spawn) - }) - // Max 10 channels. - .buffer_unordered(10) - .for_each(|_| async {}) - .await; - - Ok(()) -} \ No newline at end of file diff --git a/server/src/server.rs b/server/src/server.rs deleted file mode 100644 index 4e020bc..0000000 --- a/server/src/server.rs +++ /dev/null @@ -1,14 +0,0 @@ -use std::net::SocketAddr; -use futures::future; -use futures::future::Ready; -use tarpc::context::Context; -use crate::types::RealmChat; - -#[derive(Clone)] -pub struct RealmChatServer(pub SocketAddr); - -impl RealmChat for RealmChatServer { - fn test(self, context: Context, name: String) -> Ready { - future::ready(format!("Hello, {name}!")) - } -} \ No newline at end of file diff --git a/server/src/types.rs b/server/src/types.rs deleted file mode 100644 index 43d5197..0000000 --- a/server/src/types.rs +++ /dev/null @@ -1,20 +0,0 @@ -#[tarpc::service] -pub trait RealmChat { - async fn test(name: String) -> String; -} - -#[derive(Debug, Clone)] -pub struct Message { - pub guid: String, - pub text: Option, - pub attachments: Option>, - pub reply_to_guid: Option, - pub reaction_emoji: Option, - pub redact: bool, -} - -#[derive(Debug, Clone)] -pub struct Attachment { - pub guid: String, - //TODO -} \ No newline at end of file