Initial commit

This commit is contained in:
Sijmen 2023-11-06 09:41:20 +01:00
commit 18a5892371
6 changed files with 3600 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

3432
Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

13
Cargo.toml Normal file
View file

@ -0,0 +1,13 @@
[package]
name = "cri"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
color-eyre = "0.6.2"
futures = "0.3.29"
iced = { version = "0.10.0", features = ["tokio"] }
irc = "0.15.0"
tokio = { version = "1.33.0", features = ["full"] }

1
rust-toolchain Normal file
View file

@ -0,0 +1 @@
stable

49
shell.nix Normal file
View file

@ -0,0 +1,49 @@
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell rec {
buildInputs = with pkgs; [
cargo
clang
llvmPackages.bintools
watchexec
pkg-config
openssl
libxkbcommon
libGL
# WINIT_UNIX_BACKEND=wayland
wayland
# WINIT_UNIX_BACKEND=x11
xorg.libXcursor
xorg.libXrandr
xorg.libXi
xorg.libX11
];
RUSTC_VERSION = pkgs.lib.readFile ./rust-toolchain;
# https://github.com/rust-lang/rust-bindgen#environment-variables
LIBCLANG_PATH = pkgs.lib.makeLibraryPath [ pkgs.llvmPackages_latest.libclang.lib ];
shellHook = ''
export PATH=$PATH:''${CARGO_HOME:-~/.cargo}/bin
export PATH=$PATH:''${RUSTUP_HOME:-~/.rustup}/toolchains/$RUSTC_VERSION-x86_64-unknown-linux-gnu/bin/
'';
# Add libvmi precompiled library to rustc search path
RUSTFLAGS = (builtins.map (a: ''-L ${a}/lib'') [
# pkgs.libvmi
]);
# Add libvmi, glibc, clang, glib headers to bindgen search path
BINDGEN_EXTRA_CLANG_ARGS =
# Includes with normal include path
(builtins.map (a: ''-I"${a}/include"'') [
# pkgs.libvmi
# pkgs.glibc.dev
])
# Includes with special directory paths
++ [
''-I"${pkgs.llvmPackages_latest.libclang.lib}/lib/clang/${pkgs.llvmPackages_latest.libclang.version}/include"''
''-I"${pkgs.glib.dev}/include/glib-2.0"''
''-I${pkgs.glib.out}/lib/glib-2.0/include/''
];
LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath buildInputs}";
}

104
src/main.rs Normal file
View file

@ -0,0 +1,104 @@
use std::cell::RefCell;
use futures::prelude::*;
use irc::client::prelude::*;
use color_eyre::eyre::Result;
use iced::theme::Theme;
use iced::widget::{container, text};
use iced::{executor, Application, Settings};
use tokio::sync::mpsc::{self, UnboundedReceiver, UnboundedSender};
async fn irc_loop(sender: UnboundedSender<irc::proto::Message>) -> Result<()> {
let config = Config {
nickname: Some("cri".to_string()),
server: Some("vijf.life".to_string()),
channels: vec!["#h".to_string()],
..Config::default()
};
let mut client = Client::from_config(config).await?;
client.identify()?;
let mut stream = client.stream()?;
while let Some(message) = stream.next().await.transpose()? {
sender.send(message)?;
}
Ok(())
}
#[tokio::main]
async fn main() -> Result<()> {
color_eyre::install()?;
let (sender, receiver) = mpsc::unbounded_channel::<irc::proto::Message>();
tokio::task::spawn(irc_loop(sender));
Cri::run(Settings::with_flags(CriFlags { receiver }))?;
Ok(())
}
struct Cri {
pub receiver: RefCell<Option<UnboundedReceiver<irc::proto::Message>>>,
pub irc_message: String,
}
struct CriFlags {
pub receiver: UnboundedReceiver<irc::proto::Message>,
}
#[derive(Debug)]
enum Message {
IrcMessageReceived(irc::proto::Message),
}
impl Application for Cri {
type Executor = executor::Default;
type Message = Message;
type Theme = Theme;
type Flags = CriFlags;
fn new(flags: Self::Flags) -> (Self, iced::Command<Self::Message>) {
(
Self {
receiver: RefCell::new(Some(flags.receiver)),
irc_message: String::new(),
},
iced::Command::none(),
)
}
fn title(&self) -> String {
"cri".to_string()
}
fn update(&mut self, message: Self::Message) -> iced::Command<Self::Message> {
match message {
Message::IrcMessageReceived(message) => {
let message = message.to_string().replace("\r", "");
self.irc_message += &message;
}
}
iced::Command::none()
}
fn subscription(&self) -> iced::Subscription<Self::Message> {
iced::subscription::unfold(
"irc message",
self.receiver.take(),
move |mut receiver| async move {
let message = receiver.as_mut().unwrap().recv().await.unwrap();
(Message::IrcMessageReceived(message), receiver)
},
)
}
fn view(&self) -> iced::Element<'_, Self::Message, iced::Renderer<Self::Theme>> {
let log = text(self.irc_message.clone());
container(log).into()
}
}