diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c95f626 --- /dev/null +++ b/Makefile @@ -0,0 +1,145 @@ +# NMAKE code here \ +!ifndef 0 # \ +MV=move /Y # \ +RM=del /F/Q # \ +RMDIR=rmdir /S/Q # \ +CP=copy /B/Y # \ +PS=\ # \ +CAT=type # \ +SEVENZ="C:\Program Files\7-Zip\7z.exe" -y # \ +SDL2LIB=SDL2.lib # \ +SDL2IMGLIB=SDL2_image.lib # \ +CCOBJ=cl /c /Iinclude # \ +OBJOUT=/Fo#\ +EXEOUT=/Fe#\ +CCEXE=cl /Iinclude # \ +LDFLAGS=SDL2main.lib SDL2.lib shell32.lib /link /subsystem:windows # \ +!else +# Make code here +MV=mv -f +RM=rm -f +CP=cp -f +CAT=cat +PS=/ +SEVENZ=7z -y +RMDIR=rm -f +SDL2LIB=SDL2.a +SDL2IMGLIB=SDL2_image.so +CCOBJ=gcc -c -Iinclude +OBJOUT=-o +EXEOUT=-o +CCEXE=gcc -Iinclude +LDFLAGS= +# \ +!endif + +check: + @echo MV=$(MV) + @echo RM=$(RM) + @echo CP=$(CP) + @echo CAT=$(CAT) + @echo PS=$(PS) + @echo RMDIR=$(RMDIR) + @echo SEVENZ=$(SEVENZ) + @echo SDL2LIB=$(SDL2LIB) + @echo LDFLAGS=$(LDFLAGS) + @echo if this is correct, run "make purforce" + @echo other options: + @echo all, purforce, clean, reallyclean, distclean +all: purforce +clean: + -@$(RM) build$(PS)*.obj + -@$(RM) sdl2dev.zip + -@$(RM) sdl2imgdev.zip + -@$(RM) SDL2-2.30.0$(PS)*.txt + -@$(RM) SDL2-2.30.0$(PS)docs$(PS)*.md + -@$(RM) SDL2-2.30.0$(PS)docs$(PS)doxyfile + -@$(RMDIR) SDL2-2.30.0$(PS)docs + -@$(RM) SDL2-2.30.0$(PS)cmake$(PS)*.cmake + -@$(RMDIR) SDL2-2.30.0$(PS)cmake + -@$(RM) SDL2-2.30.0$(PS)include$(PS)*.h + -@$(RMDIR) SDL2-2.30.0$(PS)include + -@$(RM) SDL2-2.30.0$(PS)lib$(PS)x64$(PS)*.lib + -@$(RM) SDL2-2.30.0$(PS)lib$(PS)x64$(PS)*.dll + -@$(RMDIR) SDL2-2.30.0$(PS)lib$(PS)x64 + -@$(RM) SDL2-2.30.0$(PS)lib$(PS)x86$(PS)*.lib + -@$(RM) SDL2-2.30.0$(PS)lib$(PS)x86$(PS)*.dll + -@$(RMDIR) SDL2-2.30.0$(PS)lib$(PS)x86 + -@$(RMDIR) SDL2-2.30.0$(PS)lib + -@$(RMDIR) SDL2-2.30.0 + -@$(RM) SDL2_image-2.8.2$(PS)*.txt + -@$(RM) SDL2_image-2.8.2$(PS)cmake$(PS)*.cmake + -@$(RMDIR) SDL2_image-2.8.2$(PS)cmake + -@$(RM) SDL2_image-2.8.2$(PS)lib$(PS)x64$(PS)*.dll + -@$(RM) SDL2_image-2.8.2$(PS)lib$(PS)x64$(PS)*.lib + -@$(RM) SDL2_image-2.8.2$(PS)lib$(PS)x86$(PS)*.dll + -@$(RM) SDL2_image-2.8.2$(PS)lib$(PS)x86$(PS)*.lib + -@$(RMDIR) SDL2_image-2.8.2$(PS)lib$(PS)x64 + -@$(RMDIR) SDL2_image-2.8.2$(PS)lib$(PS)x86 + -@$(RMDIR) SDL2_image-2.8.2$(PS)lib + -@$(RM) SDL2_image-2.8.2$(PS)include$(PS)*.h + -@$(RMDIR) SDL2_image-2.8.2$(PS)include + -@$(RMDIR) SDL2_image-2.8.2 +veryclean:reallyclean +reallyclean: clean + -@$(RM) purforce.exe + -@$(RMDIR) build +distclean: reallyclean + -@$(RM) SDL2.a + -@$(RM) SDL2.lib + -@$(RM) SDL2.dll + -@$(RM) SDL2_image.lib + -@$(RM) SDL2_image.dll + -@$(RM) SDL2main.lib + -@$(RM) include$(PS)*.h + -@$(RMDIR) include + +PUR_OBJS= \ +build$(PS)main.obj \ +build$(PS)error.obj + +build$(PS)main.obj: build Makefile main.c api.h include$(PS)SDL.h include$(PS)SDL_image.h + $(CCOBJ) main.c $(OBJOUT)$@ +build$(PS)error.obj: build Makefile api.h error.c + $(CCOBJ) error.c $(OBJOUT)$@ + +build: + mkdir build + +purforce: purforce.exe +purforce.exe: $(PUR_OBJS) $(SDL2LIB) $(SDL2IMGLIB) Makefile + $(CCEXE) $(PUR_OBJS) $(SDL2IMGLIB) $(EXEOUT)$@ $(LDFLAGS) + +sdl2dev.zip: + $(CP) ..\..\assets\windows\SDL2-devel-2.30.0-VC.zip $@ +sdl2imgdev.zip: + $(CP) ..\..\assets\windows\SDL2_image-devel-2.8.2-VC.zip $@ + +include: + mkdir include + +include$(PS)SDL.h: sdl2dev.zip include + $(SEVENZ) x sdl2dev.zip + $(CP) SDL2-2.30.0$(PS)include$(PS)*.h include$(PS) + touch include$(PS)SDL.h +include$(PS)SDL_image.h: sdl2imgdev.zip include + $(SEVENZ) x sdl2imgdev.zip + $(CP) SDL2_image-2.8.2$(PS)include$(PS)*.h include$(PS) + touch include$(PS)SDL_image.h + +SDL2_image.lib: sdl2imgdev.zip + $(SEVENZ) x sdl2imgdev.zip + $(CP) SDL2_image-2.8.2\lib\x64\SDL2_image.dll SDL2_image.dll + $(CP) SDL2_image-2.8.2\lib\x64\SDL2_image.lib SDL2_image.lib + touch SDL2_image.lib + +SDL2.lib: sdl2dev.zip + $(SEVENZ) x sdl2dev.zip + $(CP) SDL2-2.30.0\lib\x64\SDL2.dll SDL2.dll + $(CP) SDL2-2.30.0\lib\x64\SDL2.lib SDL2.lib + $(CP) SDL2-2.30.0\lib\x64\SDL2main.lib SDL2main.lib + touch SDL2.lib +SDL2.a: + sudo apt-get install sdl2-dev + ln -s /user/local/lib/sdl2/sdl2.so ./SDL2.a + touch SDL2.a \ No newline at end of file diff --git a/README.md b/README.md index 206e0f8..ce5d1ca 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,107 @@ -# purrforce +# PurrForce +purrforce purforce-purforce-purforce...(drum roll)... its +real-ly the cats me-ow...(meow) (meow) + +like the lamas ass winamp thing + +it can play that by default on each startup. launches to +the system tray if %APPDATA% has purfoce.ini that tells the +server address, else it prompts for server deets + +uses http/https for all comms + +because you might want to run it behind nginx with proxy +pass, the server runs just http and you use apache or nginx +reverse proxy to do lets encrypt and add https. client +tries both so we don't force people to setup some https bs. + +the program does not need to store two copies (or the full +history) on your local PC. only your current working copy +is stored, and is rsynced to the server. + +also, server does not keep too many backups because it will +use up too much space. but users can request a backup via +rightclick menu on any file. + +click on systray to get a list of all files currently being +tracked. tracking is via direct file selection not using +any kind of repo. + +you can use github for code, and purrforce for the massive +.blend files and such. + +server maintains list of users registered and list of users +online. you can ping them a DM and it shows up in their +systemtray, it can reference a file you tracked and suggest +them a path to save it to. + +path can use variables that they can set in the GUI +varaibles section which is stored in .ini file locally as +you might have different computers each with the base +project dir in different locations each time. + +if you add a file to tracking you add it writeable in +progress or readonly finished. others can DL it but the +systray will constantly set its file flags to readonly, +unless they right click clone private copy (tracked) or +clone private copy (untracked) under a new name. with a +checkbox for remove original from local drive. + +normal deleting a file just makes it untracked but still +available in systray file listing on server, can redownload +from server. to delete on server, rightclick and choose +delete on server (keep local) or delete on both server and +local. Server side it moves to recycle bin and old recycle +bin items get deleted to make hdd space free when needed. + +systray has a bar meter of how much server HDD is used up. + +allows storage slaves to connect to server and provide a +fixed GB amount of storage for the server to use via remote +commands (rename,copy,delete,create,rsync transfer). + +sys admin panel shows server HDD and all slave HDD and all +file objects with rectangle size set by file size in mb, +and drag drop to move storage locations. + +client access a file stored on storage slave? all client +transfer goes to server, which then proxies to storage +client. only server needs to have a stable IP, storage +slaves can be behind carrier grade NAT, the connection is +storage slave connects to server in an infinite loop and +long holds open and then bidir data transfer through that. + +allow screen streaming via rapid screenshots -> video +encode -> upload to server -> all viewers download from +server. + +allows remote assistance by request assistance right click +option on systray icon, choose user to gift control, they +get a popup to confirm, they get an SDL window that sees +your desktop stream, and mouse and kb input into that +window are sent to you and emitted by the app using +SendKey() type OS calls. Should allow someone to quickly +jump in and show you how to do something in your local +blender model, etc. also microphone streaming to speakers. + +and an optional internet radio streamed from server with +playlist requests voting. Add a track by syncing a local +music file to server radio/ folder and then enqueue it in +the radio requests UI on the systray app. + +app tracks mouse / kb activity and provides AFK status and +online status on all registered user avatars. + +designed as a blender model and other large binary file +syncing service to complement a github repository for LGDG +collab project mar-apr 2024. + + + + + + + + + -sync binary files \ No newline at end of file diff --git a/api.h b/api.h new file mode 100644 index 0000000..b47010b --- /dev/null +++ b/api.h @@ -0,0 +1,7 @@ +#ifndef api_h +#define api_h + +#include +void reportError(const char *fmt,...); + +#endif//api_h diff --git a/error.c b/error.c new file mode 100644 index 0000000..d237dd1 --- /dev/null +++ b/error.c @@ -0,0 +1,26 @@ +#include +#include +#include "api.h" + +#ifdef _WIN32 +#include +static void showError(const char *er) { + int ret = MessageBoxA(NULL,er,"Quit the program?",MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2|MB_APPLMODAL); + if(ret = IDYES) { + exit(1); + } +} +#else +static void showError(const char *er){ + fprintf(stderr,"%s\n",er); + return; +} +#endif + +void reportError(const char *fmt,...){ + va_list ap; + char buf[512]; + va_start(ap,fmt); + vsnprintf(buf,sizeof buf,fmt,ap); + va_end(ap); +} diff --git a/ls.bat b/ls.bat new file mode 100644 index 0000000..8d3d7ac --- /dev/null +++ b/ls.bat @@ -0,0 +1 @@ +dir %* \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..1f98ce4 --- /dev/null +++ b/main.c @@ -0,0 +1,56 @@ +#include +#include +#include + +#include "api.h" + +SDL_Window* window; +SDL_Renderer* renderer; +SDL_Texture* lettuce_tex; +int main(int argc, char* argv[]) { + SDL_Surface* lettuce_sur; + reportError("startup purrforce?"); + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS) < 0) { + reportError("Error SDL2 Initialization : %s",SDL_GetError()); + return 1; + } + window = SDL_CreateWindow("First program", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL); + if (window == NULL) { + reportError("Error window creation"); + return 3; + } + renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + if (renderer == NULL) { + reportError("Error renderer creation"); + return 4; + } + lettuce_sur = IMG_Load("lettuce.png"); + if (lettuce_sur == NULL) { + reportError("Error loading image: %s",IMG_GetError()); + return 5; + } + lettuce_tex = SDL_CreateTextureFromSurface(renderer, lettuce_sur); + if (lettuce_tex == NULL) { + reportError("Error creating texture"); + return 6; + } + SDL_FreeSurface(lettuce_sur); + while (1) { + SDL_Event e; + if (SDL_WaitEvent(&e)) { + if (e.type == SDL_QUIT) { + break; + } + } + SDL_RenderClear(renderer); + SDL_RenderCopy(renderer, lettuce_tex, NULL, NULL); + SDL_RenderPresent(renderer); + } + SDL_DestroyTexture(lettuce_tex); + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + IMG_Quit(); + SDL_Quit(); + return 0; +} + diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..75f5b32 --- /dev/null +++ b/make.bat @@ -0,0 +1 @@ +nmake %* \ No newline at end of file diff --git a/pull_fromgit.bat b/pull_fromgit.bat new file mode 100644 index 0000000..e69de29 diff --git a/rm.bat b/rm.bat new file mode 100644 index 0000000..017c807 --- /dev/null +++ b/rm.bat @@ -0,0 +1 @@ +del %* \ No newline at end of file diff --git a/sync2git.bat b/sync2git.bat new file mode 100644 index 0000000..410d48b --- /dev/null +++ b/sync2git.bat @@ -0,0 +1,11 @@ +copy /B /Y api.h D:\dev\db\purrforce\ +copy /B /Y error.c D:\dev\db\purrforce\ +copy /B /Y ls.bat D:\dev\db\purrforce\ +copy /B /Y main.c D:\dev\db\purrforce\ +copy /B /Y make.bat D:\dev\db\purrforce\ +copy /B /Y Makefile D:\dev\db\purrforce\ +copy /B /Y pull_fromgit.bat D:\dev\db\purrforce\ +copy /B /Y readme.md D:\dev\db\purrforce\ +copy /B /Y rm.bat D:\dev\db\purrforce\ +copy /B /Y sync2git.bat D:\dev\db\purrforce\ +copy /B /Y touch.bat D:\dev\db\purrforce\ diff --git a/touch.bat b/touch.bat new file mode 100644 index 0000000..920b316 --- /dev/null +++ b/touch.bat @@ -0,0 +1,9 @@ +@echo off +REM copy /b %* +,, +IF EXIST %1 ( + type %1 >temp.tou + move temp.tou %1 +) ELSE ( + REM echo ERROR cannot find '%1' file, use double quotes or check path + copy /b NUL %1 +) \ No newline at end of file