Skip to content

Commit c6b169d

Browse files
committed
improvements
1 parent b64864c commit c6b169d

File tree

13 files changed

+170
-40
lines changed

13 files changed

+170
-40
lines changed

Cargo.lock

Lines changed: 13 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ members = [
55
]
66

77
[package]
8-
name = "ryemage"
8+
name = "ryemage_bot"
99
version = "0.1.0"
1010
edition = "2021"
1111
authors = ["ideeockus"]
1212

1313
[dependencies]
1414
teloxide = { version = "0.12", features = ["macros"] }
1515
log = "0.4"
16-
pretty_env_logger = "0.5.0"
16+
#pretty_env_logger = "0.5.0"
17+
env_logger = "0.10"
1718
tokio = { version = "1.31", features = ["full"] }
1819
tg_controller = { path="tg_controller" }
1920

Dockerfile

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
FROM ekidd/rust-musl-builder:stable as builder
2+
3+
RUN USER=root cargo new --bin ryemage_bot
4+
WORKDIR ./ryemage_bot
5+
COPY ./Cargo.lock ./Cargo.lock
6+
COPY ./Cargo.toml ./Cargo.toml
7+
RUN cargo build --release
8+
RUN rm src/*.rs
9+
10+
ADD . ./
11+
12+
RUN rm ./target/x86_64-unknown-linux-musl/release/deps/ryemage_bot*
13+
RUN cargo build --release
14+
15+
16+
FROM alpine:latest
17+
18+
ARG APP=/opt/
19+
20+
#EXPOSE 8000
21+
22+
#ENV TZ=Etc/UTC \
23+
# APP_USER=appuser
24+
#
25+
#RUN addgroup -S $APP_USER \
26+
# && adduser -S -g $APP_USER $APP_USER
27+
28+
RUN apk update \
29+
&& apk add --no-cache ca-certificates tzdata \
30+
&& rm -rf /var/cache/apk/*
31+
32+
COPY --from=builder /home/rust/src/ryemage_bot/target/x86_64-unknown-linux-musl/release/ryemage_bot ${APP}/ryemage_bot
33+
34+
#RUN chown -R $APP_USER:$APP_USER ${APP}
35+
36+
#USER $APP_USER
37+
WORKDIR ${APP}
38+
39+
CMD ["./ryemage_bot"]

image_processing/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ rstar = "0.11"
1515
log = "0.4"
1616
#pretty_env_logger = "0.5.0"
1717
#tokio = { version = "1.31", features = ["full"] }
18+
memmap2 = "0.7"
1819

1920
[lib]
2021
name = "image_processing"

image_processing/src/lib.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use log::{debug, info};
88
use crate::errors::{ImageProcessingError, ImageProcessingResult};
99
use crate::palette_extraction::{create_lab_palette_mapper, create_rgb_palette_mapper, create_swap_palette_mapper};
1010
use crate::palette_operations::PaletteOperations;
11-
use crate::utils::load_image_from_file;
11+
use crate::utils::{load_image_from_file, mmap_image_from_file};
1212

1313
mod palette_extraction;
1414
mod errors;
@@ -48,24 +48,31 @@ pub fn perform_action_on_files(
4848
let start = SystemTime::now();
4949
debug!("start perform actions on files");
5050

51-
let palette_image = load_image_from_file(palette_image)?;
52-
let img_to_process = load_image_from_file(img_to_process)?;
51+
let palette_image = mmap_image_from_file(palette_image)?;
52+
// let palette_image = load_image_from_file(palette_image)?;
53+
debug!("palette image loaded");
54+
let img_to_process = mmap_image_from_file(img_to_process)?;
55+
// let img_to_process = load_image_from_file(img_to_process)?;
56+
debug!("image to process loaded");
5357

5458
let processed_image = match mode {
5559
PaletteMapperMode::SimpleLab => {
5660
let color_mapper = create_lab_palette_mapper(palette_image, DEFAULT_QUANTITY);
61+
debug!("palette extracted");
5762
let mut img_to_process = img_to_process.to_rgb8();
5863
img_to_process.apply_palette_to_image(color_mapper);
5964
img_to_process
6065
}
6166
PaletteMapperMode::SimpleRgb => {
6267
let color_mapper = create_rgb_palette_mapper(palette_image, DEFAULT_QUANTITY);
68+
debug!("palette extracted");
6369
let mut img_to_process = img_to_process.to_rgb8();
6470
img_to_process.apply_palette_to_image(color_mapper);
6571
img_to_process
6672
}
6773
PaletteMapperMode::RgbDither => {
6874
let color_mapper = create_rgb_palette_mapper(palette_image, DEFAULT_QUANTITY);
75+
debug!("palette extracted");
6976
let mut img_to_process = img_to_process.to_rgb8();
7077
img_to_process.dither_with_palette(color_mapper);
7178
img_to_process
@@ -74,6 +81,7 @@ pub fn perform_action_on_files(
7481
PaletteMapperMode::RgbSwap => {
7582
let color_mapper =
7683
create_swap_palette_mapper(&img_to_process, &palette_image, DEFAULT_QUANTITY);
84+
debug!("palette extracted");
7785
let mut img_to_process = img_to_process.to_rgb8();
7886
img_to_process.apply_palette_to_image(color_mapper);
7987
img_to_process
@@ -84,6 +92,7 @@ pub fn perform_action_on_files(
8492
return Err(ImageProcessingError::UnsupportedMode);
8593
}
8694
};
95+
debug!("image processing finished");
8796

8897
let result = Vec::with_capacity(processed_image.len());
8998
let mut result = Cursor::new(result);

image_processing/src/utils.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use std::{cmp, io};
55

66
use image::imageops::FilterType;
77
use image::io::Reader as ImageReader;
8-
use image::DynamicImage;
8+
use image::{DynamicImage, EncodableLayout};
9+
use log::debug;
910

1011
const IMAGE_SIZE_LIMIT: (u32, u32) = (1280, 1280);
1112
// const IMAGE_SIZE_LIMIT: (u32, u32) = (512, 512);
@@ -35,17 +36,35 @@ pub fn downscale_to_size(
3536
None
3637
}
3738

39+
#[allow(unused)]
3840
pub fn load_image_from_file<P>(path: P) -> io::Result<DynamicImage>
39-
where
40-
P: AsRef<Path>,
41+
where
42+
P: AsRef<Path>,
4143
{
4244
let fd = File::open(path)?;
4345
let file_size = fd.metadata().map(|m| m.len()).ok();
44-
println!("file size is {:?}", file_size);
46+
debug!("file size is {:?}", file_size);
4547

4648
load_image_from_unknown_reader(BufReader::new(fd), file_size)
4749
}
4850

51+
#[allow(unused)]
52+
pub fn mmap_image_from_file<P>(path: P) -> io::Result<DynamicImage>
53+
where
54+
P: AsRef<Path>,
55+
{
56+
use memmap2::Mmap;
57+
58+
let fd = File::open(path)?;
59+
let file_size = fd.metadata().map(|m| m.len()).ok();
60+
debug!("file size is {:?}", file_size);
61+
62+
let file_mmap = unsafe { Mmap::map(&fd)? };
63+
64+
65+
load_image_from_unknown_reader(BufReader::new(file_mmap.as_bytes()), file_size)
66+
}
67+
4968
pub fn load_image_from_unknown_reader(
5069
mut reader: impl BufRead,
5170
size: Option<u64>,
@@ -75,9 +94,9 @@ pub fn load_image_from_unknown_reader(
7594

7695
#[allow(unused)]
7796
pub fn save_image<P, B>(path: P, processed_image: B) -> io::Result<()>
78-
where
79-
P: AsRef<Path>,
80-
B: AsRef<[u8]>,
97+
where
98+
P: AsRef<Path>,
99+
B: AsRef<[u8]>,
81100
{
82101
let mut save_file = File::create(path)?;
83102
save_file.write_all(processed_image.as_ref())

src/main.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
1-
use pretty_env_logger;
1+
use std::io::Write;
2+
3+
use env_logger;
4+
use env_logger::{Builder, TimestampPrecision};
5+
use log::LevelFilter;
6+
27
use tg_controller::run_polling;
38

49
#[tokio::main]
510
async fn main() {
6-
pretty_env_logger::init();
11+
Builder::new()
12+
.filter_level(LevelFilter::Trace)
13+
// .format(|buf, record| writeln!(buf, "{} - {}", record.level(), record.args()))
14+
// .filter(Some("ryemage_bot"), LevelFilter::Trace)
15+
.format_timestamp(Some(TimestampPrecision::Nanos))
16+
.init();
17+
718
run_polling().await;
819
}

tg_controller/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ teloxide = { version = "0.12", features = ["macros"] }
1515
log = "0.4"
1616
pretty_env_logger = "0.5.0"
1717
tokio = { version = "1.31", features = ["full"] }
18+
rayon = "1.7"
19+
1820
image_processing = { path="../image_processing" }

tg_controller/src/handlers/base.rs

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
1+
use std::sync::atomic::{AtomicUsize, Ordering};
2+
13
use log::{debug, error};
24
use teloxide::prelude::*;
35
use teloxide::types::{ChatAction, InputFile, ParseMode};
46

57
use image_processing::perform_action_on_files;
8+
69
use crate::{get_downloads_dir, State};
710
use crate::handlers::{download_file_by_id, HandlerResult, log_request, mode_from_mode_name, MyDialogue};
811
use crate::keyboards::*;
912
use crate::ryemage_settings::UserSettings;
1013

14+
static GLOBAL_USER_COUNTER: AtomicUsize = AtomicUsize::new(0);
15+
16+
1117
pub async fn handle_base_action(
1218
bot: Bot,
1319
dialogue: MyDialogue,
@@ -109,7 +115,7 @@ pub async fn handle_palette_image(
109115
msg.chat.id,
110116
"My current state - waiting picture to palette extraction",
111117
)
112-
.await?;
118+
.await?;
113119
}
114120
}
115121

@@ -144,7 +150,7 @@ pub async fn handle_process_mode(
144150
q.from.id,
145151
"Hmmm. Did you press button with sign \"Build Palette\"?",
146152
)
147-
.await?;
153+
.await?;
148154
}
149155

150156
if let Some(msg) = q.message {
@@ -161,18 +167,18 @@ pub async fn handle_process_mode(
161167
q.from.id,
162168
format!("Mode {mode} in development stage. Try a bit later.."),
163169
)
164-
.await?;
170+
.await?;
165171
bot.send_message(
166172
q.from.id,
167173
format!("I see you have uploaded file {process_file_id} and have palette"),
168174
)
169-
.await?;
175+
.await?;
170176
}
171-
Some(mode) => {
177+
Some(mode_str) => {
172178
let palette_file_name = get_downloads_dir().join(palette_file_id);
173179
let process_file_name = get_downloads_dir().join(process_file_id);
174180

175-
let mode = match mode_from_mode_name(mode) {
181+
let mode = match mode_from_mode_name(mode_str) {
176182
None => {
177183
bot.send_message(q.from.id, "Unknown mode, contact the developer")
178184
.await?;
@@ -181,11 +187,15 @@ pub async fn handle_process_mode(
181187
Some(mode) => mode,
182188
};
183189

190+
// todo run in thread pool
184191
let processed = perform_action_on_files(&palette_file_name, &process_file_name, mode);
192+
// rayon::spawn();
185193

186194
match processed {
187195
Ok(v) => {
188-
bot.send_photo(q.from.id, InputFile::memory(v)).await?;
196+
let mut message = bot.send_photo(q.from.id, InputFile::memory(v));
197+
message.caption = Some(mode_str.to_string());
198+
message.await?;
189199
}
190200
Err(err) => {
191201
error!("Image processing error {}", err);
@@ -194,7 +204,7 @@ pub async fn handle_process_mode(
194204
q.from.id,
195205
"Error occurred during image processing. Please contact the developer",
196206
)
197-
.await?;
207+
.await?;
198208
}
199209
}
200210
}
@@ -229,11 +239,14 @@ pub async fn view_settings(
229239
.await?;
230240
}
231241
Some(USER_GUIDE) => {
232-
bot.send_message(
233-
msg.chat.id,
234-
"There is nothing here. Wait for the rye release.",
235-
)
236-
.await?;
242+
let mut message = bot.send_message(msg.chat.id, BOT_HELP_TEXT_MD);
243+
message.parse_mode = Some(ParseMode::MarkdownV2);
244+
message.await?;
245+
// bot.send_message(
246+
// msg.chat.id,
247+
// "There is nothing here. Wait for the rye release.",
248+
// )
249+
// .await?;
237250
}
238251
Some(THIRD_BUTTON) => {
239252
bot.send_message(msg.chat.id, "42 - 3 = 20").await?;
@@ -243,7 +256,7 @@ pub async fn view_settings(
243256
msg.chat.id,
244257
"It would be better if you pressed the third button than what you are doing now",
245258
)
246-
.await?;
259+
.await?;
247260
}
248261
}
249262

0 commit comments

Comments
 (0)