inital
This commit is contained in:
parent
254470e79c
commit
fbfec7c9d2
|
@ -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
|
108
README.md
108
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
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef api_h
|
||||||
|
#define api_h
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
void reportError(const char *fmt,...);
|
||||||
|
|
||||||
|
#endif//api_h
|
|
@ -0,0 +1,26 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "api.h"
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <Windows.h>
|
||||||
|
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);
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <SDL_image.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
|
@ -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\
|
Loading…
Reference in New Issue