Целият код за нотификациите е тука: realtime.js
Обърни внимание обаче как се прави връзката съм евент сорса - работата е там, че може да има и друг файл който да иска някакви нотификации. Затова тук само се регистрират хандлерите, а после на onload се прави реалната връзка, след като всички хандлери и заявки са налични.
Ами с прост XmlHttpRequest или каквото ползваш там за достигане на апито на асемблер, може да се дръпне един бул за да няма event listener на load на джама. Или пък ако искаш да е по-гъзарско в connect всеки път да се проверява, за да не рефрешва стрницата юзъра като смени стойността на була.
Относно var magset и пропърти msgs. Какъв е моделът тук? Има ли си всяко съобщение уникално ид в модела? Ако да слагаш един масив с рендарните до момента и го проверяваш преди рендарването на ново съобщение. Ако няма ид май само контента те оправя.
Използва се EventSource. Той е добре да стои кънектнат, но може да се променя маската на заявените евенти, които фронтенда иска да получава. XmlHttpRequest е само за обратния канал.
Маската е в променливата WantEvents
и има следните стойности: sse_service.asm
Реално нас ни интересува evmUserActivity = 8
, другите са за чата.
Ще трябва и някакъв чекбокс за UI, който малко не виждам къде ще го втъкнем в страницата...
т. е. искаш evmUserActivity да пази стойността на този чекбокс за позволяване на съобщенията? Защо пазиш маските отделно в базата, каква е идеята? Като маскирам много стойности в една ги пазя в едно поле.
Кода за достъп до сикюел лайт ме насра. Почувствах се тъп.нетаджия :( Ама е яко как си държиш като стрингове завките.
Значи това всичко работи така - на бакенда работи сървис, който отговаря за SSE връзките. Когато от фронтенда се направи заявка за получаване на евенти, тази конекция се обявява за постоянна и се прехвърля към sse сървиса. Съответно, фронтенда казва какви евенти иска да получава, като изпраща маската със стойности. На бакенда, тя се прикача към сокета и когато се получат такива събития, то те се препращат само към сокетите, които са заявили, че ги искат.
А всички флагове са в едно поле, защото лично на мене така ми е по-привично, пък и се обработва по-лесно в бакенда.
Добре, как ще се контрибютва оттук насетне? С уиндоус ще стане ли работата? FreshIde, имам nginx работещ локално, някакъв mysql lite?
За тестване ще ти трябва Linux, може на виртуална машина, иначе за работата, където искаш там работи.
За да си направиш работещ сетинг ти трябва да си клонираш репозиторито и да си направиш чекаут и т.н. както го описвам тук: https://board.asm32.info/asmbb/bazaar-model-with-fossil-scm.269/ или поне да събереш директориите ./www/images/
и ./www/templates/
на едно място.
После си сваляш 3-те файла от този пост: https://bgdev-free.asm32.info/kak-se-slaga-podpis-fuutar-w-postowete.3/#456 и ги слагаш във ./www/
директорията. Това са прекомпилирани енджина и библиотеките.
nginx
го настройваш както е конфига в директорията ./.nginx/nginx.conf
, можеш да погледнеш и скрипта nserver
който аз използвам за пускане на nginx в локалната директория.
После стартираш nginx
и engine
. При първото стартиране ще се създаде базата данни и можеш да се конектнеш с браузъра.
П.П. А да, ще ти трябва и компилатор за LESS. Аз използвам clessc
и си нямам на идея колко е стандартизиран езика. Скрипта build_styles.sh
по идея компилира CSS файловете. Това се прави първо, а после когато се редактира някой LESS файл.
Не разбирам следното. Може ли да компилирам под уиндоус? Може ли nginx да използва уеб сървър, който ще дигне компилираното асембли или каквото и да се нарича там да сервира хттп?
Да, можеш да компилираш AsmBB под Windows със Fresh IDE. Има особености, но не е кой знае колко трудно. Искаш ли да го обясня подробно?
Но ще получиш изпълним файл за Linux. Който ще трябва да пускаш някак си под Linux. Под WSL например се опасявам, че няма да работи. Може и да греша.
Обаче, освен това ще ти трябват и две библиотеки: MUSL и SQLite, които за съжаление ще можеш да компилираш само под Linux. Това е лесно - в директорията ./musl_sqlite/
стартираш скрипта ./build
- той ще изтегли сорсовете и ще ги компилира. Но все пак трябва Linux.
Аз затова постнах прекомпилираните бинарита, за да ти е по-лесно.
Nginx е един от уеб сървърите, който може да работи със AsmBB. Всеки друг също става, стига да поддържа FastCGI (Apache, или lighttpd са ОК). Но отново – трябва да работи под Linux на същата машина, на която работи AsmBB.
П.П. Между другото от тази връзка: asmbb.tar.gz можеш да си изтеглиш и официалния бинарен пакет. Той също съдържа прекомпилираните файлове.
Ясно, не е за джамове работата. Понеже съм линукс нууб си мислех следното : пускам ти PR на мастър бранча ти с промени, ти преглеждаш и тестваш. Ако има греди връщаш. Така докато не си настроя някакъв линукс на виртуалка. Сигурно някакво убунто ще гледам да сложа. А уеб сървър под линукс не съм дигал никога.
По принцип от моя страна няма проблем. Ако искаш и директно в темата може да пускаш кода. А като го изтестваме, ще ми пратиш цял PR за мърджване в репозиторито.
А иначе уеб сървърите са нативни Unix/Linux приложения. По-скоро в Windows има проблеми да се пуснат, отколкото в Линукс.
Между другото, самият AsmBB като код е реално портируем. Тоест теоретически може да се компилира и за Windows, обаче самата операционна система не поддържа някои неща, които AsmBB ползва и трябва да мисля с какво да ги замествам. Unix сокети например и фютекси. Затова и няма версия за Windows.
Ами да то и тук да се пуска код е оферта. Утре като седна на компа ще пратя за флаг за изключване на нотификациите.
Моля, обясни ми някои неща като на тъпак :
https://asm32.info/fossil/repo/asmbb/artifact/8351a9fc7b0ca9ea
Къде е реално таблицата с настройки на юзъра ? Трябва да се прочете ред за юзъра от нея с ново поле както правиш на ред 1045. Предполагам не искаш това да бъде вмъкнато в EventSessions
. Целият sse_service.asm ли отговаря за !events ендпойнта ? Къде WantedEvents се получава в асемблерският код ?
Сега, малко по-сложно е. По принцип, !events
ендпоинта се обработва на друго място. (Въобще, кое къде се обработва се вижда във файла commands.asm).
Koнкретно процедурата за обработка на !events
– EventsRealTime
се намира във realtime.asm
Тази процедура обаче само инициализира реал-тайм сесията и включва сокета, който отговаря за конекцията към списъка за обработка на SSE сървиса. След това приключва обработката, но докато всички други команди приключват и комуникацията по FastCGI, в този случай комуникацията остава отворена и за нея се грижи SSE сървиса. Съответно той я затваря и изчиства, когато сокета се прекъсне от браузъра.
Обработката на events=
параметъра, който се изпраща при заявката /!events?events=NNN
се обработва именно в процедурата EventsRealTime, на първите редове.
SSE сървиса реално е отделна нишка, която следи за нови евенти и когато се появят ги разпраща на тези сокети, които са абонирани за тях. А също след разпращането чисти таблицата в базата данни в която е опашката с евенти. Там беше бая крив алгоритъм, докато до измисля. Даже, ако си спомням добре, го обсъждахме на стария форум.
Джони, виждам зора с тоя асемблер. Искаш ли за мене джабаскрипта, а за тебе бекенда. Още не мога да си обясня shl, но трябва да е побитов AND. Верно шапка ти свалям, тук няма кой да напише това, което си написал. Поне видях де са темите, ще видя що на мобилната тема не бачкат непрочетени линка.
shl не е ли шифт наляво ?
Разкрий ми логиката как стигна до този извод за shl? Разбирам да е нещо по завъртяно като ror, но точно дума от вида sh+l? Имам чувството, че си правиш майтап, ама не всеки го схваща, защото не всеки джара на asm.
Глупости пиша, << имах впредвид.
Бахти майтапа да зяпам асемжлррски код в събота, а?
SHL е преместване наляво - подобно на "<<" от езиците от високо ниво. Но това не е много важно. То реално за това, с което си се захванал да правиш (включване/изключване на нотификациите) изобщо не трябва да се пипа бакенда.
Просто от JS включваш и изключваш нужните битове във WantedEvents
, убиваш старият EventSource и викаш connect().
За нотификациите ти трябва третият бит evUserActivity = 3
маската му е 8.
Съответно, трябва да се включи някъде в темплейтите и един чекбокс, но нещо не ми е много ясно къде да го вмъкна в страницата и как да изглежда, иначе досега да съм го сложил.