| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618 |
- <?php defined('BX_DOL') or die('hack attempt');
- /**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup Messenger Messenger
- * @ingroup UnaModules
- *
- * @{
- */
- require_once('BxMessengerStorage.php');
- define('BX_IM_TYPE_PUBLIC', 1);
- define('BX_IM_TYPE_PRIVATE', 2);
- define('BX_IM_TYPE_SETS', 3);
- define('BX_IM_TYPE_GROUPS', 4);
- define('BX_IM_TYPE_EVENTS', 5);
- define('BX_IM_TYPE_BROADCAST', 6);
- define('BX_IM_EMPTY_URL', '');
- define('BX_IM_EMPTY', 0);
- // Attachment types
- define('BX_ATT_TYPE_FILES', 'files');
- define('BX_ATT_TYPE_FILES_UPLOADING', 'uploading');
- define('BX_ATT_TYPE_GIPHY', 'giphy');
- define('BX_ATT_TYPE_REPOST', 'repost');
- define('BX_ATT_TYPE_CUSTOM', 'custom');
- define('BX_ATT_TYPE_REPLY', 'reply');
- define('BX_ATT_TYPE_VC', 'vc'); // video conference
- define('BX_ATT_GROUPS_ATTACH', 'attachment');
- // Reactions actions
- define('BX_JOT_REACTION_ADD', 'add');
- define('BX_JOT_REACTION_REMOVE', 'remove');
- // Public jitsi actions
- define('BX_JOT_PUBLIC_JITSI_LEAVE', 'leave');
- define('BX_JOT_PUBLIC_JITSI_JOIN', 'join');
- define('BX_JOT_PUBLIC_JITSI_CLOSE', 'close');
- // Notifications types
- define('BX_MSG_NTFS_MESSAGE', 'message');
- define('BX_MSG_NTFS_MENTION', 'mention');
- define('BX_MSG_NTFS_BROADCAST', 'broadcast');
- // Membership actions
- define('BX_MSG_ACTION_EDIT_MESSAGES', 'edit_messages');
- define('BX_MSG_ACTION_DELETE_MESSAGES', 'delete_messages');
- define('BX_MSG_ACTION_CREATE_TALKS', 'create_talks');
- define('BX_MSG_ACTION_ADMINISTRATE_TALKS', 'administrate_talks');
- define('BX_MSG_ACTION_SEND_MESSAGE', 'send_messages');
- define('BX_MSG_ACTION_SEND_FIELS', 'send_files');
- define('BX_MSG_ACTION_CREATE_VC', 'create_vc');
- define('BX_MSG_ACTION_CREATE_IM_VC', 'video_conference');
- define('BX_MSG_ACTION_VIDEO_RECORDER', 'video_recorder');
- define('BX_MSG_ACTION_JOIN_IM_VC', 'join_personal_vc');
- define('BX_MSG_ACTION_JOIN_TALK_VC', 'join_vc');
- define('BX_MSG_ACTION_CREATE_GROUPS', 'create_groups');
- define('BX_MSG_ACTION_CREATE_BROADCASTS', 'create_broadcasts');
- // Lot settings
- define('BX_MSG_SETTING_MSG', 'msg'); // allow to send messages
- define('BX_MSG_SETTING_GIPHY', 'giphy'); // allow to send giphy
- define('BX_MSG_SETTING_FILES', 'files'); // allow to send files
- define('BX_MSG_SETTING_VIDEO_RECORD', 'video_rec'); // allow to record videos
- define('BX_MSG_SETTING_SMILES', 'smiles'); // allow to record videos
- // Talk's types
- define('BX_MSG_TALK_TYPE_INBOX', 'inbox');
- define('BX_MSG_TALK_TYPE_THREADS', 'threads');
- define('BX_MSG_TALK_TYPE_GROUPS', 'groups');
- define('BX_MSG_TALK_TYPE_DIRECT', 'direct');
- define('BX_MSG_TALK_TYPE_FILES', 'files');
- define('BX_MSG_TALK_TYPE_MR', 'mr');
- define('BX_MSG_TALK_TYPE_REPLIES', 'replies');
- define('BX_MSG_TALK_TYPE_SAVED', 'saved');
- define('BX_MSG_TALK_TYPE_FAVORITES', 'favorites');
- define('BX_MSG_TALK_TYPE_BROADCAST', 'broadcast');
- // Pages types
- define('BX_MSG_TALK_TYPE_PAGES', 'bx_messenger_pages');
- // Search criteria
- define('BX_SEARCH_CRITERIA_TITLES', 'titles');
- define('BX_SEARCH_CRITERIA_PARTS', 'participants');
- define('BX_SEARCH_CRITERIA_CONTENT', 'content');
- // Visibility
- define('BX_MSG_VISIBILITY_VISIBLE', 0);
- define('BX_MSG_VISIBILITY_HIDDEN', 1);
- define('BX_MSG_VISIBILITY_ALL', 2);
- // Talks classes
- define('BX_MSG_TALK_CLASS_MEMBERS', 'members');
- define('BX_MSG_TALK_CLASS_MARKET', 'market');
- define('BX_MSG_TALK_CLASS_CUSTOM', 'custom');
- define('BX_MSG_TALK_CLASS_BLOCK', 'block');
- // Classes
- define('BX_MSG_CLASS_ATTACHMENT', 'message-attachment');
- /**
- * Messenger module
- */
- class BxMessengerModule extends BxBaseModGeneralModule
- {
- const BROADCAST_BATCH_SIZE = 200;
- const BROADCAST_BATCHES_PER_RUN = 5;
- private $_iUserId = 0;
- private $_iJotId = 0;
- private $_iSelectedProfileId = 0;
- private $_iSelectedConvoId = 0;
- private $_isBlockMessenger = false;
- private $_sWelcomeMessage = '';
- function __construct(&$aModule)
- {
- parent::__construct($aModule);
- $this->_iUserId = bx_get_logged_profile_id();
- }
- public function setProfileId($iProfileId)
- {
- $iPrev = (int)$this->_iProfileId;
- $this->_iProfileId = (int)$iProfileId;
- $this->_iUserId = (int)$iProfileId;
- return $iPrev;
- }
- /**
- * Returns left side block for messenger page and loads config data
- */
- public function serviceGetBlockInbox()
- {
- $mixedContent = $this->_oTemplate->getLotsList($this->_iProfileId, $this->_iSelectedConvoId);
- if (bx_is_api())
- return $mixedContent;
- return $mixedContent . $this->_oTemplate->loadConfig(
- $this->_iProfileId,
- [
- 'is_block_version' => false,
- 'lot' => $this->_iSelectedConvoId,
- 'jot' => $this->_iJotId,
- 'selected_profile' => $this->_iSelectedProfileId,
- 'welcome' => $this->_sWelcomeMessage
- ]
- );
- }
- /**
- * Returns right side block for messenger page
- */
- public function serviceGetBlockLot()
- {
- if ($this->_iSelectedConvoId) {
- return $this->_oTemplate->getTalkBlock($this->_iProfileId, $this->_iSelectedConvoId, $this->_iJotId);
- } else if ($this->_iSelectedProfileId && $this->onCheckContact($this->_iProfileId, $this->_iSelectedProfileId))
- return $this->_oTemplate->getTalkBlockByUserName($this->_iProfileId, $this->_iSelectedProfileId);
- return $this->_oTemplate->getTalkBlock($this->_iProfileId, BX_IM_EMPTY);
- }
- /**
- * Returns block with messenger for any page
- * @param string $sModule module name
- * @return string block's content
- */
- public function serviceGetBlockMessenger($sModule, $bAsHtml = false)
- {
- $this->_isBlockMessenger = true;
- $CNF = &$this->_oConfig->CNF;
- $this->_oTemplate->loadCssJs('view');
- $sClass = str_replace('{type}', '', $sModule);
- $aLotInfo = [];
- if ($sClass)
- $aLotInfo = $this->_oDb->getLotByClass($sClass);
- $sUrl = $this->_oConfig->getPageIdent();
- $iType = $this->_oConfig->getTalkType($sModule);
- if (empty($aLotInfo) && $sUrl)
- $aLotInfo = $this->_oDb->findLotByParams(array(
- $CNF['FIELD_TYPE'] => $iType,
- $CNF['FIELD_CLASS'] => BX_MSG_TALK_CLASS_CUSTOM,
- $CNF['FIELD_URL'] => $sUrl
- ));
- $iLotId = !empty($aLotInfo) && isset($aLotInfo[$CNF['FIELD_ID']]) ? (int) $aLotInfo[$CNF['FIELD_ID']] : 0;
- if (!$iLotId) {
- if (!$sUrl)
- return false;
- $sTalkUrl = $this->getPreparedUrl($sUrl);
- $sTalkTitle = BxDolTemplate::getInstance()->getPageHeader();
- $iLotId = $this->_oDb->createLot(
- $this->_iProfileId,
- array(
- 'url' => $sTalkUrl,
- 'title' => $sTalkTitle,
- 'type' => $iType,
- 'page' => $this->_oConfig->getPageName($sUrl)
- )
- );
- $this->_oDb->registerGroup($sUrl, $iLotId);
- }
- $sConfig = $this->_oTemplate->loadConfig($this->_iProfileId, ['lot' => $iLotId, 'type' => $iType]);
- $aHeader = $this->_oTemplate->getTalkHeader($iLotId, $this->_iProfileId, true, true);
- $sContent = $this->_oTemplate->parseHtmlByName('talk-body.html', array(
- 'history' => $this->_oTemplate->getHistory($this->_iProfileId, $iLotId, BX_IM_EMPTY),
- 'text_area' => $this->_oTemplate->getTextArea($this->_iProfileId, $iLotId),
- 'groups_list' => $this->_oTemplate->getTalksList($iLotId),
- 'info' => $this->_oTemplate->getInfoSection($iLotId, $this->_iProfileId),
- ));
- $this->_oTemplate->addCss(array('threads.css'));
- if ($bAsHtml) {
- $sContent = $this->_oTemplate->getTalkBlock($this->_iProfileId, $iLotId, BX_IM_EMPTY, $this->_isBlockMessenger);
- return $sConfig . $sContent;
- }
- $oMenu = BxTemplMenu::getObjectInstance($CNF['OBJECT_MENU_ACTIONS_TALK_MENU']);
- $oMenu->setContentId($iLotId);
- return array(
- 'title' => $aHeader['title'],
- 'content' => $sConfig . $sContent,
- 'menu' => $oMenu
- );
- }
- private function initDefaultParams()
- {
- $CNF = &$this->_oConfig->CNF;
- $this->_iSelectedProfileId = (int) bx_get('profile_id');
- if ($this->_iSelectedProfileId && !$this->onCheckContact($this->_iProfileId, $this->_iSelectedProfileId))
- $this->_iSelectedProfileId = 0;
- if ($this->_iSelectedProfileId) {
- $oProfile = BxDolProfile::getInstance($this->_iSelectedProfileId);
- $sModule = $oProfile->getModule();
- $bIsProfile = BxDolRequest::serviceExists($sModule, 'act_as_profile') && BxDolService::call($sModule, 'act_as_profile');
- if ($sModule && !$bIsProfile && BxDolRequest::serviceExists($sModule, 'is_group_profile') && BxDolService::call($sModule, 'is_group_profile')) {
- $aOwnerInfo = BxDolService::call($sModule, 'get_info', array($oProfile->getContentId(), false));
- if (!empty($aOwnerInfo) && is_array($aOwnerInfo) && BxDolService::call($sModule, 'check_allowed_view_for_profile', array($aOwnerInfo)) === CHECK_ACTION_RESULT_ALLOWED) {
- $oModule = BxDolModule::getInstance($sModule);
- if ($oModule->_oConfig) {
- $oMCNF = $oModule->_oConfig->CNF;
- $sUrl = "i={$oMCNF['URI_VIEW_ENTRY']}&id=" . $oProfile->getContentId();
- if ($sUrl && $aTalk = $this->_oDb->getLotByUrl($sUrl))
- $this->_iSelectedConvoId = $aTalk[$CNF['FIELD_ID']];
- }
- }
- } else {
- $aExistedTalk = $this->_oDb->getLotsByParticipantsList([$this->_iSelectedProfileId, $this->_iProfileId], BX_IM_TYPE_PRIVATE);
- if (!empty($aExistedTalk))
- $this->_iSelectedConvoId = $aExistedTalk[$CNF['FIELD_ID']];
- }
- } else {
- if ($this->_iJotId)
- $this->_iSelectedConvoId = $this->_oDb->getLotByJotId($this->_iJotId);
- else {
- $aLotsList = $this->_oDb->getMyLots($this->_iProfileId, ['inbox' => true]);
- $this->_iSelectedConvoId = !empty($aLotsList) ? current($aLotsList)[$CNF['FIELD_ID']] : 0;
- }
- }
- }
- public function serviceGetMainMessengerPage()
- {
- if (bx_is_api())
- return bx_srv($this->getName(), 'get_block_main', [], 'Services');
- $this->initDefaultParams();
- $bSimpleMode = $this->_oConfig->CNF['USE-UNIQUE-MODE'];
- $aData = [
- 'menu' => $this->_oTemplate->getLeftMainMenu(),
- 'info' => $this->_oTemplate->getInfoSection(),
- 'list' => $this->serviceGetBlockInbox(),
- 'history' => $this->serviceGetBlockLot(),
- 'list_width' => $bSimpleMode ? 'xl:col-span-3' : 'xl:col-span-3',
- 'history_width' => $bSimpleMode ? 'xl:col-span-7' : 'xl:col-span-5',
- ];
- return $this->_oTemplate->parseHtmlByName('main.html', $aData);
- }
- public function actionGetThreadReplies()
- {
- $iJotId = (int) bx_get('jot_id');
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- $aLotInfo = $this->_oDb->getLotByParentId($iJotId);
- $CNF = &$this->_oConfig->CNF;
- if (empty($aJotInfo) || !$this->isLogged() || ($aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_PRIVATE && !$this->_oDb->isParticipant($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $this->_iProfileId)))
- return echoJson(array('code' => 1));
- echoJson(array('code' => 0, 'html' => $this->_oTemplate->getThreadReply($iJotId)));
- }
- public function actionGetThreadsPanel()
- {
- $iJotId = bx_get('jot_id');
- if (!$this->isLogged() || !$iJotId)
- return echoJson(array('code' => 1));
- $CNF = $this->_oConfig->CNF;
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- if (empty($aJotInfo))
- return echoJson(array('code' => 1));
- $aLotInfo = $this->_oDb->getLotByParentId($iJotId);
- if (!empty($aLotInfo) && $aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_PRIVATE && !$this->_oDb->isParticipant($aLotInfo[$CNF['FIELD_ID']], $this->_iProfileId))
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_not_participant')));
- echoJson(array('code' => 0, 'html' => $this->_oTemplate->getThreadsPanel($iJotId, $this->_iProfileId)));
- }
- /**
- * Adds messenger block to all pages with comments and trigger pages during installation
- */
- public function serviceAddMessengerBlocks()
- {
- if (!isAdmin())
- return '';
- $aPages = $this->_oDb->getPagesWithComments();
- $aUrl = array();
- foreach ($aPages as $sModule => $sPage) {
- $sParams = parse_url($sPage, PHP_URL_QUERY);
- if (!empty($sParams))
- parse_str($sParams, $aUrl);
- if (isset($aUrl['i'])) {
- $sPage = BxDolPageQuery::getPageObjectNameByURI($aUrl['i']);
- if (!$this->_oDb->isBlockAdded($sPage))
- $this->_oDb->addMessengerBlock($sPage);
- }
- }
- }
- /**
- * Builds main messenger page
- */
- public function actionHome()
- {
- if (!$this->isLogged())
- bx_login_form();
- $oPage = BxDolPage::getObjectInstance('bx_messenger_main');
- if (!$oPage) {
- $this->_oTemplate->displayPageNotFound();
- exit;
- }
- $oPage->displayPage();
- }
- public function actionArchive($iJotId)
- {
- $iLotId = $this->_oDb->getLotByJotId($iJotId);
- $this->_iJotId = $iJotId;
- if (!$iLotId) {
- $this->_sWelcomeMessage = _t('_bx_messenger_not_found_to_read');
- $this->_iJotId = BX_IM_EMPTY;
- } else
- if (!$this->_oDb->isParticipant($iLotId, $this->_iProfileId)) {
- $this->_sWelcomeMessage = _t('_bx_messenger_not_allowed_to_read');
- $this->_iJotId = BX_IM_EMPTY;
- }
- $this->actionHome();
- }
- /**
- * Create List of participants received from request (POST, GET)
- * @param mixed $mixedParticipants participants list
- * @param bool $bExcludeLogged don't add logged profile to the participants list
- * @return array participants list
- */
- private function getParticipantsList($mixedParticipants, $bExcludeLogged = false)
- {
- if (empty($mixedParticipants))
- return [];
- $aParticipants = is_array($mixedParticipants) ? $mixedParticipants : array(intval($mixedParticipants));
- if (!$bExcludeLogged && !in_array($this->_iProfileId, $aParticipants))
- $aParticipants[] = $this->_iProfileId;
- return array_unique($aParticipants, SORT_NUMERIC);
- }
- public function serviceSendMessage($iRecipient = 0, $mixedData = '', $iSender = 0)
- {
- if (!$iSender)
- $iSender = $this->_iProfileId;
- if (empty($mixedData))
- return _t('_bx_messenger_send_message_no_data');
- $aData = array();
- if (is_array($mixedData))
- $aData = $mixedData;
- elseif (is_string($mixedData) && strlen($mixedData))
- $aData['message'] = $mixedData;
- if (empty($aData))
- return _t('_bx_messenger_send_message_no_data');
- $aData['participants'] = array();
- if ($iRecipient)
- $aData['participants'][] = $iRecipient;
- if ($iSender)
- $aData['participants'][] = $iSender;
- $mixedResult = $this->sendMessage($aData, $iRecipient, $iSender);
- if (is_array($mixedResult) && isset($mixedResult['jot_id']))
- return true;
- return is_string($mixedResult) ? $mixedResult : false;
- }
- /**
- * Main function to send Messages
- * @param array $aData params for a message, files, text, participants...
- * @param int $iRecipient recipient's profile id
- * @param int $iSender sender's profile id
- * @return array/string
- */
- public function sendMessage(&$aData, $iRecipient = 0, $iSender = 0)
- {
- $sMessage = isset($aData['message']) ? trim($aData['message']) : '';
- $iLotId = isset($aData['lot']) ? (int) $aData['lot'] : 0;
- $iGroupId = isset($aData['group_id']) ? (int) $aData['group_id'] : 0;
- $iType = (isset($aData['type']) && $aData['type'] && $this->_oDb->isLotType($aData['type'])) ? (int) $aData['type'] : BX_IM_TYPE_PRIVATE;
- $aFiles = $aData[BX_ATT_TYPE_FILES] ?? [];
- $aGiphy = $aData[BX_ATT_TYPE_GIPHY] ?? [];
- $iReply = isset($aData['reply']) ? (int) $aData['reply'] : '';
- $aParticipants = $aData['participants'] ?? [];
- $aAttachments = $aData['attachment'] ?? [];
- $sClass = $aData['class'] ?? '';
- $sTitle = isset($aData['title']) ? html2txt($aData['title']) : '';
- $iParent = isset($aData['parent']) ? (int) $aData['parent'] : 0;
- $sUrl = '';
- $CNF = &$this->_oConfig->CNF;
- // check if message contains toxic
- if ($sMessage && $CNF['CHECK-CONTENT-FOR-TOXIC'] && BxDolRequest::serviceExists('bx_antispam', 'is_toxic')) {
- if (bx_srv('bx_antispam', 'is_toxic', [$sMessage]) === true)
- return _t('_bx_messenger_toxic_message');
- }
- if ($iRecipient && !($oRecipient = BxDolProfile::getInstance($iRecipient)))
- return _t('_bx_messenger_profile_not_found');
- if (!$iSender)
- $iSender = $this->_iProfileId;
- $mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_SEND_MESSAGE, $iSender);
- if ($mixedResult !== true)
- return $mixedResult;
- if ($iLotId) {
- if (!($aLotInfo = $this->_oDb->getLotInfoById($iLotId)))
- return _t('_bx_messenger_not_found');
- $mixedOptions = $this->_oDb->getLotSettings($iLotId);
- $bCheckAction = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_ADMINISTRATE_TALKS, $iSender) === true;
- $bIsAuthor = $bCheckAction || $this->_oDb->isAuthor($iLotId, $iSender);
- if ($sMessage && $mixedOptions !== false && !in_array(BX_MSG_SETTING_MSG, $mixedOptions) && !$bIsAuthor)
- return _t('_bx_messenger_send_message_save_error');
- if (!empty($aFiles)) {
- if (count($aFiles) == 1 && isset(current($aFiles)['content_type']) && current($aFiles)['content_type'] == BX_MSG_SETTING_VIDEO_RECORD) {
- if ($mixedOptions !== false && !in_array(BX_MSG_SETTING_VIDEO_RECORD, $mixedOptions) && !$bIsAuthor)
- return _t('_bx_messenger_send_message_save_error');
- }
- if ($mixedOptions !== false && !in_array(BX_MSG_SETTING_FILES, $mixedOptions) && !$bIsAuthor)
- return _t('_bx_messenger_send_message_save_error');
- }
- if (!empty($aGiphy) && $mixedOptions !== false && !in_array(BX_MSG_SETTING_GIPHY, $mixedOptions) && !$bIsAuthor)
- return _t('_bx_messenger_send_message_save_error');
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- $iType = isset($aLotInfo[$CNF['FIELD_TYPE']]) ? $aLotInfo[$CNF['FIELD_TYPE']] : BX_IM_TYPE_PUBLIC;
- if ($iType == BX_IM_TYPE_PRIVATE && !$iRecipient) {
- $aPartList = $this->_oDb->getParticipantsList($iLotId, true, $iSender);
- if (count($aPartList) == 1) {
- $iRecipient = current($aPartList);
- }
- }
- }
- if ($iRecipient && !$this->onCheckContact($iSender, $iRecipient))
- return _t('_bx_messenger_contact_privacy_not_allowed');
- if ($iType !== BX_IM_TYPE_PRIVATE || $sClass)
- $sUrl = isset($aData['url']) ? $aData['url'] : '';
- // prepare participants list
- $aParticipants = $this->getParticipantsList($aParticipants, $iSender !== $this->_iProfileId);
- if (!$iLotId && empty($aParticipants) && $iType === BX_IM_TYPE_PRIVATE)
- return _t('_bx_messenger_save_part_failed');
- $aBroadcastParticipants = null;
- if ($iType === BX_IM_TYPE_BROADCAST && isset($aData[BX_MSG_TALK_TYPE_BROADCAST])) {
- $aBroadcastParticipants = $this->getProfilesByCriteria($aData[BX_MSG_TALK_TYPE_BROADCAST], [
- 'include_profiles' => $aParticipants
- ]);
- if (empty($aBroadcastParticipants))
- return _t('_bx_messenger_save_part_failed');
- }
- $sMessage = $this->prepareMessageToDb($sMessage);
- if ($sMessage && $iType != BX_IM_TYPE_PRIVATE && $sUrl)
- $sUrl = $this->getPreparedUrl($sUrl);
- if ($sClass === BX_MSG_TALK_CLASS_MARKET)
- $sUrl = $this->_oConfig->getPageIdent($sUrl);
- $aResult = [];
- if (
- ($sMessage || !empty($aFiles) || !empty($aGiphy) || !empty($aAttachments)) && ($iId = $this->_oDb->saveMessage(
- array(
- 'message' => $sMessage,
- 'type' => $iType,
- 'member_id' => $this->_iProfileId,
- 'url' => $sUrl,
- 'title' => $sTitle,
- 'lot' => $iLotId,
- 'reply' => $iReply,
- 'parent' => $iParent,
- 'group_id' => $iGroupId,
- 'class' => $sClass,
- 'participants' => $aParticipants
- )
- ))
- ) {
- if (!$iLotId)
- $aResult['lot_id'] = $this->_oDb->getLotByJotId($iId);
- $aBroadcastContext = [];
- if ($iType === BX_IM_TYPE_BROADCAST && !$iLotId && (int) $aResult['lot_id']) {
- $iAuthorId = $this->_iProfileId;
- $iCreatedLot = (int) $aResult['lot_id'];
- if (isset($aData[BX_MSG_TALK_TYPE_BROADCAST]['author']) && (int) $aData[BX_MSG_TALK_TYPE_BROADCAST]['author'])
- $iAuthorId = $aData[BX_MSG_TALK_TYPE_BROADCAST]['author'];
- if ($aBroadcastParticipants === null)
- $aBroadcastParticipants = $this->getProfilesByCriteria($aData[BX_MSG_TALK_TYPE_BROADCAST], [
- 'include_profiles' => $aParticipants
- ]);
- if (!is_array($aBroadcastParticipants))
- $aBroadcastParticipants = [];
- $aPartList = array_unique(array_merge($aParticipants, (array) $aBroadcastParticipants), SORT_NUMERIC);
- $sModule = $this->_oConfig->getObject('alert');
- $sTemplateName = $this->_oConfig->getName();
- bx_alert($sModule, 'broadcast_attachment_before', $iId, $aResult['lot_id'], [
- 'id' => &$iId,
- 'talk_id' => $aResult['lot_id'],
- 'author' => &$iAuthorId,
- 'template' => &$sTemplateName,
- 'participants' => &$aPartList,
- 'data' => &$aData
- ]);
- $aAttachments[$sTemplateName] = (int) $iId;
- $aNotificationsType = [];
- if (isset($aData[BX_MSG_TALK_TYPE_BROADCAST]['notify_by'])) {
- if ($aNotifData = $aData[BX_MSG_TALK_TYPE_BROADCAST]['notify_by'])
- $aNotificationsType['silent_mode'] = $this->_oConfig->getSelectedNotificationMode($aNotifData);
- }
- $aBroadcastContext = [
- 'author_id' => (int) $iAuthorId,
- 'lot_id' => $iCreatedLot,
- 'jot_id' => (int) $iId,
- 'participants' => array_values(array_unique(array_filter(array_map('intval', $aPartList), function ($iPart) {
- return $iPart > 0;
- }), SORT_NUMERIC)),
- 'notifications' => $aNotificationsType
- ];
- }
- if (!empty($aFiles)) {
- $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
- $aUploadingFilesNames = $aCompleteFilesNames = array();
- if (bx_is_api()) {
- if (is_array($aFiles))
- foreach ($aFiles as &$iFileId) {
- if ($aFile = $oStorage->getFile($iFileId)) {
- $aCompleteFilesNames[] = $aFile[$CNF['FIELD_ST_NAME']];
- $this->_oDb->updateFiles($iFileId, array(
- $CNF['FIELD_ST_JOT'] => $iId,
- ));
- $oStorage->afterUploadCleanup($iFileId, $this->_iProfileId);
- }
- }
- } else
- foreach ($aFiles as &$aFile) {
- if (!(int) $aFile['complete']) {
- $aUploadingFilesNames[] = $aFile['realname'];
- continue;
- }
- if (!$this->_oConfig->isValidToUpload($aFile['name'])) {
- $this->_oDb->deleteJot($iId, $this->_iProfileId, true);
- return _t('_bx_messenger_bad_request');
- }
- $sFile = BX_DIRECTORY_PATH_TMP . basename($aFile['name']);
- $sExt = $oStorage->getFileExt($sFile);
- $sFilename = $oStorage->getFileTitle($aFile['realname']) . ".{$sExt}";
- $iFile = $oStorage->storeFileFromPath($sFile, $iType == BX_IM_TYPE_PRIVATE, $this->_iProfileId, (int) $iId);
- if ($iFile) {
- $oStorage->afterUploadCleanup($iFile, $this->_iProfileId);
- $this->_oDb->updateFiles($iFile, array(
- $CNF['FIELD_ST_JOT'] => $iId,
- $CNF['FIELD_ST_NAME'] => $sFilename
- ));
- $aCompleteFilesNames[] = $sFilename;
- @unlink($sFile);
- }
- }
- if (!empty($aUploadingFilesNames))
- $aAttachments[BX_ATT_TYPE_FILES_UPLOADING] = $aUploadingFilesNames;
- if (!empty($aCompleteFilesNames))
- $aAttachments[BX_ATT_TYPE_FILES] = $aCompleteFilesNames;
- }
- if (is_array($aGiphy) && !empty($aGiphy))
- $aAttachments[BX_ATT_TYPE_GIPHY] = current($aGiphy);
- if ($iReply)
- $this->_oDb->updateJot($iId, $CNF['FIELD_MESSAGE_REPLY'], $iReply);
- if (!empty($aAttachments))
- $this->_oDb->addAttachment($iId, $aAttachments);
- if (!empty($aBroadcastContext)) {
- if ($aBroadcastContext['author_id'] && $aBroadcastContext['author_id'] !== (int) $this->_iProfileId) {
- $this->_oDb->updateConvoFiled($aBroadcastContext['lot_id'], $CNF['FIELD_AUTHOR'], $aBroadcastContext['author_id']);
- $this->_oDb->updateJot($aBroadcastContext['jot_id'], $CNF['FIELD_MESSAGE_AUTHOR'], $aBroadcastContext['author_id']);
- }
- if (!empty($aBroadcastContext['participants'])) {
- $this->_oDb->createBroadcastUsers($aBroadcastContext['lot_id'], $aBroadcastContext['participants']);
- if (!$this->queueBroadcastDelivery($aBroadcastContext['lot_id'], $aBroadcastContext['jot_id'], $aBroadcastContext['author_id'], $aBroadcastContext['notifications']))
- $this->serviceProcessBroadcastQueue($aBroadcastContext['lot_id'], $aBroadcastContext['jot_id'], $aBroadcastContext['author_id'], $aBroadcastContext['notifications']);
- }
- }
- $aResult['jot_id'] = $iId;
- $aJot = $this->_oDb->getJotById($iId);
- if (!empty($aJot))
- $aResult['time'] = bx_time_utc($aJot[$CNF['FIELD_MESSAGE_ADDED']]);
- // Push this jot before onSendJot so a sync agent reply
- // cannot appear on the socket before the message it is answering.
- $iBroadcastLot = $iLotId ? (int)$iLotId : (int)($aResult['lot_id'] ?? 0);
- if (!$iBroadcastLot)
- $iBroadcastLot = (int)$this->_oDb->getLotByJotId($iId);
- $this->broadcastNewJot($iBroadcastLot, $iId);
- $this->onSendJot($iId);
- } else
- return _t('_bx_messenger_send_message_save_error');
- BxDolSession::getInstance()->exists();
- return $aResult;
- }
- public function actionSend()
- {
- $aData = &$_POST;
- if (!$this->isLogged())
- return echoJson(['code' => 1, 'message' => _t('_bx_messenger_not_logged'), 'reload' => 1]);
- if (isset($aData[BX_MSG_TALK_TYPE_BROADCAST]) && $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_BROADCASTS) === true)
- $aData['type'] = BX_IM_TYPE_BROADCAST;
- $aLastJotInfo = isset($aData['lot']) ? $this->_oDb->getLatestJot($aData['lot'], BX_IM_EMPTY, false) : [];
- $mixedResult = $this->sendMessage($aData);
- if (is_array($mixedResult)) {
- if (isset($mixedResult['lot_id']))
- $mixedResult['header'] = $this->_oTemplate->getTalkHeader($mixedResult['lot_id'], $this->_iProfileId);
- $CNF = &$this->_oConfig->CNF;
- if (!empty($aLastJotInfo) && isset($aData['tmp_id'])) {
- $iTimer = $aLastJotInfo[$CNF['FIELD_MESSAGE_ADDED']];
- $iCurrent = intval($aData['tmp_id'] / 1000);
- if (($iCurrent - $iTimer) > $CNF['DATE-SHIFT'])
- $mixedResult['separator'] = $this->_oTemplate->getDateSeparator($iCurrent);
- }
- } else
- return echoJson(array('code' => 1, 'message' => $mixedResult));
- $mixedResult['code'] = 0;
- if ($iTmpId = bx_get('tmp_id'))
- $mixedResult['tmp_id'] = $iTmpId;
- echoJson($mixedResult);
- }
- /**
- * Loads talk to the right side block when member choose conversation or when open messenger page
- * @return array with json result
- */
- public function actionLoadTalk()
- {
- $iLotId = (int) bx_get('lot_id');
- $iJotId = (int) bx_get('jot_id');
- $sAreaType = bx_get('area_type');
- $this->_isBlockMessenger = (bool) bx_get('is_block');
- if (!$iLotId)
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_empty_history'))));
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_logged')), 'reload' => 1));
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- $bIsParticipant = $this->_oDb->isParticipant($iLotId, $this->_iProfileId);
- if (!($bIsParticipant || $this->_oDb->getGroupIdByLotId($iLotId)) && !($aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PUBLIC || $aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_BROADCAST)) {
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_participant')), 'reload' => 1));
- }
- ;
- if ((int) bx_get('mark_as_read'))
- $this->_oDb->readAllMessages($iLotId, $this->_iProfileId);
- $aUnreadJots = $this->_oDb->getNewJots($this->_iProfileId, $iLotId);
- $iUnreadLotsJots = !empty($aUnreadJots) ? (int) $aUnreadJots[$CNF['FIELD_NEW_UNREAD']] : 0;
- $iLastUnreadJot = !empty($aUnreadJots) ? (int) $aUnreadJots[$CNF['FIELD_NEW_JOT']] : 0;
- $aHeader = $this->_oTemplate->getTalkHeader($iLotId, $this->_iProfileId, $this->_isBlockMessenger, true);
- $sHistory = $this->_oTemplate->getHistoryArea(
- [
- 'profile_id' => $this->_iProfileId,
- 'lot' => $iLotId,
- 'jot' => ($iJotId ? $iJotId : $iLastUnreadJot),
- 'area' => $sAreaType
- ],
- $iUnreadLotsJots && $iUnreadLotsJots < ($CNF['MAX_JOTS_BY_DEFAULT'] / 2)
- );
- $sTextArea = !in_array($sAreaType, $CNF['VIEW-IN-TALKS']) ? $this->_oTemplate->getTextArea($this->_iProfileId, $iLotId) : '';
- $aVars = [
- 'code' => 0,
- 'title' => trim(html2txt($aHeader['title'])),
- 'header' => $this->_oTemplate->parseHtmlByName('talk-header.html', $aHeader),
- 'history' => $sHistory,
- 'text_area' => $sTextArea,
- 'last_unread_jot' => $iLastUnreadJot,
- 'unread_jots' => $iUnreadLotsJots,
- 'muted' => (int) $this->_oDb->isMuted($iLotId, $this->_iProfileId),
- 'params' => $this->_oDb->getLotType($iLotId)
- ];
- if ($this->_isBlockMessenger)
- $aVars['talks_list'] = $this->_oTemplate->getTalksList($iLotId);
- BxDolSession::getInstance()->exists();
- echoJson($aVars);
- }
- public function actionLoadThreadTalk()
- {
- $CNF = &$this->_oConfig->CNF;
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_logged')), 'reload' => 1));
- $iJotId = (int) bx_get('jot_id');
- if (!($aJotInfo = $this->_oDb->getJotById($iJotId)))
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_nothing_found')), 'reload' => 1));
- $aLotInfo = $this->_oDb->getLotByParentId($iJotId);
- if (empty($aLotInfo)) {
- $aParentLot = $this->_oDb->getLotInfoById($aJotInfo[$CNF['FIELD_MESSAGE_FK']]);
- if (empty($aParentLot))
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_nothing_found')), 'reload' => 1));
- if (!$this->_oDb->isParticipant($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $this->_iProfileId)) {
- return echoJson(array('code' => 1, 'msg' => MsgBox(_t('_bx_messenger_not_participant')), 'reload' => 1));
- }
- $iLotId = $this->_oDb->createLot(
- $this->_iProfileId,
- [
- 'title' => $aJotInfo[$CNF['FIELD_MESSAGE']] ? strmaxtextlen($aJotInfo[$CNF['FIELD_MESSAGE']]) : $aParentLot[$CNF['FIELD_TITLE']],
- 'type' => BX_IM_TYPE_PRIVATE,
- 'thread' => $iJotId,
- 'participants' => explode(',', $aParentLot[$CNF['FIELD_PARTICIPANTS']])
- ]
- );
- $this->onCreateLot($iLotId);
- } else
- $iLotId = $aLotInfo[$CNF['FIELD_ID']];
- echoJson(['code' => 0, 'lot' => $iLotId]);
- }
- public function actionMarkJotsAsRead()
- {
- $iId = (int) bx_get('lot');
- if (!$this->isLogged() || !$this->_oDb->isParticipant($iId, $this->_iUserId)) {
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_logged')), 'reload' => 1));
- }
- ;
- $this->_oDb->readAllMessages($iId, $this->_iUserId);
- echoJson(array('code' => 0));
- }
- public function actionViewedJot()
- {
- $iJotId = (int) bx_get('jot_id');
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- $aLotInfo = $this->_oDb->getLotByJotId($iJotId, false);
- $CNF = &$this->_oConfig->CNF;
- if (empty($aJotInfo) || !$this->isLogged() || ($aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_PRIVATE && !$this->_oDb->isParticipant($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $this->_iProfileId)))
- return echoJson(array('code' => 1));
- $this->_oDb->readMessage($iJotId, $this->_iProfileId);
- $this->_oDb->markNotificationAsRead($this->_iProfileId, $aJotInfo[$CNF['FIELD_MESSAGE_FK']]);
- $aUnreadInfo = $this->_oDb->getNewJots($this->_iProfileId, $aJotInfo[$CNF['FIELD_MESSAGE_FK']]);
- $iUnreadJotsNumber = $iLastUnreadJotId = 0;
- if (!empty($aUnreadInfo)) {
- $iLastUnreadJotId = (int) $aUnreadInfo[$CNF['FIELD_NEW_JOT']];
- $iUnreadJotsNumber = (int) $aUnreadInfo[$CNF['FIELD_NEW_UNREAD']];
- }
- echoJson(array('code' => 0, 'unread_jots' => $iUnreadJotsNumber, 'last_unread_jot' => $iLastUnreadJotId));
- }
- /**
- * Loads messages for specified lot(conversation)
- * @return array with json
- */
- public function actionLoadJots()
- {
- $iId = (int) bx_get('id');
- $iJotId = (int) bx_get('jot_id');
- if (!$this->isLogged() || !$iId)
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_logged'))));
- if (!$this->_oDb->isParticipant($iId, $this->_iProfileId))
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_participant'))));
- $sContent = $this->_oTemplate->getHistoryArea(['profile_id' => $this->_iProfileId, 'lot' => $iId, 'jot' => $iJotId]);
- echoJson(array('code' => 0, 'history' => $sContent));
- }
- /**
- * Loads search users area
- * @return array|void
- */
- public function actionLoadList()
- {
- if (!$this->isLogged())
- return echoJson(['code' => 1, 'msg' => MsgBox(_t('_bx_messenger_not_logged'))]);
- $sAction = bx_get('action');
- $iGroupId = (int) bx_get('group_id');
- $sGroupType = bx_get('area_type');
- $iLotId = (int) bx_get('lot');
- if ($sAction === 'edit') {
- if (!$iLotId || !($bAllowed = $this->_oDb->isAuthor($iLotId, $this->_iProfileId) || $this->_oConfig->isAllowedAction(BX_MSG_ACTION_ADMINISTRATE_TALKS, $this->_iProfileId) === true))
- return echoJson(['code' => 1]);
- } else
- $iLotId = 0;
- $aProfilesList = [];
- $bIsGroupedChat = $sGroupType === BX_MSG_TALK_TYPE_GROUPS && $iGroupId;
- if ($bIsGroupedChat) {
- $aProfilesList = $this->getParticipantsListByGroupAndFilter($iGroupId);
- if (!empty($aProfilesList))
- $aProfilesList = array_map(function ($aValue) {
- return $aValue['value'];
- }, $aProfilesList);
- }
- if (($mixedContent = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_TALKS, $this->_iProfileId)) !== true) {
- return echoJson([
- 'code' => 1,
- 'msg' => $sContent = MsgBox($mixedContent)
- ]);
- }
- $sContent = $this->_oTemplate->getCreateListArea($iLotId, $aProfilesList, $bIsGroupedChat);
- echoJson([
- 'code' => 0,
- 'content' => $sContent,
- 'text_area' => $this->_oTemplate->getTextArea($this->_iProfileId, $iLotId)
- ]);
- }
- private function getParticipantsListByGroupAndFilter($iGroupId, $sTerm = '')
- {
- $CNF = &$this->_oConfig->CNF;
- $mixedUsers = [];
- if (!$iGroupId || !($aGroupInfo = $this->_oDb->getGroupById($iGroupId)) || $aGroupInfo[$CNF['FMG_MODULE']] === BX_MSG_TALK_TYPE_PAGES)
- return false;
- $oContextProfile = BxDolProfile::getInstance($aGroupInfo[$CNF['FMG_PROFILE_ID']]);
- if ($oContextProfile && ($mixedUsers = bx_srv($aGroupInfo[$CNF['FMG_MODULE']], 'fans', array($oContextProfile->getContentId(), true)))) {
- if ($sTerm)
- $mixedUsers = array_filter($mixedUsers, function ($iVal) use ($sTerm) {
- $oProfile = BxDolProfile::getInstance($iVal);
- return stripos($oProfile->getDisplayName(), $sTerm) !== false ? ['value' => $iVal] : false;
- });
- $mixedUsers = array_map(function ($iVal) {
- return ['value' => $iVal];
- }, $mixedUsers);
- }
- return $mixedUsers;
- }
- function actionGetUsersList()
- {
- $aResult = array('code' => 1);
- $sTerm = bx_get('term');
- $iLotId = (int) bx_get('lot');
- $sAreaType = bx_get('area_type');
- if (!$this->isLogged())
- return echoJson($aResult);
- $sExcept = bx_get('except');
- $aExcept = array();
- if ($sExcept)
- $aExcept = explode(',', $sExcept);
- if ($iLotId && !$this->_oDb->isParticipant($iLotId, $this->_iProfileId))
- return echoJson($aResult);
- $mixedUsers = false;
- if ($iLotId && $sAreaType === 'groups' && ($iGroupId = $this->_oDb->getGroupIdByLotId($iLotId))) {
- $mixedUsers = $this->getParticipantsListByGroupAndFilter($iGroupId, $sTerm);
- if (is_array($mixedUsers))
- $mixedUsers = array_filter($mixedUsers, function ($aValue) use ($aExcept) {
- return !in_array($aValue['value'], $aExcept);
- });
- }
- $aUsers = $mixedUsers !== false ? $mixedUsers : $this->searchProfiles($sTerm, $aExcept, $this->_oConfig->CNF['PARAM_SEARCH_DEFAULT_USERS']);
- if (empty($aUsers))
- return echoJson(array('content' => MsgBox(_t('_bx_messenger_empty_users_list'))));
- $aProfiles = array();
- foreach ($aUsers as &$aValue) {
- if (!$this->onCheckContact($this->_iProfileId, $aValue['value']))
- continue;
- $aProfiles[] = $aValue['value'];
- }
- if (!empty($aProfiles))
- $aResult['content'] = $this->_oTemplate->getProfilesListPreviewForCreateTalkArea($aProfiles);
- echoJson($aResult);
- }
- /**
- * Search for Lots by keywords in the right side block
- * @return string with json
- */
- public function actionSearch()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_logged')), 'reload' => 1));
- $sParam = bx_get('param');
- $iStarred = bx_get('starred');
- $sType = bx_get('type');
- $iGroupId = bx_get('group_id');
- $aResult = ['code' => 0];
- $aParams = ['term' => $sParam, 'star' => (bool) $iStarred];
- $aFoundConvos = $aMyLots = [];
- switch ($sType) {
- case BX_MSG_TALK_TYPE_THREADS:
- $aParams['threads'] = true;
- $aMyLots = $this->_oDb->getMyLots($this->_iProfileId, $aParams, $aFoundConvos);
- break;
- case 'public':
- $aParams['type'] = [BX_IM_TYPE_SETS, BX_IM_TYPE_PUBLIC];
- $aMyLots = $this->_oDb->getMyLots($this->_iProfileId, $aParams, $aFoundConvos);
- break;
- case BX_MSG_TALK_TYPE_MR:
- $aMyLots = $this->_oDb->getReactionsMentionsLots($this->_iProfileId, $aParams);
- break;
- case BX_MSG_TALK_TYPE_REPLIES:
- $aMyLots = $this->_oDb->getLotsWithReplies($this->_iProfileId, $aParams);
- break;
- case BX_MSG_TALK_TYPE_SAVED:
- $aMyLots = $this->_oDb->getSavedJotInLots($this->_iProfileId, $aParams);
- break;
- case BX_MSG_TALK_TYPE_GROUPS:
- $aParams['group'] = $iGroupId;
- $aMyLots = $this->_oDb->getMyLots($this->_iProfileId, $aParams, $aFoundConvos);
- break;
- case BX_MSG_TALK_TYPE_DIRECT:
- $aParams['type'] = [BX_IM_TYPE_PRIVATE];
- default:
- $aMyLots = $this->_oDb->getMyLots($this->_iProfileId, $aParams, $aFoundConvos);
- }
- if (empty($aMyLots))
- $sContent = $sParam ? MsgBox(_t('_bx_messenger_txt_msg_no_results')) : $this->_oTemplate->getFriendsList($sParam); {
- $sContent = $this->_oTemplate->getLotsPreview($this->_iProfileId, $aMyLots);
- if (!empty($aFoundConvos['jots_list'])) {
- foreach ($aFoundConvos['jots_list'] as $iJot => $iConvo) {
- $aResult['search_list'][$iConvo]['list'][] = $iJot;
- }
- }
- }
- $aResult['html'] = $sContent;
- echoJson($aResult);
- }
- /**
- * Update brief of the specified lot in the lots list
- * @return string with json
- */
- public function actionUpdateLotBrief()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_logged')), 'reload' => 1));
- $iLotId = (int) bx_get('lot_id');
- if (!$iLotId || !$this->_oDb->isParticipant($iLotId, $this->_iProfileId))
- return echoJson(array('code' => 1));
- if ($aLots = $this->_oDb->getLotInfoById($iLotId)) {
- return echoJson(array(
- 'code' => 0,
- 'html' => $this->_oTemplate->getLotsPreview($this->_iProfileId, array($aLots)),
- 'muted' => (int) $this->_oDb->isMuted($iLotId, $this->_iProfileId),
- 'params' => $this->_oDb->getLotType($iLotId)
- ));
- }
- echoJson(array('code' => 1));
- }
- /**
- * Prepare url for Lot title if it was created on separated page
- * @param string URL
- * @return string URL
- */
- private function getPreparedUrl($sUrl)
- {
- if (!$sUrl)
- return false;
- $aUrl = parse_url($sUrl);
- return strtolower($aUrl['path'] . (isset($aUrl['query']) ? '?' . $aUrl['query'] : ''));
- }
- private function isAvailable($iLotId)
- {
- if (!$iLotId)
- return false;
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- if (!empty($aLotInfo) && !$this->_oDb->isParticipant($iLotId, $this->_iProfileId) && $aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PRIVATE)
- return false;
- return true;
- }
- /**
- * Loads messages for lot(conversation) (when member wants to view history or get new messages from participants)
- * @return string with json
- */
- public function actionUpdate()
- {
- $CNF = &$this->_oConfig->CNF;
- $iJot = (int) bx_get('jot');
- $iLotId = (int) bx_get('lot');
- $sLoad = bx_get('load');
- $sArea = bx_get('area_type');
- if (!$this->isLogged() && !($sLoad && $iJot && $iLotId))
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_not_logged'), 'reload' => 1));
- if (!$this->isAvailable($iLotId))
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_talk_is_not_allowed')));
- $sUrl = bx_get('url');
- if ($sUrl)
- $sUrl = $this->getPreparedUrl($sUrl);
- $isFocused = (bool) bx_get('focus');
- $iRequestedJot = (int) bx_get('req_jot');
- $iLastViewedJot = (int) bx_get('last_viewed_jot');
- $bUpdateHistory = true;
- $sContent = '';
- $iUnreadJotsNumber = 0;
- $iLastUnreadJotId = 0;
- $bAttach = true;
- $bRemoveSeparator = false;
- switch ($sLoad) {
- case 'new':
- if (!$iJot) {
- $iJot = $this->_oDb->getFirstUnreadJot($this->_iProfileId, $iLotId);
- if ($iJot)
- $iJot = $this->_oDb->getPrevJot($iLotId, $iJot);
- else {
- $aLatestJot = $this->_oDb->getLatestJot($iLotId);
- $iJot = !empty($aLatestJot) ? (int) $aLatestJot[$CNF['FIELD_MESSAGE_ID']] : 0;
- }
- }
- if ($iRequestedJot) {
- if ($this->_oDb->getJotsNumber($iLotId, $iJot, $iRequestedJot) >= $CNF['MAX_JOTS_LOAD_HISTORY'])
- $bUpdateHistory = false;
- else if ($isFocused)
- $this->_oDb->readMessage($iRequestedJot, $this->_iProfileId);
- }
- if ($iLastViewedJot && $bUpdateHistory && $isFocused) {
- $this->_oDb->readMessage($iLastViewedJot, $this->_iProfileId);
- }
- $bAttach = $iJot ? $this->_oDb->getJotsNumber($iLotId, $iJot) < $CNF['MAX_JOTS_LOAD_HISTORY'] : false;
- case 'all':
- case 'prev':
- $aOptions = array(
- 'lot_id' => $iLotId,
- 'url' => $sUrl,
- 'start' => $iJot,
- 'load' => $sLoad,
- 'limit' => $CNF['MAX_JOTS_LOAD_HISTORY'],
- 'views' => true,
- 'dynamic' => true,
- 'area' => $sArea
- );
- $iLastUnreadJotId = $iUnreadJotsNumber = 0;
- $aUnreadInfo = $this->_oDb->getNewJots($this->_iProfileId, $iLotId);
- if (!empty($aUnreadInfo)) {
- $iLastUnreadJotId = (int) $aUnreadInfo[$CNF['FIELD_NEW_JOT']];
- $iUnreadJotsNumber = (int) $aUnreadInfo[$CNF['FIELD_NEW_UNREAD']];
- }
- $sContent = '';
- if ($bUpdateHistory) {
- $aJots = $this->_oTemplate->getJotsOfLot($this->_iProfileId, $aOptions);
- $sContent = $aJots['content'];
- if (isset($aJots['first_jot']) && $iJot && ($aJotInfo = $this->_oDb->getJotById($iJot))) {
- $iFDate = strtotime(date("Y-m-d", $aJots['first_jot'][$CNF['FIELD_MESSAGE_ADDED']]));
- $iSDate = strtotime(date("Y-m-d", $aJotInfo[$CNF['FIELD_MESSAGE_ADDED']]));
- $bRemoveSeparator = +($iFDate == $iSDate);
- }
- }
- break;
- case 'edit':
- $aJotInfo = $this->_oDb->getJotById($iJot);
- $sContent = $aJotInfo[$this->_oConfig->CNF['FIELD_MESSAGE']];
- break;
- case 'vc':
- case 'delete':
- $sContent = $this->_oTemplate->getMessageIcons($iJot, $sLoad, $this->_oDb->isAuthor($iLotId, $this->_iProfileId) || isAdmin());
- break;
- case 'check_viewed':
- if ($iLotId && $iJot)
- $sContent = $this->_oTemplate->getViewedJotProfiles($iJot, $this->_iProfileId);
- break;
- case 'reaction':
- if ($iJot) {
- $aJotInfo = $this->_oDb->getJotById($iJot);
- if (!empty($aJotInfo))
- $sContent = $this->_oTemplate->getJotReactions($iJot);
- }
- break;
- }
- $aResult = array(
- 'code' => 0,
- 'html' => $sContent,
- 'unread_jots' => $iUnreadJotsNumber,
- 'last_unread_jot' => $iLastUnreadJotId,
- 'allow_attach' => +$bAttach,
- 'remove_separator' => +$bRemoveSeparator
- );
- // update session
- BxDolSession::getInstance()->exists();
- echoJson($aResult);
- }
- public function searchFriends($sTerm, $aProfilesList = array())
- {
- if (!$sTerm || !($aTerms = preg_split("/[\s,]+/", $sTerm)))
- return array();
- $oConnection = BxDolConnection::getObjectInstance('sys_profiles_friends');
- $aProfiles = !empty($aProfilesList) ? $aProfilesList : $oConnection->getConnectedContent($this->_iProfileId, true);
- $aResult = array();
- if (empty($aProfiles))
- return $aResult;
- $aModules = BxDolService::call('system', 'get_profiles_modules', array(), 'TemplServiceProfiles');
- if (empty($aModules))
- return $aResult;
- $aProfilesModules = array();
- foreach ($aModules as &$aModule)
- $aProfilesModules[$aModule['name']] = BxDolModule::getInstance($aModule['name']);
- $aFieldsFilter = array();
- foreach ($aProfiles as &$iID) {
- $oProfileInfo = BxDolProfile::getInstance($iID);
- if (!empty($oProfileInfo)) {
- $aInfo = $oProfileInfo->getInfo();
- if (isset($aInfo['type']) && isset($aProfilesModules[$aInfo['type']])) {
- $aProfileInfo = $aProfilesModules[$aInfo['type']]->_oDb->getContentInfoByProfileId($iID);
- if (!isset($aFieldsFilter[$aInfo['type']])) {
- $sFields = getParam($aProfilesModules[$aInfo['type']]->_oConfig->CNF['PARAM_SEARCHABLE_FIELDS']);
- if ($sFields)
- $aFieldsFilter[$aInfo['type']] = explode(',', $sFields);
- }
- if ($aFieldsFilter[$aInfo['type']]) {
- $sSearchString = '';
- foreach ($aFieldsFilter[$aInfo['type']] as &$sKey)
- $sSearchString .= " {$aProfileInfo[$sKey]}";
- if ($sSearchString) {
- $bResult = true;
- foreach ($aTerms as &$sValue)
- if (stripos($sSearchString, $sValue) === FALSE) {
- $bResult = false;
- break;
- }
- if ($bResult)
- $aResult[$aInfo['type']][] = $aProfileInfo;
- }
- }
- }
- }
- }
- return $aResult;
- }
- public function searchProfiles($sTerm, $aExcept = array(), $iLimit = 10)
- {
- $CNF = &$this->_oConfig->CNF;
- $aModules = BxDolService::call('system', 'get_profiles_modules', array(), 'TemplServiceProfiles');
- if (empty($aModules))
- return array();
- if ($CNF['USE-FRIENDS-ONLY-MODE'])
- $aSearchResult = $this->searchFriends($sTerm);
- else {
- $aModules = array_map(function ($aModule) {
- return $aModule['name'];
- }, $aModules);
- $o = new BxDolSearch($aModules);
- $o->setDataProcessing(true);
- $o->setCustomSearchCondition(array('keyword' => $sTerm));
- $o->setCustomCurrentCondition(array(
- 'paginate' => array(
- 'perPage' => $iLimit / count($aModules) + 0.5
- )
- ));
- $aSearchResult = $o->response();
- if (empty($aSearchResult))
- return array();
- }
- bx_alert($this->getName(), 'get_profiles_list', 0, 0, ['term' => $sTerm, 'override_list' => &$aSearchResult]);
- $aUsers = [];
- if (!bx_is_api()) {
- foreach ($aSearchResult as $sModule => $aItems) {
- $aCNF = BxDolModule::getInstance($sModule)->_oConfig->CNF;
- $sTitleField = $aCNF['FIELD_TITLE'];
- $sIdField = $aCNF['FIELD_ID'];
- foreach ($aItems as &$aItem) {
- $sLabel = isset($aItem[$sTitleField]) ? $aItem[$sTitleField] : false;
- if ($sLabel)
- $aUsers[] = array(
- 'value' => BxDolProfile::getInstanceByContentAndType($aItem[$sIdField], $sModule)->id(),
- 'label' => $sLabel,
- );
- }
- }
- // sort result
- usort($aUsers, function ($r1, $r2) {
- return strcmp($r1['label'], $r2['label']);
- });
- if (!empty($aExcept))
- $aUsers = array_filter($aUsers, function ($aUsers) use ($aExcept) {
- return !in_array($aUsers['value'], $aExcept);
- });
- } else
- $aUsers = $aSearchResult;
- return array_slice($aUsers, 0, $iLimit);
- }
- /**
- * Occurs when member adds or edit participants list for new of specified lot
- * @return string with json code
- */
- public function actionGetAutoComplete()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_not_logged'), 'reload' => 1));
- $aResult = $aExcept = array();
- $sExcept = bx_get('except');
- if ($sExcept)
- $aExcept = explode(',', $sExcept);
- $aUsers = $this->searchProfiles(bx_get('term'), $aExcept, $this->_oConfig->CNF['PARAM_SEARCH_DEFAULT_USERS']);
- if (empty($aUsers))
- return echoJson(array('items' => $aUsers));
- $bDonShowDesc = $this->_oConfig->CNF['DONT-SHOW-DESC'];
- foreach ($aUsers as &$aValue) {
- if (!$this->onCheckContact($this->_iUserId, $aValue['value']))
- continue;
- if (!($oProfile = BxDolProfile::getInstance($aValue['value'])))
- continue;
- $aProfileInfo = $oProfile->getInfo();
- $aProfileInfoDetails = BxDolService::call($aProfileInfo['type'], 'get_content_info_by_id', array($aProfileInfo['content_id']));
- $oAccountInfo = BxDolAccount::getInstance($aProfileInfo['account_id']);
- $sThumb = $oProfile->getThumb();
- $bThumb = stripos($sThumb, 'no-picture') === FALSE;
- $sDisplayName = $oProfile->getDisplayName();
- if (!empty($aProfileInfoDetails) && !empty($oAccountInfo)) {
- $aResult[$aProfileInfo['type']]['results'][] = array(
- 'value' => $sDisplayName,
- 'no_desc' => (int) $bDonShowDesc,
- 'icon' => $bThumb ? $sThumb : '',
- 'color' => implode(', ', BxDolTemplate::getColorCode($aValue['value'], 1.0)),
- 'letter' => mb_substr($sDisplayName, 0, 1),
- 'id' => $oProfile->id(),
- 'profile_url' => $oProfile->getUrl(),
- 'description' => !$bDonShowDesc ? _t(
- '_bx_messenger_search_desc',
- bx_process_output($oAccountInfo->getInfo()['logged'], BX_DATA_DATE_TS),
- bx_process_output($aProfileInfoDetails['added'], BX_DATA_DATE_TS)
- ) : ''
- );
- }
- }
- foreach ($aResult as $sKey => $aValues) {
- $aResult[$sKey]['name'] = _t("_{$sKey}");
- }
- echoJson(array('results' => $aResult));
- }
- /**
- * Returns processed videos by received videos ids
- * @return array with json
- */
- public function actionGetProcessedMedia()
- {
- $CNF = &$this->_oConfig->CNF;
- $aMedia = bx_get('media');
- $aResult = array();
- if (empty($aMedia))
- return echoJson($aResult);
- $oTranscoderAudio = BxDolTranscoderAudio::getObjectInstance($CNF['OBJECT_MP3_TRANSCODER']);
- $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
- if (empty($oStorage))
- return echoJson($aResult);
- foreach ($aMedia as &$iMedia) {
- $aFile = $oStorage->getFile($iMedia);
- if ($oTranscoderAudio->isMimeTypeSupported($aFile['mime_type']) && $oTranscoderAudio->isFileReady($iMedia))
- $aResult[$iMedia] = $this->_oTemplate->audioPlayer($oTranscoderAudio->getFileUrl($aFile[$CNF['FIELD_ST_ID']]), true);
- if (!strncmp('video/', $aFile['mime_type'], 6))
- $aResult[$iMedia] = $this->_oTemplate->getVideoFilesToPlay($aFile);
- }
- echoJson($aResult);
- }
- /**
- * Search for lot by participants list and occurs when member edit participants list
- * @return string with json
- */
- public function actionFindLot()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_not_logged'), 'reload' => 1));
- $CNF = &$this->_oConfig->CNF;
- $aParticipants = $this->getParticipantsList(bx_get('participants'));
- $aResult = array('lot' => 0);
- if (
- !empty($aParticipants) && ($aChat = $this->_oDb->findLotByParams(array(
- $CNF['FIELD_PARTICIPANTS'] => $aParticipants,
- $CNF['FIELD_TYPE'] => BX_IM_TYPE_PRIVATE,
- $CNF['FIELD_CLASS'] => BX_MSG_TALK_CLASS_CUSTOM,
- )))
- )
- $aResult['lot'] = $aChat[$this->_oConfig->CNF['FIELD_ID']];
- echoJson($aResult);
- }
- /**
- * Updats participants list (occurs when create new lost with specified participants or update already existed list)
- * @return string with json
- */
- public function saveParticipantsList($aParticipants, $iLotId = 0, $bIsBlock = 0)
- {
- $iLotIdOr = $iLotId;
- $bCheckAction = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_ADMINISTRATE_TALKS, $this->_iProfileId) === true;
- if ($iLotId && !($this->_oDb->isAuthor($iLotId, $this->_iProfileId) || $bCheckAction))
- return ['code' => 1, 'message' => _t('_bx_messenger_lot_action_not_allowed')];
- $CNF = &$this->_oConfig->CNF;
- if (!$iLotId) {
- $aLot = $this->_oDb->findLotByParams(array(
- $CNF['FIELD_PARTICIPANTS'] => $aParticipants,
- $CNF['FIELD_TYPE'] => BX_IM_TYPE_PRIVATE,
- $CNF['FIELD_CLASS'] => BX_MSG_TALK_CLASS_CUSTOM,
- ));
- if (!empty($aLot))
- $iLotId = $aLot[$this->_oConfig->CNF['FIELD_ID']];
- }
- $oOriginalParts = [];
- $aResult = ['code' => 0, 'message' => _t('_bx_messenger_save_part_success')];
- if (!$iLotId) {
- $iLotId = $this->_oDb->createNewLot($this->_iProfileId, ['title' => '', 'type' => BX_IM_TYPE_PRIVATE, 'url' => BX_IM_EMPTY_URL], $aParticipants);
- $aResult['lot'] = $iLotId;
- $this->onCreateLot($iLotId);
- } else {
- $oOriginalParts = $this->_oDb->getParticipantsList($iLotId);
- if ($iLotIdOr == 0 && $iLotId) {
- $aResult['lot'] = $iLotId;
- } else {
- if (!$this->_oDb->saveParticipantsList($iLotId, $aParticipants))
- $aResult = ['code' => 2, 'message' => _t('_bx_messenger_lot_parts_error')];
- }
- }
- $aRemoveParticipants = array_diff($oOriginalParts, $aParticipants);
- $aNewParticipants = array_diff($aParticipants, $oOriginalParts);
- foreach ($aNewParticipants as &$iPartId)
- $this->onAddNewParticipant($iLotId, $iPartId);
- foreach ($aRemoveParticipants as &$iPartId) {
- $this->_oDb->deleteNewJot($iPartId, $iLotId);
- $this->onRemoveParticipant($iLotId, $iPartId);
- }
- return $aResult;
- }
- public function actionSaveLotsParts()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_not_logged'), 'reload' => 1));
- $iLotId = bx_get('lot');
- $bIsBlockVersion = +bx_get('is_block');
- $aParticipants = $this->getParticipantsList(bx_get('participants'));
- $aResult = array('message' => _t('_bx_messenger_save_part_failed'), 'code' => 1);
- if (empty(bx_get('participants')))
- return echoJson($aResult);
- $aResult = $this->saveParticipantsList($aParticipants, $iLotId, $bIsBlockVersion);
- if ($iLotId) {
- $aHeader = $this->_oTemplate->getTalkHeader($iLotId, $this->_iProfileId, $bIsBlockVersion, true);
- $aResult['header'] = $aHeader['title'];
- $aResult['buttons'] = $aHeader['buttons'];
- }
- echoJson($aResult);
- }
- /**
- * Removes specified lot
- * @return string with json
- */
- public function actionDelete()
- {
- $iLotId = bx_get('lot');
- $aResult = array('message' => _t('_bx_messenger_can_not_delete'), 'code' => 1);
- $bAllowed = $this->_oDb->isAuthor($iLotId, $this->_iProfileId) || ($this->_oConfig->isAllowedAction(BX_MSG_ACTION_ADMINISTRATE_TALKS, $this->_iProfileId) === true);
- if (!$iLotId || !$bAllowed)
- return echoJson($aResult);
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- if ($this->_oDb->deleteLot($iLotId)) {
- $aResult = ['code' => 0];
- $this->onDeleteLot($aLotInfo);
- }
- echoJson($aResult);
- }
- /**
- * Clear specified lot
- * @return string with json
- */
- public function actionClearHistory()
- {
- $iLotId = bx_get('lot');
- $aResult = array('code' => 1, 'message' => _t('_Empty'));
- $bAllowed = $this->_oDb->isAuthor($iLotId, $this->_iProfileId) || ($this->_oConfig->isAllowedAction(BX_MSG_ACTION_ADMINISTRATE_TALKS, $this->_iProfileId) === true);
- if (!$iLotId || !$bAllowed) {
- return echoJson($aResult);
- }
- if ($this->_oDb->clearLot($iLotId))
- $aResult = array('code' => 0);
- echoJson($aResult);
- }
- /**
- * Removes specified jot
- * @return string with json
- */
- public function actionDeleteJot()
- {
- $iJotId = bx_get('jot');
- $bCompletely = (int) bx_get('completely');
- $aReturn = $this->serviceDeleteJot($iJotId, $bCompletely);
- echoJson($aReturn);
- }
- public function serviceDeleteJot($iJotId, $bCompletely = false)
- {
- $aResult = array('code' => 1);
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- if (empty($aJotInfo))
- return $aResult;
- $CNF = &$this->_oConfig->CNF;
- $bIsAllowedToDelete = $this->_oDb->isAllowedToDeleteJot($iJotId, $this->_iProfileId, $aJotInfo[$CNF['FIELD_MESSAGE_AUTHOR']]);
- if (!$bIsAllowedToDelete)
- return $aResult;
- $bIsLotAuthor = $this->_oDb->isAuthor($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $this->_iProfileId);
- $bDelete = $bCompletely || $CNF['REMOVE_MESSAGE_IMMEDIATELY'];
- if ($this->_oDb->deleteJot($iJotId, $this->_iProfileId, $bDelete)) {
- if ($bDelete)
- $this->onDeleteJot($aJotInfo);
- $aResult = array('code' => 0, 'html' => !$bCompletely ? $this->_oTemplate->getMessageIcons($iJotId, 'delete', $bIsLotAuthor || isAdmin()) : '');
- }
- return $aResult;
- }
- /**
- * React on defined jot
- * @return string with json
- */
- public function actionJotReaction()
- {
- $iJotId = bx_get('jot');
- $aEmoji = bx_get('emoji');
- $sAction = bx_get('action');
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- $aResult = array('code' => 1);
- $CNF = &$this->_oConfig->CNF;
- if (empty($aJotInfo))
- return echoJson($aResult);
- $bIsParticipant = $this->_oDb->isParticipant($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $this->_iProfileId);
- $aLotInfo = $this->_oDb->getLotInfoById($aJotInfo[$CNF['FIELD_MESSAGE_FK']]);
- if (!$bIsParticipant) {
- if ($aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PRIVATE)
- return echoJson(array('code' => 1, 'msg' => _t('_bx_messenger_not_participant')));
- if (!empty($aLotInfo))
- $this->_oDb->addMemberToParticipantsList($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $this->_iProfileId);
- }
- if ($sAction == BX_JOT_REACTION_ADD && $this->_oDb->addJotReaction($iJotId, $this->_iProfileId, $aEmoji)) {
- $this->onReactJot($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $iJotId, $aLotInfo[$CNF['FIELD_AUTHOR']], $sAction);
- $aResult = array('code' => 0, 'html' => $this->_oTemplate->getJotReactions($iJotId));
- }
- echoJson($aResult);
- }
- public function actionUpdateReaction()
- {
- $iJotId = bx_get('jot');
- $sEmoji = bx_get('emoji_id');
- $sAction = bx_get('action');
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- $aResult = array('code' => 1);
- $CNF = &$this->_oConfig->CNF;
- if (empty($aJotInfo))
- return echoJson($aResult);
- $bIsParticipant = $this->_oDb->isParticipant($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $this->_iProfileId);
- $aLotInfo = $this->_oDb->getLotInfoById($aJotInfo[$CNF['FIELD_MESSAGE_FK']]);
- if (!$bIsParticipant && $sAction == BX_JOT_REACTION_ADD && $aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PRIVATE)
- return echoJson($aResult);
- if ($this->_oDb->updateReaction($iJotId, $this->_iProfileId, $sEmoji, $sAction)) {
- $this->onReactJot(
- $aJotInfo[$CNF['FIELD_MESSAGE_FK']],
- $iJotId,
- $aLotInfo[$CNF['FIELD_AUTHOR']],
- $sAction === BX_JOT_REACTION_ADD ? BX_JOT_REACTION_ADD : BX_JOT_REACTION_REMOVE
- );
- $aResult = array('code' => 0);
- }
- echoJson($aResult);
- }
- /**
- * Get body of the jot
- * @return string with json
- */
- public function actionViewJot()
- {
- $iJotId = bx_get('jot');
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- if (empty($aJotInfo) || !(isAdmin() || $this->_oDb->isAuthor($aJotInfo[$this->_oConfig->CNF['FIELD_MESSAGE_FK']], $this->_iProfileId)))
- return echoJson(array('code' => 1));
- $aResult = array('code' => 0, 'html' => $this->_oTemplate->getJotsBody($iJotId));
- echoJson($aResult);
- }
- /**
- * Get body of the jot
- * @return string with json
- */
- public function actionGetJotPreview()
- {
- $iJotId = bx_get('jot');
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- if (empty($aJotInfo) || !(isAdmin() || $this->_oDb->isAuthor($aJotInfo[$this->_oConfig->CNF['FIELD_MESSAGE_FK']], $this->_iProfileId)))
- return echoJson(array('code' => 1));
- $aResult = array('code' => 0, 'html' => $this->_oTemplate->getReplyPreview($iJotId));
- echoJson($aResult);
- }
- /**
- * Jot edit panel
- * @return string with json
- */
- public function actionEditJotForm()
- {
- $iJotId = bx_get('jot');
- $aResult = array('code' => 1);
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- $mixedResult = $this->_oDb->isAllowedToEditJot($iJotId, $this->_iProfileId);
- if (empty($aJotInfo) || $mixedResult !== true)
- return echoJson($aResult);
- echoJson(['code' => 0, 'html' => $this->_oTemplate->getEditJotArea($iJotId)]);
- }
- public function actionEditJot()
- {
- $iJotId = bx_get('jot');
- $aResult = ['code' => 1];
- $sMessageData = bx_get('message');
- if (!($aJotInfo = $this->_oDb->getJotById($iJotId)))
- return echoJson($aResult);
- $sMessage = $this->prepareMessageToDb($sMessageData);
- $mixedResult = $this->_oDb->isAllowedToEditJot($iJotId, $this->_iProfileId);
- if ($mixedResult !== true)
- return echoJson($aResult);
- if ($this->_oDb->editJot($iJotId, $this->_iProfileId, $sMessage)) {
- $aResult = ['code' => 0, 'html' => $this->_oTemplate->getMessageIcons($iJotId, 'edit')];
- $this->onUpdateJot($aJotInfo[$this->_oConfig->CNF['FIELD_MESSAGE_FK']], $iJotId, $aJotInfo[$this->_oConfig->CNF['FIELD_MESSAGE_AUTHOR']]);
- }
- echoJson($aResult);
- }
- public function actionSaveJotItem()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1));
- $iJotId = bx_get('jot');
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- $aResult = array('code' => 1, 'msg' => _t('_bx_messenger_nothing_found'));
- if (empty($aJotInfo))
- return echoJson($aResult);
- $CNF = &$this->_oConfig->CNF;
- if (!$this->isAvailable($aJotInfo[$CNF['FIELD_MESSAGE_FK']]))
- return echoJson(array('code' => 1, 'msg' => _t('_bx_messenger_not_participant')));
- $bSaved = $this->_oDb->isJotSaved($iJotId, $this->_iProfileId);
- $bCode = false;
- if ($bSaved)
- $bCode = $this->_oDb->deleteSavedJotItems($iJotId, $this->_iProfileId);
- else
- $bCode = $this->_oDb->saveJotItem($iJotId, $this->_iProfileId);
- echoJson(array('code' => (int) !$bCode, 'status' => (int) !$bSaved));
- }
- /**
- * Removes specified file by id
- * @return string with json
- */
- public function actionDeleteFile()
- {
- $iFileId = bx_get('id');
- $aResult = array('code' => 1, 'message' => _t('_bx_messenger_post_file_not_found'));
- if (!$iFileId)
- return echoJson($aResult);
- $CNF = &$this->_oConfig->CNF;
- $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
- $aFile = $oStorage->getFile($iFileId);
- if (empty($aFile))
- return echoJson($aResult);
- $bIsAllowedToDelete = $this->_oDb->isAllowedToDeleteJot($aFile[$CNF['FIELD_ST_JOT']], $this->_iProfileId);
- if (!$bIsAllowedToDelete)
- return echoJson($aResult);
- $aJotInfo = $this->_oDb->getJotById($aFile[$CNF['FIELD_ST_JOT']]);
- $this->_oDb->removeFileFromJot($aJotInfo[$CNF['FIELD_MESSAGE_ID']], $iFileId);
- if ($oStorage->deleteFile($iFileId, $this->_iProfileId)) {
- $aResult = array('code' => 0);
- $aJotFiles = $this->_oDb->getJotFiles($aFile[$CNF['FIELD_ST_JOT']]);
- if (count($aJotFiles) == 0 && !$aJotInfo[$CNF['FIELD_MESSAGE']] && $this->_oDb->deleteJot($aJotInfo[$CNF['FIELD_MESSAGE_ID']], $this->_iProfileId)) {
- $aResult['empty_jot'] = 1;
- $this->onDeleteJot($aJotInfo);
- } else
- $this->onUpdateJot($aJotInfo[$CNF['FIELD_MESSAGE_FK']], $aJotInfo[$CNF['FIELD_MESSAGE_ID']], $aJotInfo[$CNF['FIELD_MESSAGE_AUTHOR']]);
- }
- echoJson($aResult);
- }
- /**
- * Leave talk with defined id
- * @return string with json
- */
- public function actionLeave()
- {
- $iLotId = bx_get('lot');
- if (!$iLotId || !$this->_oDb->isParticipant($iLotId, $this->_iProfileId)) {
- return echoJson(['message' => _t('_bx_messenger_not_participant'), 'code' => 1]);
- }
- if ($this->_oDb->isAuthor($iLotId, $this->_iProfileId))
- return echoJson(['message' => _t('_bx_messenger_cant_leave'), 'code' => 1]);
- if ($this->_oDb->leaveLot($iLotId, $this->_iProfileId))
- return echoJson(['message' => _t('_bx_messenger_successfully_left'), 'code' => 0]);
- }
- /**
- * Block notifications from specified lot(conversation)
- * @return string with json
- */
- public function actionMute()
- {
- $iLotId = bx_get('lot');
- if ($iLotId && $this->isAvailable($iLotId)) {
- $bMuted = $this->_oDb->muteLot($iLotId, $this->_iProfileId);
- return echoJson(array('code' => $bMuted, 'title' => $bMuted ? _t('_bx_messenger_lots_menu_mute_info_on') : _t('_bx_messenger_lots_menu_mute_info_off')));
- }
- return echoJson(array('code' => 1));
- }
- /**
- * Mark lot as favorite
- * @return string with json
- */
- public function actionStar()
- {
- $iLotId = bx_get('lot');
- if ($iLotId) {
- $bStar = $this->_oDb->starLot($iLotId, $this->_iProfileId);
- return echoJson(array('code' => $bStar, 'title' => !$bStar ? _t('_bx_messenger_lots_menu_star_on') : _t('_bx_messenger_lots_menu_star_off')));
- }
- return echoJson(array('code' => 1));
- }
- /**
- * Returns number of lots with at least one unread message
- * @return int
- */
- public function serviceGetUpdatedLotsNum($iProfileId = 0)
- {
- if (!$this->isLogged())
- return array();
- $aLots = $this->_oDb->getLotsWithUnreadMessages($iProfileId ? $iProfileId : $this->_iProfileId);
- return sizeof($aLots);
- }
- /**
- * Common function to send notifications to the Talk's participants
- * @param $iLotId integer Talk's id
- * @param $iJotId integer message id
- * @return bool|string
- */
- private function sendMessageNotification($iLotId, $iJotId)
- {
- $aReceived = [];
- if (!$iLotId || !$iJotId)
- return false;
- $CNF = &$this->_oConfig->CNF;
- $aJot = $this->_oDb->getJotById($iJotId);
- $sMessage = $aJot[$CNF['FIELD_MESSAGE']];
- if ($sMessage) {
- $sMessage = preg_replace('/<br\s?\/?>/i', "\r\n", $sMessage);
- $sMessage = html2txt($sMessage);
- $sMessage = get_mb_substr($sMessage, 0, (int) $CNF['PARAM_PUSH_NOTIFICATIONS_DEFAULT_SYMBOLS_NUM']);
- // find mentions in the message and send notifications
- if ($CNF['USE_MENTIONS'] && preg_match_all('/<a[^>]*class="bx-mention[^"]*"[^>]*data-id="(\d+)".*?<\/a>/i', $aJot[$CNF['FIELD_MESSAGE']], $aMatches)) {
- list(, $aMentionedProfiles) = $aMatches;
- if ($aMentionedProfiles) {
- $this->sendNotification($iLotId, $iJotId, $sMessage, $aReceived, $aMentionedProfiles, BX_MSG_NTFS_MENTION);
- $aReceived = array_diff($aReceived, $aMentionedProfiles);
- }
- }
- }
- return $this->sendNotification($iLotId, $iJotId, $sMessage, $aReceived);
- }
- /**
- * Sends push notification to the Talk's participants through the Notifications module or
- * using Messenger's push notifications settings.
- *
- * @param $iLotId
- * @param $iJotId
- * @param $sMessage
- * @param array $aReceived
- * @param array $aRecipients
- * @param string $sType
- * @return bool|string
- */
- private function sendNotification($iLotId, $iJotId, $sMessage, $aReceived = [], $aRecipients = [], $sType = BX_MSG_NTFS_MESSAGE)
- {
- // check if the Notifications module is installed and send notifications through it
- if ($this->_oDb->isModuleByName('bx_notifications'))
- return $this->sendNotifications($iLotId, $iJotId, $aReceived, $aRecipients, $sType);
- }
- /**
- * Proper the list of the participants whom to send notifications
- * @param $iLotId
- * @param $iJotId
- * @param array $aOnlineUsers
- * @param array $aRecipients
- * @param string $sType
- * @return bool
- */
- public function sendNotifications($iLotId, $iJotId, $aOnlineUsers = [], $aRecipients = [], $sType = BX_MSG_NTFS_MESSAGE)
- {
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- $sModule = $this->_oConfig->getObject('alert');
- if (empty($aLotInfo))
- return false;
- $aPartList = $this->_oDb->getParticipantsList($iLotId, true, $this->_iProfileId);
- if ((int) $aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_BROADCAST) {
- $iJotCount = $this->_oDb->getJotsNumber($iLotId, 0);
- if ($iJotCount >= 2)
- $aPartList = $this->_oDb->getBroadcastParticipants($iLotId);
- }
- if (empty($aPartList))
- return false;
- if (!empty($aRecipients)) {
- $aDiff = array_diff($aRecipients, $aPartList);
- if (!empty($aDiff) && (int) $aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_PRIVATE) // in case if the mentioned profiles are not in the participants list
- $aPartList = array_diff($aRecipients, $aDiff);
- else
- $aPartList = $aRecipients;
- }
- $bIsMention = ($sType == BX_MSG_NTFS_MENTION);
- foreach ($aPartList as &$iPart) {
- if (array_search($iPart, $aOnlineUsers) !== FALSE || $this->_oDb->isMuted($iLotId, $iPart))
- continue;
- $iCount = $this->_oDb->getSentNtfsNumber($iPart, $iLotId);
- if ($iCount >= (int) $CNF['MAX_NTFS_NUMBER'] && !$bIsMention)
- continue;
- bx_alert($sModule, !$bIsMention ? 'got_jot_ntfs' : 'got_mention_ntfs', $iLotId, $this->_iProfileId, array(
- 'object_author_id' => $iPart,
- 'recipient_id' => $iPart,
- 'subobject_id' => $iJotId,
- 'source' => $sModule . '_' . $iJotId,
- 'source_mac' => $sModule . '_' . $this->_iProfileId . '_' . $iJotId,
- ));
- }
- return true;
- }
- /**
- * Creates template with member's avatar, name and etc... It is used when member posts a message to add message to member history immediately
- * @return string json
- */
- public function actionLoadMembersTemplate()
- {
- $sTemplate = '';
- if ($this->isLogged())
- $sTemplate = $this->_oTemplate->getMembersJotTemplate($this->_iProfileId);
- echoJson(
- array(
- 'data' => $sTemplate
- )
- );
- }
- /**
- * Delete all content by profile ID
- * @param object oAlert
- * @return boolean
- */
- public function serviceDeleteHistoryByAuthor($oAlert)
- {
- return $oAlert->iObject && !empty($oAlert->aExtras['delete_with_content']) ?
- $this->_oDb->deleteProfileInfo($oAlert->iObject) : false;
- }
- /**
- * Process alerts actions
- * @param object oAlert
- * @return boolean
- */
- public function serviceResponse($oAlert)
- {
- $CNF = &$this->_oConfig->CNF;
- $iGroupProfileId = 0;
- $iExecutor = 0;
- $sModule = '';
- if ($oAlert->sAction == 'fan_added') {
- $iGroupProfileId = $oAlert->iObject;
- $iExecutor = $oAlert->aExtras['performer_id'];
- $sModule = $oAlert->sUnit;
- } else if ($oAlert->sAction == 'connection_removed') {
- $iGroupProfileId = BxDolProfile::getInstance($oAlert->aExtras['initiator'])->getContentId();
- $iExecutor = $oAlert->iSender;
- $sModule = str_replace('_fans', '', $oAlert->sUnit);
- }
- if (BxDolRequest::serviceExists($sModule, 'is_group_profile') && $iGroupProfileId) {
- $aGroupInfo = BxDolService::call($sModule, 'get_info', array($iGroupProfileId, false));
- if (!empty($aGroupInfo) && is_array($aGroupInfo)) {
- $oModule = BxDolModule::getInstance($sModule);
- if ($oModule->_oConfig) {
- $oMCNF = $oModule->_oConfig->CNF;
- $sUrl = "i={$oMCNF['URI_VIEW_ENTRY']}&id=" . $aGroupInfo[$oMCNF['FIELD_ID']];
- if ($sUrl && $aTalk = $this->_oDb->getLotByUrl($sUrl)) {
- if ($oAlert->sAction == 'fan_added' && BxDolService::call($sModule, 'check_allowed_view_for_profile', array($aGroupInfo)) === CHECK_ACTION_RESULT_ALLOWED) {
- if (!$this->_oDb->isParticipant($aTalk[$oMCNF['FIELD_ID']], $iExecutor))
- $this->_oDb->addMemberToParticipantsList($aTalk[$oMCNF['FIELD_ID']], $iExecutor);
- } else if ($oAlert->sAction == 'connection_removed' && $this->_oDb->isParticipant($aTalk[$oMCNF['FIELD_ID']], $iExecutor)) {
- $this->_oDb->removeParticipant($aTalk[$oMCNF['FIELD_ID']], $iExecutor);
- }
- }
- }
- }
- }
- }
- /**
- * Parse jot's link (repost)
- * @param object oAlert
- * @return string json
- */
- public function actionParseLink()
- {
- $sUrl = bx_get('link');
- $iJotId = (int) bx_get('jot_id');
- $bDontAttach = (int) bx_get('dont_attach');
- $aUrl = $this->_oConfig->isJotLink($sUrl);
- if (!empty($aUrl)) {
- $aJotInfo = $this->_oDb->getJotById($aUrl['id']);
- if (!$this->_oDb->isParticipant($aJotInfo[$this->_oConfig->CNF['FIELD_MESSAGE_FK']], $this->_iUserId))
- return echoJson(array('code' => 0));
- $sHTML = $this->_oTemplate->getJotAsAttachment($aUrl['id']);
- if ($sHTML && !$bDontAttach)
- $this->_oDb->addAttachment($iJotId, $aUrl['id'], BX_ATT_TYPE_REPOST);
- return echoJson(array('code' => 0, 'html' => $sHTML));
- }
- echoJson(array('code' => 1));
- }
- /**
- * Parses link from the message
- * @param object oAlert
- * @return json
- */
- public function actionGetAttachment()
- {
- $iJotId = (int) bx_get('jot_id');
- if ($iJotId) {
- $aJot = $this->_oDb->getJotById($iJotId);
- if (!empty($aJot) && $this->_oDb->isParticipant($aJot[$this->_oConfig->CNF['FIELD_MESSAGE_FK']], $this->_iProfileId)) {
- if (($aAttachment = $this->_oTemplate->getAttachment($aJot, true)) && isset($aAttachment[BX_ATT_GROUPS_ATTACH]))
- return echoJson(['code' => 0, 'html' => $aAttachment[BX_ATT_GROUPS_ATTACH]]);
- }
- }
- echoJson(['code' => 1]);
- }
- /**
- * Returns HTML popup form for video recording
- */
- public function actionGetRecordVideoForm()
- {
- header('Content-type: text/html; charset=utf-8');
- echo $this->_oTemplate->getVideoRecordingForm($this->_iUserId);
- exit;
- }
- /**
- * Allows to delete/upload files in messages
- * @return string
- */
- public function actionUploadTempFile()
- {
- if (!$this->isLogged()) {
- echo _t('_bx_messenger_not_logged');
- exit;
- }
- $CNF = &$this->_oConfig->CNF;
- switch ($_SERVER['REQUEST_METHOD']) {
- case 'DELETE':
- if ($sName = @file_get_contents("php://input"))
- parse_str($sName, $aName);
- if (!empty($aName) && @unlink(BX_DIRECTORY_PATH_TMP . basename($aName['name'])))
- echo 'OK';
- break;
- case 'POST':
- $oStorage = new BxMessengerStorage($CNF['OBJECT_STORAGE']);
- if (!$oStorage) {
- echo 0;
- exit;
- }
- $aFiles = array_filter($_FILES, function ($aFile, $sName) use ($CNF) {
- return stripos($sName, $CNF['FILES_UPLOADER']) !== FALSE;
- }, ARRAY_FILTER_USE_BOTH);
- $aUploader = current($aFiles);
- if (!empty($aUploader) && $oStorage->isValidFileExt($aUploader['name'])) {
- $sTempFile = $aUploader['tmp_name'];
- $sTargetFile = BX_DIRECTORY_PATH_TMP . basename($aUploader['name']);
- move_uploaded_file($sTempFile, $sTargetFile);
- echo 'OK';
- }
- }
- return '';
- }
- /**
- * Uploads recorded video file
- */
- public function actionUploadVideoFile()
- {
- $oStorage = new BxMessengerStorage($this->_oConfig->CNF['OBJECT_STORAGE']);
- if (!$oStorage || !isset($_POST['name']) || empty($_FILES)) {
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_send_message_no_video')));
- }
- if ($_FILES['file'] && $oStorage->isValidFileExt($_FILES['file']['name'])) {
- $sTempFile = $_FILES['file']['tmp_name'];
- $sTargetFile = BX_DIRECTORY_PATH_TMP . basename($_POST['name']);
- if (move_uploaded_file($sTempFile, $sTargetFile))
- return echoJson(array('code' => 0));
- }
- echoJson(array('code' => 1, 'message' => _t('_bx_messenger_send_message_no_video')));
- }
- /**
- * Checks is the file has valid extension to upload.
- */
- public function actionIsValidFile()
- {
- $oStorage = new BxMessengerStorage($this->_oConfig->CNF['OBJECT_STORAGE']);
- if (!$oStorage)
- return echoJson(array('code' => 1));
- $sFileName = bx_get('name');
- if ($sFileName && (int) $oStorage->isValidFileExt($sFileName)) {
- $sIconFile = $oStorage->getFontIconNameByFileName($sFileName);
- return echoJson(array('code' => 0, 'thumbnail' => $sIconFile ? $sIconFile : '', 'is_image' => (int) $oStorage->isImageExt($sFileName)));
- }
- echoJson(array('code' => 1));
- }
- /**
- * Allows to download files from the talk
- * @param $iFileId
- * @return string
- */
- public function actionDownloadFile($iFileId)
- {
- if (!$iFileId || !$this->_iProfileId)
- return '';
- $CNF = &$this->_oConfig->CNF;
- $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
- $aFile = $oStorage->getFile((int) $iFileId);
- if (empty($aFile)) {
- echo _t('_bx_messenger_post_file_not_found');
- exit;
- }
- if (isset($aFile[$CNF['FIELD_ST_JOT']])) {
- $iLotId = $this->_oDb->getLotByJotId($aFile[$CNF['FIELD_ST_JOT']], true);
- if (!$iLotId || !$this->_oDb->isParticipant($iLotId, $this->_iProfileId)) {
- echo _t('_bx_messenger_not_participant');
- exit;
- }
- }
- $sToken = $oStorage->genToken($iFileId);
- return $oStorage->download($aFile[$CNF['FIELD_ST_REMOTE']], $sToken);
- }
- /**
- * Allow to zoom image from talk's history
- * @param int $iStorageId file id
- * @param int $iWidth width of the window
- * @param int $iHeight height of the window
- * @return string html content
- */
- function actionGetBigImage($iStorageId, $iWidth, $iHeight)
- {
- if (!$iStorageId)
- return '';
- $iWidth = (int) $iWidth * 0.9;
- $iHeight = (int) $iHeight * 0.9;
- $oStorage = BxDolStorage::getObjectInstance($this->_oConfig->CNF['OBJECT_STORAGE']);
- $aFile = $oStorage->getFile((int) $iStorageId);
- $sFileUrl = $oStorage->getFileUrlById($iStorageId);
- if (!empty($aFile)) {
- $aInfo = @getimagesize($sFileUrl);
- if (empty($aInfo)) {
- echo MsgBox(_t('_bx_messenger_post_file_not_found'));
- exit;
- }
- if ($aInfo[0] <= $iWidth && $aInfo[1] <= $iHeight) {
- $iWidth = (int) $aInfo[0];
- $iHeight = (int) $aInfo[1];
- } else {
- $fXRatio = $aInfo[0] / $iWidth;
- $fYRatio = $aInfo[1] / $iHeight;
- if ($fXRatio > $fYRatio)
- $iHeight = 'auto';
- else
- $iWidth = 'auto';
- }
- }
- echo $this->_oTemplate->parseHtmlByName('big_image.html', array(
- 'height' => $iHeight,
- 'width' => $iWidth,
- 'url' => $oStorage->getFileUrlById((int) $iStorageId)
- ));
- exit;
- }
- /**
- * Allows to register Messenger's actions in Notifications module through the Alerts
- * @return array
- */
- public function serviceGetNotificationsData()
- {
- $sModule = $this->_aModule['name'];
- return [
- 'handlers' => [
- ['group' => $sModule, 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'got_jot_ntfs', 'module_name' => $sModule, 'module_method' => 'get_message_content', 'module_class' => 'Module'],
- ['group' => $sModule, 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'delete_jot_ntfs'],
- ['group' => "{$sModule}_mention", 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'got_mention_ntfs', 'module_name' => $sModule, 'module_method' => 'get_message_content', 'module_class' => 'Module'],
- ['group' => "{$sModule}_mention", 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'delete_mention_ntfs'],
- ['group' => "{$sModule}_broadcast", 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'got_broadcast_ntfs', 'module_name' => $sModule, 'module_method' => 'get_broadcast_content', 'module_class' => 'Module'],
- ['group' => "{$sModule}_broadcast", 'type' => 'delete', 'alert_unit' => $sModule, 'alert_action' => 'delete_broadcast_ntfs']
- ],
- 'settings' => [
- ['group' => $sModule, 'unit' => $sModule, 'action' => 'got_jot_ntfs', 'types' => ['personal']],
- ['group' => "{$sModule}_mention", 'unit' => $sModule, 'action' => 'got_mention_ntfs', 'types' => ['personal']],
- ['group' => "{$sModule}_broadcast", 'unit' => $sModule, 'action' => 'got_broadcast_ntfs', 'types' => ['personal']]
- ],
- 'alerts' => [
- ['unit' => $sModule, 'action' => 'got_jot_ntfs'],
- ['unit' => $sModule, 'action' => 'delete_jot_ntfs'],
- ['unit' => $sModule, 'action' => 'got_mention_ntfs'],
- ['unit' => $sModule, 'action' => 'delete_mention_ntfs'],
- ['unit' => $sModule, 'action' => 'got_broadcast_ntfs'],
- ['unit' => $sModule, 'action' => 'delete_broadcast_ntfs']
- ]
- ];
- }
- public function serviceGetBroadcastContent($aEvent)
- {
- $CNF = &$this->_oConfig->CNF;
- $aJotInfo = $this->_oDb->getJotById($aEvent['subobject_id']);
- $aLotInfo = $this->_oDb->getLotByJotId($aEvent['subobject_id'], false);
- if (empty($aJotInfo) || empty($aLotInfo))
- return array();
- $sEntryUrl = $this->_oConfig->getRepostUrl($aJotInfo[$CNF['FIELD_MESSAGE_ID']]);
- $iType = $aLotInfo[$CNF['FIELD_TYPE']];
- $sTitle = _t('_bx_messenger_broadcast_message_title');
- // replace br to spaces and truncate the line
- $sMessage = _t('_bx_messenger_broadcast_message_body');
- $sTruncatedMessage = '';
- if ($aJotInfo[$CNF['FIELD_MESSAGE']]) {
- $sTruncatedMessage = strmaxtextlen(preg_replace('/<br\W*?\/>|\n/', " ", $aJotInfo[$CNF['FIELD_MESSAGE']]), $CNF['PARAM_MAX_JOT_NTFS_MESSAGE_LENGTH']);
- $sMessage = _t('_bx_messenger_txt_sample_comment_single', $sTruncatedMessage);
- }
- $aResult = [
- 'entry_sample' => _t('_bx_messenger_message'),
- 'entry_url' => $sEntryUrl,
- 'entry_caption' => $sTitle,
- 'entry_author' => $aEvent['object_owner_id'],
- 'subentry_sample' => $sMessage,
- 'lang_key' => '_bx_messenger_txt_subobject_added_broadcast'
- ];
- $sSubject = _t("_bx_messenger_notification_subject_broadcast", BxDolProfile::getInstanceMagic($aEvent['owner_id'])->getDisplayName());
- $sAlterBody = $sTruncatedMessage ?: _t('_bx_messenger_txt_sample_email_push', html2txt($sMessage));
- $aResult['lang_key'] = [
- 'site' => $aResult['lang_key'],
- 'email' => $sAlterBody,
- 'push' => $sAlterBody
- ];
- $aResult['settings'] = [
- 'email' => [
- 'subject' => $sSubject
- ],
- 'push' => [
- 'subject' => $sSubject
- ]
- ];
- bx_alert(
- $this->_oConfig->getObject('alert'),
- 'before_broadcast_notification',
- $aEvent['subobject_id'],
- $aEvent['object_owner_id'],
- ['data' => &$aResult, 'talk' => $aLotInfo, 'message' => $aJotInfo]
- );
- return $aResult;
- }
- /**
- * Jot info for Notifications module
- * @param array Input alert params
- * @return array with info for notifications
- */
- public function serviceGetMessageContent($aEvent)
- {
- $CNF = &$this->_oConfig->CNF;
- $aJotInfo = $this->_oDb->getJotById($aEvent['subobject_id']);
- $aLotInfo = $this->_oDb->getLotByJotId($aEvent['subobject_id'], false);
- if (empty($aJotInfo) || empty($aLotInfo))
- return array();
- $sType = BX_MSG_NTFS_MESSAGE;
- if ($aEvent['action'] === 'got_mention_ntfs')
- $sType = BX_MSG_NTFS_MENTION;
- $sEntryUrl = $this->_oConfig->getRepostUrl($aJotInfo[$CNF['FIELD_MESSAGE_ID']]);
- $sEntryUrlApi = $this->_oConfig->getRepostUrlApi($aLotInfo[$CNF['FIELD_HASH']]);
- $iType = $aLotInfo[$CNF['FIELD_TYPE']];
- $sTitle = isset($aLotInfo[$CNF['FIELD_TITLE']]) && $aLotInfo[$CNF['FIELD_TITLE']] ?
- $aLotInfo[$CNF['FIELD_TITLE']] : _t('_bx_messenger_lots_private_lot');
- if ($this->_oDb->isLinkedTitle($iType)) {
- $sTitle = $this->_oDb->isLinkedTitle($iType) ? _t('_bx_messenger_linked_title', $sTitle) : _t($sTitle);
- $sEntryUrl = $this->_oConfig->getPageLink($aLotInfo[$CNF['FIELD_URL']]);
- }
- $bAttachmentFiles = $this->_oConfig->isAttachmentType($aJotInfo, BX_ATT_TYPE_FILES);
- $bAttachmentGiphy = $this->_oConfig->isAttachmentType($aJotInfo, BX_ATT_TYPE_GIPHY);
- $bAttachmentReply = $this->_oConfig->isAttachmentType($aJotInfo, BX_ATT_TYPE_REPLY);
- $bAttachmentRepost = $this->_oConfig->isAttachmentType($aJotInfo, BX_ATT_TYPE_REPOST);
- $sTruncatedMessage = $sMessage = '';
- // replace br to spaces and truncate the line
- if ($aJotInfo[$CNF['FIELD_MESSAGE']] && !$bAttachmentRepost) {
- $sTruncatedMessage = strmaxtextlen(preg_replace('/<br\W*?\/>|\n/', " ", $aJotInfo[$CNF['FIELD_MESSAGE']]), $CNF['PARAM_MAX_JOT_NTFS_MESSAGE_LENGTH']);
- $sMessage = _t('_bx_messenger_txt_sample_comment_single', $sTruncatedMessage);
- }
- if ($bAttachmentFiles)
- $sMessage = _t('_bx_messenger_txt_sample_comment_file_single', $this->_oDb->getJotFiles($aJotInfo[$CNF['FIELD_MESSAGE_ID']], true));
- elseif ($bAttachmentGiphy)
- $sMessage = _t('_bx_messenger_txt_sample_comment_giphy_single');
- elseif ($bAttachmentReply)
- $sMessage = _t('_bx_messenger_txt_sample_comment_reply_single');
- elseif ($bAttachmentRepost)
- $sMessage = _t('_bx_messenger_txt_sample_comment_repost_single');
- $aResult = array(
- 'entry_sample' => _t('_bx_messenger_message'),
- 'entry_url' => $sEntryUrl,
- 'entry_url_api' => $sEntryUrlApi,
- 'entry_caption' => $sTitle,
- 'entry_author' => $aEvent['object_owner_id'],
- 'subentry_sample' => $sMessage,
- 'lang_key' => $bAttachmentFiles || $bAttachmentGiphy
- ? '_bx_messenger_txt_subobject_added_single' : "_bx_messenger_txt_subobject_added_{$sType}"
- );
- $sSubject = _t("_bx_messenger_notification_subject_{$sType}", BxDolProfile::getInstanceMagic($aEvent['owner_id'])->getDisplayName());
- $sAlterBody = $sTruncatedMessage ? $sTruncatedMessage : _t('_bx_messenger_txt_sample_email_push', html2txt($sMessage));
- $aResult['lang_key'] = array(
- 'site' => $aResult['lang_key'],
- 'email' => $sAlterBody,
- 'push' => $sAlterBody
- );
- $aResult['settings'] = array(
- 'email' => array(
- 'subject' => $sSubject
- ),
- 'push' => array(
- 'subject' => $sSubject
- )
- );
- bx_alert(
- $this->_oConfig->getObject('alert'),
- 'before_message_notification',
- $aEvent['subobject_id'],
- $aEvent['object_owner_id'],
- ['data' => &$aResult, 'talk' => $aLotInfo, 'message' => $aJotInfo]
- );
- return $aResult;
- }
- /**
- * Check if the user can read Lot messages
- * @param array $aDataEntry contains Lot details
- * @param boolean $isPerformAction used for compatibility with parent method
- * @param bool $iProfileId profile id of the member show has to get notification
- * @return int
- */
- public function serviceCheckAllowedViewForProfile($aDataEntry, $isPerformAction = false, $iProfileId = false)
- {
- if (!$iProfileId)
- $iProfileId = $this->_iProfileId;
- $mixedResult = null;
- bx_alert(
- 'system',
- 'check_allowed_view',
- 0,
- 0,
- array(
- 'module' => $this->getName(),
- 'content_info' => $aDataEntry,
- 'profile_id' => $iProfileId,
- 'override_result' => &$mixedResult
- )
- );
- if ($mixedResult !== null)
- return $mixedResult;
- $CNF = &$this->_oConfig->CNF;
- if (empty($aDataEntry))
- return CHECK_ACTION_RESULT_ALLOWED;
- return $this->_oDb->isParticipant($aDataEntry[$CNF['FIELD_ID']], $iProfileId, true) === TRUE
- || $aDataEntry[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PUBLIC
- || $aDataEntry[$CNF['FIELD_TYPE']] == BX_IM_TYPE_SETS ? CHECK_ACTION_RESULT_ALLOWED : CHECK_ACTION_RESULT_NOT_ALLOWED;
- }
- /**
- * Execute the list of actions which are required when message is sent
- * @param $iJotId
- * @return false
- */
- public function onSendJot($iJotId)
- {
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- /**
- * @hooks
- * @hookdef hook-bx_messenger-send_jot 'bx_messenger', 'send_jot' - hook after a jot (message) was sent
- * - $unit_name - equals `bx_messenger`
- * - $action - equals `send_jot`
- * - $object_id - jot (message) id
- * - $sender_id - jot (message) author profile id
- * - $extra_params - array of additional params with the following array keys:
- * - `jot_info` - [array] jot (message) info array as key&value pairs
- * @hook @ref hook-bx_messenger-send_jot
- */
- bx_alert($this->_oConfig->getObject('alert'), 'send_jot', $iJotId, $this->_iProfileId, [
- 'jot_info' => $aJotInfo
- ]);
- $CNF = &$this->_oConfig->CNF;
- $aConvoInfo = $this->_oDb->getLotByJotId($iJotId, false);
- $iLotId = $aConvoInfo[$CNF['FIELD_ID']];
- if (!$iLotId)
- return false;
- $aPartList = $this->_oDb->getParticipantsList($iLotId, true, $this->_iProfileId);
- if ((int) $aConvoInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_BROADCAST) {
- $iJotCount = $this->_oDb->getJotsNumber($iLotId, 0);
- if ($iJotCount >= 2)
- $aPartList = $this->_oDb->getBroadcastParticipants($iLotId);
- else
- return false;
- }
- if (empty($aPartList))
- return false;
- foreach ($aPartList as &$iPart)
- /**
- * @hooks
- * @hookdef hook-bx_messenger-got_jot 'bx_messenger', 'got_jot' - hook after a lot (conversation) got a new jot (message)
- * - $unit_name - equals `bx_messenger`
- * - $action - equals `got_jot`
- * - $object_id - lot (conversation) id
- * - $sender_id - jot (message) author profile id
- * - $extra_params - array of additional params with the following array keys:
- * - `recipient_id` - [int] recipient profile id
- * - `subobject_id` - [int] jot (message) id
- * - `subobject_info` - [array] jot (message) info array as key&value pairs
- * @hook @ref hook-bx_messenger-got_jot
- */
- bx_alert($this->_oConfig->getObject('alert'), 'got_jot', $iLotId, $this->_iProfileId, [
- 'recipient_id' => $iPart,
- 'subobject_id' => $iJotId,
- 'subobject_info' => $aJotInfo
- ]);
- if (!$this->_oDb->getIntervalJotsCount($iLotId, $iJotId))
- $this->sendMessageNotification($iLotId, $iJotId);
- }
- public function onDeleteJot($aJotInfo)
- {
- if (empty($aJotInfo))
- return false;
- $CNF = &$this->_oConfig->CNF;
- $iLotId = $aJotInfo[$CNF['FIELD_MESSAGE_FK']];
- $iJotId = $aJotInfo[$CNF['FIELD_MESSAGE_ID']];
- $iProfileId = $aJotInfo[$CNF['FIELD_MESSAGE_AUTHOR']];
- $sModule = $this->_oConfig->getObject('alert');
- bx_alert($sModule, 'delete_jot', $iJotId, $this->_iProfileId, ['author_id' => $iProfileId, 'lot_id' => $iLotId]);
- bx_alert($sModule, 'delete_jot_ntfs', $iLotId, $iProfileId, ['subobject_id' => $iJotId]);
- bx_alert($sModule, 'delete_mention_ntfs', $iLotId, $iProfileId, ['subobject_id' => $iJotId]);
- $this->_oDb->removeNotifications($iJotId);
- }
- public function onReactJot($iLotId, $iJotId, $iAuthor, $sAction = 'add')
- {
- bx_alert($this->_oConfig->getObject('alert'), "reaction_" . $sAction, $iJotId, $this->_iProfileId, array('author_id' => $iAuthor, 'lot_id' => $iLotId));
- }
- public function onUpdateJot($iLotId, $iJotId, $iProfileId = 0)
- {
- bx_alert($this->_oConfig->getObject('alert'), 'update_jot', $iJotId, $this->_iUserId, array('author_id' => $iProfileId, 'lot_id' => $iLotId));
- }
- public function onCreateLot($iLotId)
- {
- bx_alert($this->_oConfig->getObject('alert'), 'create_lot', $iLotId, $this->_iProfileId, $this->_oDb->getLotInfoById($iLotId));
- }
- public function onDeleteLot($aData)
- {
- if (empty($aData))
- return false;
- $CNF = &$this->_oConfig->CNF;
- $iAuthorId = $aData[$CNF['FIELD_AUTHOR']];
- $iLotId = $aData[$CNF['FIELD_ID']];
- bx_alert($this->_oConfig->getObject('alert'), 'delete_lot', $iLotId, $this->_iProfileId, ['author_id' => $iAuthorId]);
- }
- public function onAddNewParticipant($iLotId, $iParticipant, $iProfileId = 0)
- {
- bx_alert($this->_oConfig->getObject('alert'), 'add_part', $iParticipant, $this->_iUserId, array('lot_id' => $iLotId, 'author_id' => $iProfileId));
- }
- public function onRemoveParticipant($iLotId, $iParticipant, $iProfileId = 0)
- {
- bx_alert($this->_oConfig->getObject('alert'), 'remove_part', $iParticipant, $this->_iUserId, array('lot_id' => $iLotId, 'author_id' => $iProfileId));
- }
- /**
- * Checks if logged member can contact with the person
- * @param $iSender
- * @param $iRecipient
- * @return bool|mixed|true
- */
- public function onCheckContact($iSender, $iRecipient)
- {
- $CNF = &$this->_oConfig->CNF;
- $oSenderProfile = BxDolProfile::getInstance($iSender);
- $oRecipientProfile = BxDolProfile::getInstance($iRecipient);
- if ($CNF['CONTACT-JOIN-ORGANIZATION'] && $oSenderProfile && $oRecipientProfile) {
- $aSenderProfileInfo = $oSenderProfile->getInfo();
- $aRecipientProfileInfo = $oRecipientProfile->getInfo();
- if ($aSenderProfileInfo['type'] === 'bx_organizations' || $aRecipientProfileInfo['type'] === 'bx_organizations') {
- if (BxDolConnection::getObjectInstance("bx_organizations_fans")->isConnected($iSender, $iRecipient, true) || $aSenderProfileInfo['type'] === 'bx_organizations')
- return true;
- return BxDolConnection::getObjectInstance("sys_profiles_subscriptions")->isConnected($iSender, $iRecipient);
- }
- }
- if ($CNF['DISABLE-PROFILE-PRIVACY'])
- return true;
- if (method_exists('BxDolProfile', 'checkAllowedProfileContact')) {
- $mixedResult = BxDolProfile::getInstance($iSender)->checkAllowedProfileContact($iRecipient);
- if ($mixedResult !== CHECK_ACTION_RESULT_ALLOWED)
- return false;
- }
- $bCanContact = true;
- bx_alert($this->_oConfig->getObject('alert'), 'check_contact', 0, false, array('can_contact' => &$bCanContact, 'sender' => $iSender, 'recipient' => $iRecipient, 'where' => $this->_oConfig->getName()));
- return $bCanContact;
- }
- /**
- * Check if the selected profile or any groups module's item is available to send messages for logged member
- * @param $mixedObject integer Profile id
- * @return bool|int|mixed|true
- */
- public function serviceIsContactAllowed($mixedObject)
- {
- if (!$this->_iProfileId)
- return false;
- $oProfile = BxDolProfile::getInstance($mixedObject);
- $sModule = $oProfile->getModule();
- if (BxDolRequest::serviceExists($sModule, 'act_as_profile') && BxDolService::call($sModule, 'act_as_profile'))
- return $this->onCheckContact($this->_iProfileId, (int) $mixedObject);
- if (BxDolRequest::serviceExists($sModule, 'is_group_profile') && BxDolService::call($sModule, 'is_group_profile')) {
- $aOwnerInfo = BxDolService::call($sModule, 'get_info', array($oProfile->getContentId(), false));
- if (empty($aOwnerInfo) || !is_array($aOwnerInfo))
- return CHECK_ACTION_RESULT_ALLOWED;
- return BxDolService::call($sModule, 'check_allowed_view_for_profile', array($aOwnerInfo)) === CHECK_ACTION_RESULT_ALLOWED;
- }
- return true;
- }
- /**
- * Checks if video conference is available for member
- * @param $mixedObject integer profile id
- * @return bool
- */
- public function serviceIsVideoConferenceAllowed($mixedObject)
- {
- if (!$this->_iProfileId || !$this->onCheckContact($this->_iProfileId, (int) $mixedObject))
- return false;
- $CNF = &$this->_oConfig->CNF;
- if (isset($_SERVER['REQUEST_URI'])) {
- $sRoom = $this->_oConfig->getRoomId($_SERVER['REQUEST_URI']);
- $aRoom = $this->_oDb->getPublicVideoRoom($sRoom);
- $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_IM_VC, $this->_iProfileId);
- if ((empty($aRoom) || !(int) $aRoom[$CNF['FPJVC_STATUS']]) && $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_IM_VC, $this->_iProfileId) !== true)
- return false;
- if (!empty($aRoom) && (int) $aRoom[$CNF['FPJVC_STATUS']] && (int) $mixedObject !== $this->_iProfileId && $this->_oConfig->isAllowedAction(BX_MSG_ACTION_JOIN_IM_VC, $this->_iProfileId) !== true)
- return false;
- } else
- return false;
- $this->_oTemplate->addCss(array('video-conference.css'));
- $this->_oTemplate->addJs('utils.js');
- return true;
- }
- /**
- * Sends immediate push notifications when Profile conference has been started
- * @param $iObjectId
- * @param $iSenderId
- * @param $iReceiverId
- * @param string $sType
- * @return false
- */
- private function sendProfilePush($iObjectId, $iSenderId, $iReceiverId, $sType = 'bx_persons')
- {
- $oLanguage = BxDolStudioLanguagesUtils::getInstance();
- $sLanguage = $oLanguage->getCurrentLangName(false);
- $oObject = BxDolProfile::getInstance($iObjectId);
- if (!$oObject)
- return false;
- $oReceiver = BxDolProfile::getInstance($iReceiverId);
- if (!$oReceiver)
- return false;
- $oSender = BxDolProfile::getInstance($iSenderId);
- if (!$oSender)
- return false;
- $sMessage = _t("_bx_messenger_public_vc_{$sType}_message", $sType === 'bx_persons' ? $oSender->getDisplayName() : $oObject->getDisplayName());
- $aContent = array(
- 'en' => $sMessage,
- );
- if (!isset($aContent[$sLanguage]))
- $aContent[$sLanguage] = $sMessage;
- $aHeadings = array($sLanguage => _t("_bx_messenger_push_vc_{$sType}_message_title"));
- $aInfo = array(
- 'contents' => $aContent,
- 'headings' => $aHeadings,
- 'url' => $oObject->getUrl()
- );
- BxDolPush::getObjectInstance()->send(
- $iReceiverId,
- array_merge($aInfo, array(
- 'icon' => $sType === 'bx_persons' ?
- $oSender->getThumb() :
- $oObject->getThumb()
- )),
- true
- );
- }
- public function actionGetVideoConferenceForm($iProfileId)
- {
- $oProfile = BxDolProfile::getInstance($iProfileId);
- header('Content-type: text/html; charset=utf-8');
- $sContent = '';
- if (!$oProfile)
- $sContent = MsgBox(_t('_bx_messenger_profile_not_found'));
- else {
- $aInfo = $oProfile->getInfo();
- if ($aInfo['type'] == 'bx_organizations') {
- $aFans = BxDolConnection::getObjectInstance("{$aInfo['type']}_fans")->getConnectedContent($iProfileId, true);
- if (!empty($aFans)) {
- foreach ($aFans as &$iPart)
- $this->sendProfilePush($iProfileId, $this->_iProfileId, $iPart, $aInfo['type']);
- }
- } else if ($this->_iProfileId != $iProfileId)
- $this->sendProfilePush($iProfileId, $this->_iProfileId, $iProfileId, $aInfo['type']);
- $CNF = &$this->_oConfig->CNF;
- $sIdent = $this->getReferrerPageIdent();
- $sRoom = $this->_oConfig->getRoomId($sIdent);
- $aRoom = $this->_oDb->getPublicVideoRoom($sRoom);
- if (empty($aRoom) || !(int) $aRoom[$CNF['FPJVC_STATUS']]) {
- $mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_IM_VC, $this->_iProfileId);
- if ($mixedResult !== true)
- $sContent = $mixedResult;
- } else
- if (!empty($aRoom) && (int) $aRoom[$CNF['FPJVC_STATUS']] && (int) $iProfileId !== $this->_iProfileId) {
- $mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_JOIN_IM_VC, $this->_iProfileId);
- if ($mixedResult !== true)
- $sContent = $mixedResult;
- }
- }
- echo $sContent ? $sContent : $this->_oTemplate->getPublicJitsi($this->_iProfileId, $sIdent, $oProfile->getDisplayName(), 'bx-messenger-vc-call');
- exit;
- }
- private function getReferrerPageIdent()
- {
- $sPath = '';
- if (isset($_SERVER['HTTP_REFERER'])) {
- $aPath = parse_url($_SERVER['HTTP_REFERER']);
- if (isset($aPath['path']))
- $sPath = $aPath['path'];
- if (isset($aPath['query']))
- $sPath .= '?' . $aPath['query'];
- }
- return $sPath;
- }
- public function actionUpdatePublicJitsiVideoConference()
- {
- $sRoom = bx_get('room');
- $sAction = bx_get('action');
- if (!$sRoom || !$this->_iProfileId || !$sAction)
- return false;
- if ($sAction == BX_JOT_PUBLIC_JITSI_JOIN)
- return $this->_oDb->createPublicVideoRoom($sRoom, $this->_iProfileId);
- return $this->_oDb->updatePublicVideoRoom($sRoom, $this->_iProfileId, $sAction);
- }
- public function serviceGetLiveUpdates($aMenuItemParent, $aMenuItemChild, $iCount = 0)
- {
- $iCountNew = $this->serviceGetUpdatedLotsNum();
- if ($iCountNew == $iCount)
- return false;
- return array(
- 'count' => $iCountNew,
- 'method' => 'bx_menu_show_live_update(oData)',
- 'data' => array(
- 'code' => BxDolTemplate::getInstance()->parseHtmlByTemplateName('menu_item_addon', array(
- 'content' => '{count}'
- )),
- 'mi_parent' => $aMenuItemParent,
- 'mi_child' => $aMenuItemChild
- ),
- );
- }
- public function serviceGetLiveVcUpdates($iCount = 0)
- {
- $iCount = 0;
- if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
- $sPageUrl = $this->getReferrerPageIdent();
- /* ADD ABILITY TO call members when they on any page of the site and have incoming call */
- if (preg_match('/.*page\/(.*)\?id=(\d+).*/', $sPageUrl, $aParams)) {
- if (!empty($aParams) && isset($aParams[1]) && isset($aParams[2])) {
- $iPageOwner = $this->_oDb->findThePageOwner(array('i' => $aParams[1], 'id' => $aParams[2]));
- //if ($this->_iProfileId == $iPageOwner)
- }
- }
- $aParticipants = $this->_oDb->getPublicRoomParticipants($this->_oConfig->getRoomId($sPageUrl));
- $iCount = count($aParticipants);
- }
- return array(
- 'count' => $iCount,
- 'method' => 'oMUtils.addBubble(oData)',
- 'data' => array(
- 'code' => BxDolTemplate::getInstance()->parseHtmlByTemplateName('menu_item_addon', array(
- 'content' => '{count}'
- )),
- 'selector' => '.bx-menu-item-public-vc-messenger a.bx-btn'
- ),
- );
- }
- /**
- * @param int $iObjectId item's id
- * @param strign $sType name of te module
- * @param int $iProfileId comments' author, if this param is empty, then get all comments
- * @param int $iStart get comments from position
- * @param int $iPerPage number of the comments to get at once
- * @return array comments list
- */
- public function serviceGetLiveComments($iObjectId, $sType, $iProfileId = 0, $iStart = 0, $iPerPage = 0)
- {
- $aComments = $this->_oDb->getLiveComments($iObjectId, $sType, $iProfileId, $iStart, $iPerPage);
- if (!(int) $aComments['total'])
- return array(
- 'items' => array(),
- 'id' => $iObjectId,
- 'type' => $sType,
- 'total' => 0
- );
- $aResult = array();
- foreach ($aComments['result'] as $iKey => $aValue) {
- $oProfile = $this->_oTemplate->getObjectUser($aValue[$this->_oConfig->CNF['FIELD_LCMTS_AUTHOR']]);
- $aResult[$aValue[$this->_oConfig->CNF['FIELD_LCMTS_ID']]] = array(
- 'text' => $aValue[$this->_oConfig->CNF['FIELD_LCMTS_TEXT']],
- 'author' => array(
- 'id' => $aValue[$this->_oConfig->CNF['FIELD_LCMTS_AUTHOR']],
- 'name' => $oProfile->getDisplayName(),
- 'icon' => $oProfile->getAvatar(),
- 'url' => $oProfile->getUrl()
- ),
- 'id' => $aValue[$this->_oConfig->CNF['FIELD_LCMTS_ID']],
- 'date' => $aValue[$this->_oConfig->CNF['FIELD_LCMTS_DATE']],
- );
- }
- return array('items' => $aResult, 'id' => $iObjectId, 'type' => $sType, 'total' => (int) $aComments['total']);
- }
- /**
- * @param string $sText text of the comment
- * @param int $iObjectId item's id
- * @param string $sType $sType name of te module
- * @param int $iProfileId comment's author
- * @param int $iDate client's time when message is sent
- * @return int added object's id
- */
- public function servicePostLiveComments($sText, $iObjectId, $sType, $iProfileId, $iDate = 0)
- {
- if (!$sText || !$iObjectId || !$sType || !$iProfileId)
- return 0;
- $aResult = array('code' => 1);
- if ($iId = $this->_oDb->addLiveComment($sText, $iObjectId, $sType, $iProfileId, $iDate))
- $aResult = array('code' => 0, 'id' => $iId, 'date' => $iDate ? $iDate : time());
- return $aResult;
- }
- public function serviceRemoveLiveComment($iObjectId, $iProfileId)
- {
- if (!$iObjectId || !$iProfileId)
- return false;
- $aResult = array('code' => 0, 'id' => $iObjectId);
- return $this->_oDb->removeLiveComment($iObjectId, $iProfileId) ? $aResult : array('code' => 1);
- }
- public function actionGetFilesList($iLotId)
- {
- if (!$iLotId || !$this->_iProfileId || !$this->_oDb->isParticipant($iLotId, $this->_iProfileId))
- return false;
- $aFiles = $this->_oDb->getLotFiles($iLotId);
- if (empty($aFiles))
- return array();
- $aResult = array();
- $CNF = &$this->_oConfig->CNF;
- foreach ($aFiles as $iKey => $aValue)
- $aResult[$aValue[$CNF['FIELD_ST_ID']]] = $this->_oTemplate->getFileContent($aValue);
- return $aResult;
- }
- public function actionGetLotTabs($iLotId, $sAction)
- {
- if (!$iLotId || !$this->_iUserId || !$this->_oDb->isParticipant($iLotId, $this->_iUserId))
- return echoJson(array('code' => 1, 'msg' => _t('_bx_messenger_no_permissions')));
- $sHTML = '';
- switch ($sAction) {
- case 'files':
- $aFiles = $this->actionGetFilesList($iLotId);
- if (empty($aFiles))
- $sHTML = MsgBox(_t('_bx_messenger_txt_msg_no_results'));
- else
- $sHTML = $this->_oTemplate->parseHtmlByName('files-feeds.html', array('bx_repeat:files' => $aFiles));
- break;
- }
- header('Content-type: text/html; charset=utf-8');
- echo $sHTML;
- exit;
- }
- /************ REACT Jot Integration *************************************/
- public function serviceGetLotsList($iProfileId)
- {
- if (!$iProfileId)
- return '';
- $aLots = $this->_oDb->getMyLots($iProfileId);
- if (empty($aLots))
- return array();
- $aLotsList = array();
- foreach ($aLots as &$aLot) {
- $aParticipantsList = $this->_oDb->getParticipantsList($aLot[$this->_oConfig->CNF['FIELD_ID']], true, $iProfileId);
- $iParticipantsCount = count($aParticipantsList);
- $aParticipantsList = $iParticipantsCount ? array_slice($aParticipantsList, 0, $this->_oConfig->CNF['PARAM_ICONS_NUMBER']) : array($iProfileId);
- $aNickNames = array();
- foreach ($aParticipantsList as $iParticipant) {
- $oProfile = $this->_oTemplate->getObjectUser($iParticipant);
- if ($oProfile) {
- $aNickNames[] = array(
- 'name' => $oProfile->getDisplayName(),
- 'url' => $oProfile->getUrl(),
- 'thumb' => $oProfile->getThumb()
- );
- }
- }
- if (!empty($aLot[$this->_oConfig->CNF['FIELD_TITLE']]))
- $sTitle = _t($aLot[$this->_oConfig->CNF['FIELD_TITLE']]);
- else {
- $aTitle = array();
- $aTmpNickNames = $iParticipantsCount > 3 ? array_slice($aNickNames, 0, $this->_oConfig->CNF['PARAM_ICONS_NUMBER']) : $aNickNames;
- foreach ($aTmpNickNames as &$aValue)
- $aTitle[] = $aValue['name'];
- $sTitle = implode(', ', $aTitle);
- }
- $sStatus = '';
- if ($iParticipantsCount == 1 && $oProfile && empty($aLot[$this->_oConfig->CNF['FIELD_TITLE']]))
- $sStatus = (int) (method_exists($oProfile, 'isOnline') ? $oProfile->isOnline() : false);
- else
- $sStatus = $iParticipantsCount;
- $aLatestJots = $this->_oDb->getLatestJot($aLot[$this->_oConfig->CNF['FIELD_ID']]);
- $iTime = $aLot[$this->_oConfig->CNF['FIELD_ADDED']];
- $oSender = $sSender = $sMessage = '';
- if (!empty($aLatestJots)) {
- if (isset($aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE']])) {
- $sMessage = $aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE']];
- if ($aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE_AT_TYPE']] == BX_ATT_TYPE_REPOST) {
- $sMessage = $this->_oConfig->cleanRepostLinks($sMessage, $aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE_AT']]);
- $sMessage = $sMessage ? $sMessage : _t('_bx_messenger_repost_message');
- }
- $sMessage = BxTemplFunctions::getInstance()->getStringWithLimitedLength($sMessage, $this->_oConfig->CNF['MAX_PREV_JOTS_SYMBOLS']);
- }
- if (!$sMessage && $aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE_AT_TYPE']] == BX_ATT_TYPE_FILES)
- $sMessage = _t('_bx_messenger_attached_files_message', $this->_oDb->getJotFiles($aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE_ID']], true));
- $sSender = '';
- if ($oSender = $this->_oTemplate->getObjectUser($aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE_AUTHOR']]))
- $sSender = $oSender->id() == $iProfileId ? _t('_bx_messenger_you_username_title') : $oSender->getDisplayName();
- $iTime = $aLatestJots[$this->_oConfig->CNF['FIELD_MESSAGE_ADDED']];
- }
- $aLotsList[] = array(
- 'participants_count' => $iParticipantsCount,
- 'participants_list' => $aNickNames,
- 'title' => $sTitle,
- 'lot_id' => $aLot[$this->_oConfig->CNF['FIELD_ID']],
- 'status' => $sStatus,
- 'latest_jot_message' => $sMessage,
- 'latest_jot_message_author' => $sSender,
- 'latest_jot_message_date' => $iTime,
- 'latest_jot_message_author_thumb' => $oSender ? $oSender->getThumb() : '',
- );
- }
- return $aLotsList;
- }
- public function servicePerformConnAction($iInitiator, $iContent, $sAction = 'add', $sConnectionType = 'follow')
- {
- require_once(BX_DIRECTORY_PATH_INC . "design.inc.php");
- if (!$iInitiator || !$iContent)
- return array();
- $oConnections = BxDolConnection::getObjectInstance($sConnectionType === 'follow' ? 'sys_profiles_subscriptions' : 'sys_profiles_friends');
- $sMethod = "{$sAction}Connection";
- if (empty($oConnections) || !method_exists($oConnections, $sMethod))
- return array();
- return array(
- 'result' => (int) $oConnections->$sMethod($iInitiator, $iContent),
- 'content_id' => (int) $iContent,
- 'action' => $sAction
- );
- }
- public function serviceProfileConnections($sType = 'friends', $iContentId = 0, $iStart = 0, $iPerPage = 10, $iMutual = false)
- {
- $iProfileId = $iContentId ? $iContentId : $this->_iUserId;
- if (!$iProfileId)
- return array();
- $aMembers = array();
- $oFriends = BxDolConnection::getObjectInstance('sys_profiles_friends');
- $oFollowers = BxDolConnection::getObjectInstance('sys_profiles_subscriptions');
- switch ($sType) {
- case 'friends':
- if (!$oFriends)
- return array();
- $aMembers = $oFriends->getConnectedContent($iProfileId, $iMutual, $iStart, $iPerPage);
- break;
- case 'connections':
- if (!$oFollowers)
- return array();
- $aMembers = $oFollowers->getConnectedContent($iProfileId, $iMutual, $iStart, $iPerPage);
- break;
- case 'recent':
- case 'active':
- case 'online':
- case 'recommended':
- case 'top':
- if (BxDolRequest::serviceExists('bx_persons', 'get_members')) {
- $aPersons = BxDolService::call('bx_persons', 'get_members', array($sType, $iStart, $iPerPage));
- foreach ($aPersons as &$aPerson)
- $aMembers[$aPerson['author']] = $aPerson;
- }
- break;
- }
- if (empty($aMembers))
- return $aMembers;
- $aRet = array();
- foreach ($aMembers as $iId => $aInfo) {
- if (($oProfile = BxDolProfile::getInstance($iId))) {
- $oAccount = $oProfile->getAccountObject();
- $aRet[$iId] = array(
- 'name' => $oProfile->getDisplayName(),
- 'profile_display_name' => $oProfile->getDisplayName(),
- 'email' => $oAccount->getEmail(),
- 'id' => $iId,
- 'url' => $oProfile->getUrl(),
- 'info' => $oProfile->getInfo(),
- 'thumb' => $oProfile->getThumb(),
- 'picture' => $oProfile->getPicture(),
- 'avatar' => $oProfile->getAvatar(),
- 'is_online' => $oProfile->isOnline(),
- 'cover' => $oProfile->getUnitCover(),
- 'status' => $oProfile->getStatus(),
- 'followers' => (int) $oFollowers->getConnectedInitiatorsCount($iId),
- 'friends' => (int) $oFriends->getConnectedContentCount($iId, true),
- 'is_friend' => (int) $oFriends->isConnected($iProfileId, $iId, true),
- 'is_follow' => (int) $oFollowers->isConnected($iProfileId, $iId)
- );
- }
- }
- return $aRet;
- }
- public function serviceGetModulesList()
- {
- $aResult = array();
- if (!$this->isLogged())
- return $aResult;
- $aModules = $this->_oDb->getAllCmtsModule();
- foreach ($aModules as $sKey => $aModule) {
- if (!$aModule['icon']) {
- $aResult[$sKey] = array(
- 'icon' => 'world',
- 'icon_color' => 'green'
- );
- continue;
- }
- preg_match('/([a-z]+)(?:-[a-z]+)?\s+col-([a-z]+)/', $aModule['icon'], $aMatches);
- $aResult[$sKey] = array(
- 'icon' => $aMatches[1],
- 'icon_color' => $aMatches[2]
- );
- }
- return $aResult;
- }
- public function serviceSwitchProfile($iSwitchToProfileId)
- {
- $aResult = array('code' => 1);
- if ($iSwitchToProfileId) {
- $oProfile = BxDolProfile::getInstance($iSwitchToProfileId);
- if ($oProfile && BxDolService::call($oProfile->getModule(), 'act_as_profile')) {
- $iViewerAccountId = getLoggedId();
- $iSwitchToAccountId = $oProfile->getAccountId();
- $bCanSwitch = $iSwitchToAccountId == $iViewerAccountId;
- bx_alert('account', 'check_switch_context', $iSwitchToAccountId, bx_get_logged_profile_id(), array('switch_to_profile' => $iSwitchToProfileId, 'viewer_account' => $iViewerAccountId, 'override_result' => &$bCanSwitch));
- if ($bCanSwitch) {
- $oAccount = BxDolAccount::getInstance();
- if ($oAccount->updateProfileContext($iSwitchToProfileId))
- $aResult = array('code' => 0, 'msg' => _t('_sys_txt_account_profile_context_changed_success', $oProfile->getDisplayName()));
- }
- }
- }
- return $aResult;
- }
- public function serviceGetLotInfo($iProfileId, $iLotId, $iJotsLimit = 0, $iStart = BX_IM_EMPTY, $sType = 'new')
- {
- $aResult = array('code' => 1);
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- if (!$iLotId || empty($aLotInfo))
- return $aResult;
- if ($iProfileId !== $this->_iUserId || !$this->_oDb->isParticipant($iLotId, $this->_iUserId))
- return array('code' => 1, _t('_bx_messenger_not_participant'));
- $CNF = $this->_oConfig->CNF;
- $iJotsLimit = $iJotsLimit ?: $CNF['MAX_JOTS_LOAD_HISTORY'];
- $aJotsList = $this->_oDb->getJotsByLotId(['lot' => $iLotId, 'start' => $iStart, 'mode' => $sType, 'limit' => $iJotsLimit]);
- $aJots = array();
- foreach ($aJotsList as &$aJot) {
- $aAuthor = BxDolProfile::getInstance($aJot[$CNF['FIELD_MESSAGE_AUTHOR']]);
- $aAttachments = $this->_oTemplate->getAttachment($aJot);
- $aJots[] = array_merge($aJot, array(
- 'thumb' => $aAuthor->getThumb(),
- 'name' => $aAuthor->getDisplayName(),
- 'files' => $aAttachments[BX_ATT_GROUPS_ATTACH] ?? ''
- ));
- }
- return array('lot_id' => $iLotId, 'jots' => $aJots);
- }
- public function prepareMessageToDb($sMessage)
- {
- if (!$sMessage)
- return '';
- $aReplacements = [
- '/\<p>\<br[^>]*>\<\/p>/i' => '<br/>',
- '/\<p>/i' => '',
- '/\<\/p>/i' => '<br/>',
- '/<pre.*>/i' => '<pre>'
- ];
- $sNewMessage = preg_replace(array_keys($aReplacements), $aReplacements, $sMessage);
- return preg_replace('/(?:(?:\s*)?<br\/>)+$/', '', $sNewMessage);
- }
- function actionGetGiphy()
- {
- if (!$this->isLogged())
- return '';
- $aContent = $this->_oTemplate->getGiphyItems(bx_get('action'), urlencode(bx_get('filter')), (float) bx_get('height'), (int) bx_get('start'));
- if (isset($aContent['content']) && $aContent['content'])
- return echoJson(array('code' => 0, 'html' => $aContent['content'], 'total' => isset($aContent['pagination']) ? $aContent['pagination']['total_count'] : (int) bx_get('start')));
- return echoJson(array('code' => 1, 'message' => MsgBox(_t('_bx_messenger_giphy_gifs_nothing_found'))));
- }
- function serviceGetTalksList($aOptions = [])
- {
- $mixedGroup = isset($aOptions['group']) ? $aOptions['group'] : '';
- $iId = isset($aOptions['id']) ? (int) $aOptions['id'] : 0;
- $iLotId = isset($aOptions['lot']) ? (int) $aOptions['lot'] : 0;
- $aParams = ['start' => isset($aOptions['count']) ? (int) $aOptions['count'] : 0, 'lot' => $iLotId];
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $iLotId ? $this->_oDb->getLotInfoById($iLotId) : [];
- if (!empty($aLotInfo) && ($aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_PRIVATE && !$this->_oDb->isParticipant($aLotInfo[$CNF['FIELD_ID']], $this->_iProfileId)))
- return ['code' => 1, 'message' => _t('_bx_messenger_not_participant')];
- $sTitle = _t('_bx_messenger_nav_menu_item_title_' . ($mixedGroup ? $mixedGroup : 'inbox'));
- $aLotsList = [];
- switch ($mixedGroup) {
- case BX_MSG_TALK_TYPE_THREADS:
- $aParams['threads'] = true;
- $aLotsList = $this->_oDb->getMyLots($this->_iProfileId, $aParams);
- break;
- case 'public':
- $aParams['type'] = array(BX_IM_TYPE_SETS, BX_IM_TYPE_PUBLIC);
- $aLotsList = $this->_oDb->getMyLots($this->_iProfileId, $aParams);
- break;
- case BX_MSG_TALK_TYPE_FILES:
- break;
- case BX_MSG_TALK_TYPE_MR:
- $aLotsList = $this->_oDb->getReactionsMentionsLots($this->_iProfileId, $aParams);
- break;
- case BX_MSG_TALK_TYPE_REPLIES:
- $aLotsList = $this->_oDb->getLotsWithReplies($this->_iProfileId, $aParams);
- break;
- case BX_MSG_TALK_TYPE_SAVED:
- $aLotsList = $this->_oDb->getSavedJotInLots($this->_iProfileId, $aParams);
- break;
- case BX_MSG_TALK_TYPE_FAVORITES:
- // Talks marked with a star by the viewer, the same filter as the star toggle on the site.
- $aLotsList = $this->_oDb->getMyLots($this->_iProfileId, array_merge($aParams, ['star' => true]));
- break;
- case BX_MSG_TALK_TYPE_GROUPS:
- $aParams['group'] = $iId;
- $aLotsList = $this->_oDb->getMyLots($this->_iProfileId, $aParams);
- if (empty($aLotsList))
- break;
- $aGroupInfo = $this->_oDb->getGroupById($iId);
- $sTitle = !empty($aGroupInfo) ? $aGroupInfo[$CNF['FMG_NAME']] : current($aLotsList)['title'];
- break;
- case BX_MSG_TALK_TYPE_DIRECT:
- $aLotsList = $this->_oDb->getMyLots($this->_iProfileId, array_merge($aParams, ['type' => BX_IM_TYPE_PRIVATE]));
- break;
- default:
- $aLotsList = $this->_oDb->getMyLots($this->_iProfileId, array_merge($aParams, ['inbox' => true]));
- }
- $bNext = false;
- if (isset($aParams['per_page']) && count($aLotsList) === (int) $aParams['per_page'])
- $bNext = true;
- else if (count($aLotsList) === $CNF['MAX_LOTS_NUMBER'])
- $bNext = true;
- return ['title' => $sTitle, 'list' => $aLotsList, 'code' => 0, 'next' => $bNext];
- }
- function actionGetTalksList()
- {
- if (!$this->isLogged())
- return echoJson(['code' => 1, 'reload' => 1]);
- $aParams = ['group' => bx_get('group'), 'id' => (int) bx_get('id'), 'count' => (int) bx_get('count'), 'lot' => (int) bx_get('lot')];
- $iExcludeConvo = (int) bx_get('exclude_convo');
- $aData = $this->serviceGetTalksList($aParams);
- if (isset($aData['code']) && (int) $aData['code'])
- return echoJson(['code' => 1, 'msg' => $aData['message']]);
- $sTitle = isset($aData['title']) ? $aData['title'] : '';
- $aLotsList = isset($aData['list']) ? $aData['list'] : [];
- if (!empty($aLotsList)) {
- if ($iExcludeConvo) {
- $mixedKey = array_search($iExcludeConvo, array_column($aLotsList, $this->_oConfig->CNF['FIELD_ID']));
- if ($mixedKey !== false)
- unset($aLotsList[$mixedKey]);
- }
- $sContent = $this->_oTemplate->getLotsPreview($this->_iProfileId, $aLotsList);
- return echoJson(array(
- 'code' => 0,
- 'html' => $sContent,
- 'title' => _t($sTitle)
- ));
- }
- return echoJson(['code' => 1, 'html' => MsgBox(_t('_bx_messenger_txt_msg_no_results')), 'title' => _t($sTitle)]);
- }
- public function actionGetTopMenuItems()
- {
- $CNF = &$this->_oConfig->CNF;
- $oLeftMainMenu = BxTemplMenu::getObjectInstance($CNF['OBJECT_MENU_NAV_LEFT_MENU']);
- $oLeftGroupsMenu = BxTemplMenu::getObjectInstance($CNF['OBJECT_MENU_GROUPS_MENU']);
- return ['top' => $oLeftMainMenu->getMenuItems(), 'groups' => $oLeftGroupsMenu->getMenuItems()];
- }
- public function serviceGetLotStat($mixedLotId = '')
- {
- if (is_numeric($mixedLotId) && (int) $mixedLotId)
- $aLotInfo = $this->_oDb->getLotInfoById($mixedLotId);
- else {
- $sUrl = $mixedLotId ? $this->getPreparedUrl($mixedLotId) : $this->_oConfig->getPageIdent($mixedLotId);
- $aLotInfo = $this->_oDb->getLotByUrl($sUrl);
- }
- if (empty($aLotInfo))
- return $aLotInfo;
- $CNF = &$this->_oConfig->CNF;
- $aMessages = $this->_oDb->getLotJotsCount($aLotInfo[$CNF['FIELD_ID']]);
- return array(
- 'title' => $aLotInfo[$CNF['FIELD_TITLE']],
- 'created' => $aLotInfo[$CNF['FIELD_ADDED']],
- 'participants' => $aLotInfo[$CNF['FIELD_PARTICIPANTS']] ? explode(',', $aLotInfo[$CNF['FIELD_PARTICIPANTS']]) : array(),
- 'author' => $aLotInfo[$CNF['FIELD_AUTHOR']],
- 'url' => $aLotInfo[$CNF['FIELD_URL']],
- 'type' => $aLotInfo[$CNF['FIELD_TYPE']],
- 'messages' => array_merge($aMessages, array(
- 'total' => array_sum($aMessages)
- ))
- );
- }
- public function serviceGetUnreadLots($iProfileId)
- {
- if (!$iProfileId || !($oProfile = BxDolProfile::getInstance($iProfileId)))
- return array();
- $aLots = $this->_oDb->getLotsWithUnreadMessages($iProfileId);
- $aLotsInfo = array();
- foreach ($aLots as $iLotId => $iCount) {
- $aLotsInfo[$iLotId] = array(
- 'count' => $iCount,
- 'participants' => $this->_oDb->getParticipantsList($iLotId),
- 'new_messages' => $this->_oDb->getUnreadMessages($iProfileId, $iLotId)
- );
- }
- return $aLotsInfo;
- }
- public function actionGetJitsiConferenceForm($iLotId = 0)
- {
- if (!$this->_iProfileId) {
- echo MsgBox(_t('_bx_messenger_jitsi_err_can_join_conference'));
- exit;
- }
- header('Content-type: text/html; charset=utf-8');
- if (!$iLotId) {
- $sUrl = bx_get('url');
- $sTitle = bx_get('title');
- $aLot = $this->_oDb->getLotByUrl($sUrl);
- if (empty($aLot)) {
- $this->_oDb->createNewLot($this->_iProfileId, array('title' => $sTitle, 'type' => BX_IM_TYPE_PRIVATE, 'url' => $sUrl));
- $this->onCreateLot($iLotId);
- } else
- $iLotId = $aLot[$this->_oConfig->CNF['FIELD_ID']];
- }
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- $bIsParticipant = $this->_oDb->isParticipant($iLotId, $this->_iProfileId);
- if (!$bIsParticipant) {
- if ($aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PRIVATE) {
- echo MsgBox(_t('_bx_messenger_jitsi_err_can_join_conference'));
- exit;
- }
- if (!empty($aLotInfo))
- $this->_oDb->addMemberToParticipantsList($iLotId, $this->_iProfileId);
- }
- $aParams['audio_only'] = bx_get('startAudioOnly') ? 1 : 0;
- $mixedAuthor = $this->_oDb->getActiveJVCItem($iLotId, $CNF['FJVCT_AUTHOR_ID']);
- if (($mixedAuthor === false || ((int) $mixedAuthor == $this->_iProfileId)) && $this->_oConfig->isJitsiAllowed($aLotInfo[$CNF['FIELD_TYPE']])) {
- echo $this->_oTemplate->getJitsi($iLotId, $this->_iProfileId, $aParams);
- exit;
- }
- $sMessage = _t('_bx_messenger_jitsi_err_cant_type_use');
- if ($mixedAuthor !== false && ((int) $mixedAuthor != $this->_iProfileId) && ($mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_JOIN_TALK_VC))) {
- if ($mixedResult !== true)
- $sMessage = $mixedResult;
- else {
- echo $this->_oTemplate->getJitsi($iLotId, $this->_iProfileId, $aParams);
- exit;
- }
- }
- echo MsgBox($sMessage, 2.5);
- exit;
- }
- public function onCreateVC($iLotId)
- {
- bx_alert($this->_oConfig->getObject('alert'), 'create_vc', $iLotId, $this->_iUserId);
- }
- public function onJoinVC($iLotId)
- {
- $aItem = $this->_oDb->getActiveJVCItem($iLotId);
- bx_alert($this->_oConfig->getObject('alert'), 'join_vc', $iLotId, $this->_iUserId, array('object_author_id' => $aItem[$this->_oConfig->CNF['FJVCT_AUTHOR_ID']]));
- }
- public function actionCreateJitsiVideoConference()
- {
- $CNF = $this->_oConfig->CNF;
- $iLotId = (int) bx_get('lot_id');
- if (!$iLotId)
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_not_found')));
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_jitsi_err_can_join_conference')));
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- if (empty($aLotInfo))
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_not_found')));
- $bIsParticipant = $this->_oDb->isParticipant($iLotId, $this->_iProfileId);
- if (!$bIsParticipant) {
- if ($aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PRIVATE)
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_jitsi_err_can_join_conference')));
- $this->_oDb->addMemberToParticipantsList($iLotId, $this->_iProfileId);
- }
- $mixedAuthor = $this->_oDb->getActiveJVCItem($iLotId, $CNF['FJVCT_AUTHOR_ID']);
- if ($mixedAuthor != $this->_iProfileId && ($mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_JOIN_TALK_VC))) {
- if ($mixedResult !== true)
- return echoJson(array('code' => 1, 'message' => $mixedResult));
- }
- $aJVC = $this->_oDb->getJVC($iLotId);
- $iParticipants = count($this->_oDb->getParticipantsList($iLotId));
- $aResult = array('code' => 0, 'parts' => $iParticipants);
- if (!empty($aJVC) && (int) $aJVC[$CNF['FJVC_ACTIVE']]) {
- if ($this->_oDb->joinToActiveJVC($iLotId, $this->_iProfileId)) {
- $aResult['jot_id'] = $this->_oDb->getJotIdByJitsiItem((int) $aJVC[$CNF['FJVC_ACTIVE']]);
- $aResult[$CNF['FJVC_ROOM']] = $aJVC[$CNF['FJVC_ROOM']];
- $this->onJoinVC($iLotId);
- return echoJson($aResult);
- } else
- $this->_oDb->closeJVC($iLotId);
- }
- $this->onCreateVC($iLotId);
- return echoJson(
- array_merge(
- array('new' => 1),
- $aResult,
- $this->_oDb->createJVC($iLotId, $this->_iProfileId)
- )
- );
- }
- public function actionStopJvc()
- {
- $iLotId = (int) bx_get('lot_id');
- if (!$iLotId)
- return echoJson(array('code' => 1, 'msg' => _t('_bx_messenger_not_found')));
- if (!$this->_oDb->isParticipant($iLotId, $this->_iProfileId))
- return echoJson(array('code' => 1));
- if ($this->_oDb->stopJVC($iLotId, $this->_iProfileId))
- return echoJson(array('code' => 0));
- return echoJson(array('code' => 1));
- }
- public function actionLeaveJvc()
- {
- if (!isLogged())
- return '';
- $iLotId = (int) bx_get('lot_id');
- $this->_oDb->leaveJVC($iLotId, $this->_iProfileId);
- }
- function actionGetTalkFiles()
- {
- $iLotId = (int) bx_get('lot_id');
- $iNumber = (int) bx_get('number');
- $CNF = $this->_oConfig->CNF;
- if (!$iLotId)
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_found'))));
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- if (empty($aLotInfo) || ($aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_PRIVATE && !$this->_oDb->isParticipant($aLotInfo[$CNF['FIELD_ID']], $this->_iProfileId)))
- return echoJson(array('code' => 1, 'message' => '_bx_messenger_not_participant'));
- if (!($iTotal = $this->_oDb->getLotFilesCount($iLotId)))
- return echoJson(array('code' => 0, 'html' => MsgBox(_t('_bx_messenger_txt_msg_no_results'))));
- $sContent = $this->_oTemplate->getTalkFiles($this->_iProfileId, $iLotId, $iNumber);
- return echoJson(array('code' => 0, 'html' => ($iTotal !== $iNumber ? $sContent : ''), 'total' => $iTotal));
- }
- function actionGetCallPopup()
- {
- $iLotId = (int) bx_get('lot');
- $aResult = array('code' => 1, 'msg' => _t('_bx_messenger_not_found'));
- if (!$iLotId || !isLogged())
- return echoJson($aResult);
- if ($this->_oConfig->isAllowedAction(BX_MSG_ACTION_JOIN_TALK_VC) !== true)
- $aResult = array('code' => 1);
- else {
- $mixedContent = $this->_oTemplate->getCallPopup($iLotId, $this->_iProfileId);
- $aResult = array('code' => +($mixedContent === false), 'popup' => $mixedContent);
- }
- return echoJson($aResult);
- }
- function actionGetLotSettings()
- {
- $iLotId = (int) bx_get('lot');
- $aResult = array('code' => 1, 'msg' => _t('_bx_messenger_not_found'));
- if (!$iLotId || !isLogged())
- return echoJson($aResult);
- $aResult = array('code' => 1, 'msg' => _t('_bx_messenger_lot_can_change_settings'));
- $bCheckAction = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_ADMINISTRATE_TALKS, $this->_iProfileId) === true;
- if (!($this->_oDb->isAuthor($iLotId, $this->_iProfileId) || $bCheckAction))
- return echoJson($aResult);
- $mixedContent = $this->_oTemplate->getLotSettingsForm($iLotId);
- $aResult = array(
- 'code' => +($mixedContent === false),
- 'popup' => array(
- 'html' => $mixedContent,
- 'options' => array(
- 'closeOnOuterClick' => true,
- 'removeOnClose' => true
- )
- )
- );
- return echoJson($aResult);
- }
- function actionSaveLotSettings()
- {
- $iLotId = (int) bx_get('lot');
- $aOptions = bx_get('options');
- $aResult = ['code' => 1, 'msg' => _t('_bx_messenger_not_found')];
- if (!$iLotId || !isLogged() || !($aLotInfo = $this->_oDb->getLotInfoById($iLotId)))
- return echoJson($aResult);
- $aResult = ['code' => 1, 'msg' => _t('_bx_messenger_lot_can_change_settings')];
- $bCheckAction = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_ADMINISTRATE_TALKS, $this->_iProfileId) === true;
- if (!($this->_oDb->isAuthor($iLotId, $this->_iProfileId) || $bCheckAction))
- return echoJson($aResult);
- $aResult = ['code' => 1, 'msg' => _t('_bx_messenger_nothing_has_been_saved')];
- if ($this->_oDb->saveLotSettings($iLotId, $aOptions))
- return echoJson(['code' => 0]);
- return echoJson($aResult);
- }
- function serviceSearch($sText = '', $iStart = 0, $iLimit = 10, $sOrder = 'DESC', $iLotId = 0)
- {
- $CNF = $this->_oConfig->CNF;
- if (($iLotId && !isLogged()) || (!isAdmin() && !$iLotId))
- return _t('_bx_messenger_no_permissions');
- $sResult = $this->_oDb->findInHistory($iLotId, $sText, $iStart, $iLimit, $sOrder);
- if (empty($sResult))
- return array();
- $aMessages = array();
- foreach ($sResult as &$aMessage) {
- $iType = $aMessage[$CNF['FIELD_TYPE']];
- $sTitle = $aMessage[$CNF['FIELD_TITLE']] ?
- _t($aMessage[$CNF['FIELD_TITLE']]) : _t('_bx_messenger_lots_private_lot');
- $aMessages[] = array_merge($aMessage, array(
- $CNF['FIELD_TITLE'] => $sTitle,
- 'message_url' => $this->_oConfig->getRepostUrl($aMessage['message_id']),
- $CNF['FIELD_PARTICIPANTS'] => explode(',', $aMessage[$CNF['FIELD_PARTICIPANTS']])
- ));
- }
- return $aMessages;
- }
- function serviceGetVideoConference($sRoomIdent, $iInitiator, $sTitle = '', $sId = '', $aInterfaceConfig = array())
- {
- if (!$iInitiator)
- if (!$sRoomIdent)
- $sRoomIdent = $this->_iProfileId;
- return $this->_oTemplate->getPublicJitsi($iInitiator, $sRoomIdent, $sTitle, $sId, $aInterfaceConfig);
- }
- function serviceGetPublicRoomInfo($sRoomId)
- {
- return $this->_oDb->getPublicVideoRoom($sRoomId);
- }
- function serviceGenerateRoomName($sIdent)
- {
- return $this->_oConfig->getRoomId($sIdent);
- }
- function actionGetEmojiPicker()
- {
- if (!$this->_iProfileId)
- return;
- echo $this->_oTemplate->getEmojiCode();
- exit;
- }
- function actionUpdateUploadedFiles()
- {
- $iJotId = bx_get('jot_id');
- $aFiles = bx_get('files');
- if (!$this->isLogged())
- return echoJson(['code' => 1, 'message' => MsgBox(_t('_bx_messenger_not_logged')), 'reload' => 1]);
- if (!$iJotId || empty($aFiles))
- return echoJson(['code' => 1, 'message' => MsgBox(_t('_bx_messenger_files_can_not_be_uploaded'))]);
- $mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_SEND_MESSAGE, $this->_iProfileId);
- if ($mixedResult !== true)
- return echoJson(array('code' => 1, 'message' => $mixedResult));
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotByJotId($iJotId, false);
- if (
- empty($aLotInfo) || ($aLotInfo[$CNF['FIELD_TYPE']] === BX_IM_TYPE_PRIVATE &&
- !$this->_oDb->isParticipant($aLotInfo[$CNF['FIELD_ID']], $this->_iProfileId))
- )
- return echoJson(array('code' => 1, 'message' => '_bx_messenger_not_participant'));
- $aUploadedFiles = $this->_oDb->getJotFiles($iJotId);
- $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
- $aSuccessfulFiles = array();
- foreach ($aFiles as &$aFile) {
- $sRealName = $aFile['realname'];
- if (
- !empty($aUploadedFiles) && array_filter($aUploadedFiles, function ($aF) use ($sRealName, $CNF) {
- return $aF[$CNF['FIELD_ST_NAME']] == $sRealName;
- })
- )
- continue;
- if (!$this->_oConfig->isValidToUpload($aFile['name'])) {
- $this->_oDb->deleteJot($iJotId, $this->_iProfileId, true);
- return echoJson(array('code' => 1, 'message' => _t('_bx_messenger_bad_request')));
- }
- $sFile = BX_DIRECTORY_PATH_TMP . basename($aFile['name']);
- $sExt = $oStorage->getFileExt($sFile);
- $iFileId = $oStorage->storeFileFromPath($sFile, $aLotInfo[$CNF['FIELD_TYPE']] == BX_IM_TYPE_PRIVATE, $this->_iProfileId, (int) $iJotId);
- $sFilename = $oStorage->getFileTitle($sRealName) . ".{$sExt}";
- if ($iFileId) {
- $oStorage->afterUploadCleanup($iFileId, $this->_iProfileId);
- $this->_oDb->updateFiles($iFileId, array(
- $CNF['FIELD_ST_JOT'] => $iJotId,
- $CNF['FIELD_ST_NAME'] => $sFilename
- ));
- $aSuccessfulFiles[] = $sFilename;
- @unlink($sFile);
- }
- }
- if (count($aSuccessfulFiles)) {
- $aFilesData = [];
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- if (!empty($aJotInfo[$CNF['FIELD_MESSAGE_AT']])) {
- $aFilesData = @unserialize($aJotInfo[$CNF['FIELD_MESSAGE_AT']]);
- if (!is_array($aFilesData))
- $aFilesData = [];
- if (isset($aFilesData[BX_ATT_TYPE_FILES_UPLOADING]))
- unset($aFilesData[BX_ATT_TYPE_FILES_UPLOADING]);
- }
- $aStoredFiles = [];
- if (!empty($aFilesData[BX_ATT_TYPE_FILES])) {
- if (is_array($aFilesData[BX_ATT_TYPE_FILES]))
- $aStoredFiles = $aFilesData[BX_ATT_TYPE_FILES];
- elseif (is_string($aFilesData[BX_ATT_TYPE_FILES])) {
- $aStoredFiles = @unserialize($aFilesData[BX_ATT_TYPE_FILES]);
- if (!is_array($aStoredFiles))
- $aStoredFiles = [];
- }
- }
- $aFilesData[BX_ATT_TYPE_FILES] = $aStoredFiles + $aSuccessfulFiles;
- $this->_oDb->updateJot($iJotId, $CNF['FIELD_MESSAGE_AT'], @serialize($aFilesData));
- }
- echoJson(array('code' => 0));
- }
- function serviceGetSearchOptions()
- {
- $aResult = array();
- $CNF = &$this->_oConfig->CNF;
- foreach ($CNF['SEARCH-CRITERIA'] as &$sItem)
- $aResult[$sItem] = _t("_bx_messenger_search_item_{$sItem}");
- return $aResult;
- }
- function serviceSetTalkAvatar($iLotId, $mixedFile)
- {
- if (!$mixedFile)
- return false;
- return $this->setLotAvatar($iLotId, $mixedFile);
- }
- function setLotAvatar($iLotId, $mixedFile = null)
- {
- if (!$this->isLogged() || $mixedFile === null)
- return false;
- if (!($aLotInfo = $this->_oDb->getLotInfoById($iLotId)))
- return false;
- $CNF = &$this->_oConfig->CNF;
- $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
- if (is_array($mixedFile) && isset($mixedFile['name'])) {
- $sFile = BX_DIRECTORY_PATH_TMP . basename($mixedFile['name']);
- $iFileId = $oStorage->storeFileFromPath($sFile, false, $this->_iProfileId, $iLotId);
- } elseif (filter_var($mixedFile, FILTER_VALIDATE_URL) !== false)
- $iFileId = $oStorage->storeFileFromUrl($mixedFile, false, $this->_iProfileId, $iLotId);
- elseif ((int) $mixedFile)
- $iFileId = (int) $mixedFile;
- if ($iFileId) {
- $oStorage->afterUploadCleanup($iFileId, $this->_iProfileId);
- $this->_oDb->saveLotSettings($iLotId, $iFileId, $CNF['FLS_ICON']);
- }
- }
- function actionGetCreateGroupForm()
- {
- $iGroupId = (int) bx_get('group');
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'msg' => MsgBox(_t('_bx_messenger_not_logged'))));
- $mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_GROUPS, $this->_iProfileId);
- if ($mixedResult !== true)
- return echoJson(array('code' => 1, 'msg' => _t($mixedResult)));
- $aResult = array('code' => 0, 'popup' => $this->_oTemplate->getCreateGroupsForm($this->_iProfileId, $iGroupId));
- echoJson($aResult);
- }
- function actionSaveGroup()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'msg' => MsgBox(_t('_bx_messenger_not_logged'))));
- $mixedResult = $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_GROUPS, $this->_iProfileId);
- if ($mixedResult !== true)
- return echoJson(array('code' => 1, 'msg' => _t($mixedResult)));
- if ($this->_oDb->addGroup($this->_iProfileId, $_POST))
- return echoJson(array('code' => 0));
- choJson(array('code' => 1, 'msg' => _t('_bx_messenger_nothing_has_been_saved')));
- }
- function actionLoadGroupsList()
- {
- if (!$this->isLogged())
- return echoJson(array('code' => 1, 'msg' => MsgBox(_t('_bx_messenger_not_logged'))));
- echoJson(array('code' => 0, 'content' => $this->_oTemplate->getNavGroupsMenu($this->_iProfileId)));
- }
- function serviceIsBlockVersion()
- {
- return $this->_isBlockMessenger;
- }
- function actionAddMembersToGroups()
- {
- $CNF = &$this->_oConfig->CNF;
- if (!$this->isLogged())
- return false;
- $aGroups = $this->_oDb->getAll("SELECT
- `l`.*, `g`.`{$CNF['FMG_MODULE']}`, `g`.`{$CNF['FMG_NAME']}`, `gl`.`{$CNF['FMGL_GROUP_ID']}`,
- IF (`l`.`{$CNF['FIELD_UPDATED']}` = 0, `l`.`{$CNF['FIELD_ADDED']}`, `l`.`{$CNF['FIELD_UPDATED']}`) as `order`
- FROM `{$CNF['TABLE_ENTRIES']}` as `l`
- LEFT JOIN `{$CNF['TABLE_GROUPS_LOTS']}` as `gl` ON `gl`.`{$CNF['FMGL_LOT_ID']}` = `l`.`{$CNF['FIELD_ID']}`
- LEFT JOIN `{$CNF['TABLE_GROUPS']}` as `g` ON `g`.`{$CNF['FMG_ID']}` = `gl`.`{$CNF['FMGL_GROUP_ID']}`
- WHERE `l`.`{$CNF['FIELD_TYPE']}` > 3
- ORDER BY `g`.`{$CNF['FMG_MODULE']}`"); //AND (`gl`.`{$CNF['FMGL_GROUP_ID']}` IS NULL OR `gl`.`{$CNF['FMGL_GROUP_ID']}` = 0)
- foreach ($aGroups as $aGroup) {
- if ($aGroup[$CNF['FIELD_URL']])
- $this->_oDb->registerGroup($aGroup[$CNF['FIELD_URL']], $aGroup[$CNF['FIELD_ID']]);
- }
- }
- function actionUpdateGroups()
- {
- if (!isLogged())
- return false;
- $aModules = bx_srv('system', 'get_modules_by_type', ['context']);
- bx_import('BxDolConnection');
- foreach ($aModules as &$aModule)
- if (!bx_srv($aModule['name'], 'act_as_profile')) {
- $aMyItems = bx_srv($aModule['name'], 'get_participating_profiles', [$this->_iProfileId]);
- foreach ($aMyItems as &$iItem) {
- $oGroupProfile = BxDolProfile::getInstance($iItem);
- if ($oGroupProfile) {
- $aItemInfo = bx_srv($aModule['name'], 'get_info', array($oGroupProfile->getContentId(), false));
- $oModule = BxDolModule::getInstance($aModule['name']);
- $CNF = &$oModule->_oConfig->CNF;
- $oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS']);
- if (!$oConnection)
- continue;
- $aFans = $oConnection->getConnectedInitiators($iItem);
- if (!empty($aFans)) {
- $aObject = BxDolPageQuery::getPageObject($CNF['OBJECT_PAGE_VIEW_ENTRY']);
- $sUrl = "i={$aObject['uri']}&id=" . $oGroupProfile->getContentId();
- $aLotInfo = $this->_oDb->getLotByUrl($sUrl);
- if (empty($aLotInfo)) {
- $iLotId = $this->_oDb->createLot($aItemInfo[$CNF['FIELD_AUTHOR']], $sUrl, $aItemInfo[$CNF['FIELD_TITLE']], BX_IM_TYPE_GROUPS, $aFans);
- $this->_oDb->registerGroup($sUrl, $iLotId);
- }
- }
- }
- }
- }
- }
- function actionMediaAccordion()
- {
- $bShown = (bool) bx_get('hidden');
- $iFileId = (int) bx_get('id');
- if (!$this->isLogged() || !$iFileId)
- return false;
- $oStorage = BxDolStorage::getObjectInstance($this->_oConfig->CNF['OBJECT_STORAGE']);
- if (!($aFile = $oStorage->getFile($iFileId)))
- return false;
- $iLotId = $this->_oDb->getLotByJotId($aFile[$this->_oConfig->CNF['FIELD_ST_JOT']]);
- if (!$this->_oDb->isParticipant($iLotId, $this->_iProfileId))
- return false;
- if (!$bShown)
- $this->_oDb->addMediaTrack($iFileId, $this->_iProfileId);
- else
- $this->_oDb->removeMediaTracker($iFileId, $this->_iProfileId);
- }
- function serviceConvertToReply()
- {
- $CNF = &$this->_oConfig->CNF;
- $aJots = $this->_oDb->getAll("SELECT * FROM `{$CNF['TABLE_MESSAGES']}`
- WHERE `{$CNF['FIELD_MESSAGE_AT_TYPE']}`=:type OR `{$CNF['FIELD_MESSAGE_AT']}` LIKE '%\"reply\"%'", array('type' => BX_ATT_TYPE_REPLY));
- foreach ($aJots as &$aJot) {
- if ($aJot[$CNF['FIELD_MESSAGE_AT_TYPE']] == BX_ATT_TYPE_REPLY && (int) $aJot[$CNF['FIELD_MESSAGE_AT']])
- $this->_oDb->query(
- "UPDATE `{$CNF['TABLE_MESSAGES']}` SET `{$CNF['FIELD_MESSAGE_REPLY']}`=:reply WHERE `{$CNF['FIELD_MESSAGE_ID']}`=:id",
- array('id' => $aJot[$CNF['FIELD_MESSAGE_ID']], 'reply' => (int) $aJot[$CNF['FIELD_MESSAGE_AT']])
- );
- elseif (!$aJot[$CNF['FIELD_MESSAGE_AT_TYPE']] && $aJot[$CNF['FIELD_MESSAGE_AT']]) {
- $aAttachment = @unserialize($aJot[$CNF['FIELD_MESSAGE_AT']]);
- if (!empty($aAttachment[BX_ATT_TYPE_REPLY]))
- $this->_oDb->query("UPDATE `{$CNF['TABLE_MESSAGES']}` SET `{$CNF['FIELD_MESSAGE_REPLY']}`=:reply
- WHERE `{$CNF['FIELD_MESSAGE_ID']}`=:id", array('id' => $aJot[$CNF['FIELD_MESSAGE_ID']], 'reply' => $aAttachment[BX_ATT_TYPE_REPLY]));
- }
- }
- }
- function serviceUpdateMemberships()
- {
- $aMembershipLevels = BxDolAcl::getInstance()->getMemberships();
- $sModuleName = $this->getName();
- $iActionId = BxDolAcl::getInstance()->getMembershipActionId('administrate messages', $sModuleName);
- $iActionEditId = BxDolAcl::getInstance()->getMembershipActionId('edit messages', $sModuleName);
- $iActionDeleteId = BxDolAcl::getInstance()->getMembershipActionId('delete messages', $sModuleName);
- if (!($iActionId && $iActionEditId && $iActionDeleteId) || empty($aMembershipLevels))
- return false;
- foreach ($aMembershipLevels as $iMembershipId => $sMembership) {
- $aAction = BxDolAclQuery::getInstance()->getAction($iMembershipId, $iActionId);
- $aActionEdit = BxDolAclQuery::getInstance()->getAction($iMembershipId, $iActionEditId);
- $aActionDelete = BxDolAclQuery::getInstance()->getAction($iMembershipId, $iActionDeleteId);
- if (is_null($aAction['id']) || !is_null($aActionEdit['id']) || !is_null($aActionDelete['id']))
- continue;
- $this->_oDb->query("INSERT INTO `sys_acl_matrix` SET `IDLevel`=:level, `IDAction`=:action", array('level' => $iMembershipId, 'action' => $iActionDeleteId));
- $this->_oDb->query("INSERT INTO `sys_acl_matrix` SET `IDLevel`=:level, `IDAction`=:action", array('level' => $iMembershipId, 'action' => $iActionEditId));
- $this->_oDb->query("DELETE FROM `sys_acl_matrix` WHERE `IDLevel`=:level AND `IDAction`=:action", array('level' => $iMembershipId, 'action' => $iActionId));
- }
- return $iActionId;
- }
- function servicePublicToPages()
- {
- $CNF = &$this->_oConfig->CNF;
- $aLots = $this->_oDb->getAll("SELECT * FROM `{$CNF['TABLE_ENTRIES']}`
- WHERE `{$CNF['FIELD_TYPE']}`!=:type AND `{$CNF['FIELD_URL']}` != ''", array('type' => BX_IM_TYPE_PRIVATE));
- foreach ($aLots as &$aLot) {
- $iGroupId = $this->_oDb->getGroupIdByLotId($aLot[$CNF['FIELD_ID']]);
- if ($iGroupId)
- continue;
- $sUrl = $aLot[$CNF['FIELD_URL']];
- if ($sUrl === 'index.php')
- $sUrl = "i=index";
- else
- if (stripos($sUrl, 'i=') === FALSE)
- $sUrl = "i=" . str_replace('r=', '', $aLot[$CNF['FIELD_URL']]);
- $aGroup = $this->_oDb->getGroupByUrl($sUrl);
- if (empty($aGroup))
- $this->_oDb->registerGroup($sUrl, $aLot[$CNF['FIELD_ID']], true);
- else
- $this->_oDb->addLotToGroup($aLot[$CNF['FIELD_ID']], $aGroup[$CNF['FMG_ID']]);
- }
- }
- public function serviceGetSafeServices()
- {
- return [
- 'FindConvo' => 'BxMessengerServices',
- 'LeaveConvo' => 'BxMessengerServices',
- 'DeleteConvo' => 'BxMessengerServices',
- 'ClearConvo' => 'BxMessengerServices',
- 'MuteConvo' => 'BxMessengerServices',
- 'StarConvo' => 'BxMessengerServices',
- 'SaveJot' => 'BxMessengerServices',
- 'SearchConvoMessages' => 'BxMessengerServices',
- 'GetConvoFiles' => 'BxMessengerServices',
- 'GetConvoSettings' => 'BxMessengerServices',
- 'SaveConvoSettings' => 'BxMessengerServices',
- 'GetConvo' => 'BxMessengerServices',
- 'GetConvoUrl' => 'BxMessengerServices',
- 'GetConvosList' => 'BxMessengerServices',
- 'GetConvoMessages' => 'BxMessengerServices',
- 'GetSendForm' => 'BxMessengerServices',
- 'RemoveJot' => 'BxMessengerServices',
- 'SearchUsers' => 'BxMessengerServices',
- 'SearchLots' => 'BxMessengerServices',
- 'GetPartsList' => 'BxMessengerServices',
- 'SavePartsList' => 'BxMessengerServices',
- 'GetBlockContacts' => 'BxMessengerServices',
- //--- Aren't used in App for now.
- 'GetConvoMessage' => '',
- 'GetConferenceInfoByUid' => 'BxMessengerServices',
- 'GetConvoItem' => '',
- 'ClearGhost' => '',
- ];
- }
- /*
- * Should be moved to Services if it's needed, otherwise removed.
- */
- public function serviceClearGhost($sParams)
- {
- $aOptions = json_decode($sParams, true);
- if (!isset($aOptions['id']))
- return [];
- $CNF = &$this->_oConfig->CNF;
- $aJotInfo = $this->_oDb->getJotById($aOptions['id']);
- if (empty($aJotInfo) || !$this->isAvailable($aJotInfo[$CNF['FIELD_MESSAGE_FK']]))
- return [];
- $oStorage = BxDolStorage::getObjectInstance($CNF['OBJECT_STORAGE']);
- if (!($aFiles = $this->_oDb->getJotFiles($aOptions['id'])))
- return [];
- $aResultFiles = array_map(function ($aFile) use ($CNF) {
- return $aFile[$CNF['FIELD_ST_ID']];
- }, $aFiles);
- $oStorage->afterUploadCleanup($aResultFiles, $this->_iProfileId);
- }
- /*
- * Moved to Services
- */
- public function serviceSavePartsList($sParams)
- {
- $aOptions = json_decode($sParams, true);
- $aResult = ['code' => 1];
- if (!$sParams || !isset($aOptions['parts']))
- return $aResult;
- $aResult = $this->saveParticipantsList($aOptions['parts'], (isset($aOptions['id']) ? $aOptions['id'] : 0));
- if (isset($aResult['lot'])) {
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($aResult['lot']);
- $aItem = $this->_oTemplate->getLotsPreview($this->_iProfileId, [$aLotInfo]);
- if (!empty($aItem)) {
- $aItem = current($aItem);
- $sImageUrl = bx_api_get_relative_url($aItem['bx_if:user']['content']['icon']);
- $aResult['convo'] = [
- 'author_data' => (int) $aItem[$CNF['FIELD_AUTHOR']] ? BxDolProfile::getInstance()->getData($aItem[$CNF['FIELD_AUTHOR']]) : [
- 'id' => 0,
- 'display_type' => 'unit',
- 'display_name' => $aItem['bx_if:user']['content']['talk_type'],
- 'url' => $sImageUrl,
- 'url_avatar' => $sImageUrl,
- 'module' => isset($aItem['author_module']) ? $aItem['author_module'] : 'bx_pages',
- ],
- 'title' => $aItem[$CNF['FIELD_TITLE']],
- 'message' => $aItem['bx_if:user']['content']['message'],
- 'date' => $aItem['bx_if:timer']['content']['time'],
- 'id' => $aLotInfo[$CNF['FIELD_HASH']],
- 'total_messages' => $this->_oDb->getJotsNumber($aItem[$CNF['FIELD_ID']], 0)
- ];
- $aResult['lot'] = $aLotInfo[$CNF['FIELD_HASH']];
- }
- }
- return $aResult;
- }
- /*
- * Moved to Services
- */
- public function serviceSearchUsers($sParams)
- {
- $aOptions = json_decode($sParams, true);
- $aResult = ['code' => 1];
- $aUsers = [];
- if (!$sParams || !isset($aOptions['term']))
- return $aResult;
- $aFoundProfile = $this->searchProfiles($aOptions['term'], isset($aOptions['except']) ? $aOptions['except'] : []);
- if (!empty($aFoundProfile)) {
- foreach ($aFoundProfile as &$aProfile) {
- $oModule = BxDolModule::getInstance($aProfile['module']);
- $oPCNF = &$oModule->_oConfig->CNF;
- $aData = $oModule->_oDb->getContentInfoById($aProfile['id']);
- $oProfile = BxDolProfile::getInstanceByContentAndType($aProfile['id'], $aProfile['module']);
- $aUsers[] = array_merge($aProfile, [
- 'id' => $oProfile->id(),
- 'image' => bx_api_get_image($oPCNF['OBJECT_STORAGE'], $aData[$oPCNF['FIELD_PICTURE']]),
- 'cover' => bx_api_get_image($oPCNF['OBJECT_STORAGE'], $aData[$oPCNF['FIELD_COVER']])
- ]);
- }
- }
- return $aUsers;
- }
- /*
- * Moved to Services.
- */
- public function serviceFindConvo($sParams)
- {
- $aOptions = json_decode($sParams, true);
- $aResult = ['code' => 1];
- if (!isset($aOptions['param']))
- return $aResult;
- if ($aOptions['param']) {
- $oProfile = null;
- $aData = BxDolPageQuery::getSeoLink($this->_oConfig->getName(), 'messenger', ['param_name' => 'profile_id', 'uri' => $aOptions['param']]);
- if (!empty($aData) && isset($aData['param_value']))
- $oProfile = BxDolProfile::getInstance($aData['param_value']);
- if (!$oProfile) {
- $aPersonsData = BxDolPageQuery::getSeoLink('bx_persons', 'view-persons-profile', ['param_name' => 'id', 'uri' => $aOptions['param']]);
- if (!empty($aPersonsData) && isset($aPersonsData['param_value']))
- $oProfile = BxDolProfile::getInstanceByContentAndType($aPersonsData['param_value'], 'bx_persons');
- }
- if (!$oProfile) {
- $aOrgData = BxDolPageQuery::getSeoLink('bx_organizations', 'view-organization-profile', ['param_name' => 'id', 'uri' => $aOptions['param']]);
- if (!empty($aOrgData) && isset($aOrgData['param_value']))
- $oProfile = BxDolProfile::getInstanceByContentAndType($aOrgData['param_value'], 'bx_organizations');
- }
- if ($oProfile) {
- if ($aExistedTalk = $this->_oDb->getLotsByParticipantsList([$oProfile->id(), $this->_iProfileId], BX_IM_TYPE_PRIVATE))
- return ['convo' => $aExistedTalk];
- return ['profile' => BxDolProfile::getInstance()->getData($oProfile->id())];
- }
- }
- return [];
- }
- /*
- * Should be moved to Services if it's needed, otherwise removed.
- */
- public function serviceGetConvoItem($sParams)
- {
- $aOptions = json_decode($sParams, true);
- $aResult = array('code' => 1);
- if (!isset($aOptions['id']) || !($aLotInfo = $this->_oDb->getLotInfoById($aOptions['id'])))
- return $aResult;
- $iLotId = $aOptions['id'];
- if (!$this->_oDb->isParticipant($iLotId, $this->_iProfileId))
- return ['code' => 1, _t('_bx_messenger_not_participant')];
- $CNF = $this->_oConfig->CNF;
- return array_merge($aLotInfo, ['author_data' => BxDolProfile::getInstance()->getData($aLotInfo[$CNF['FIELD_AUTHOR']])]);
- }
- /*
- * Moved to Services
- */
- function serviceRemoveJot($sParams = '')
- {
- $aOptions = json_decode($sParams, true);
- $iJotId = isset($aOptions['jot_id']) ? (int) $aOptions['jot_id'] : 0;
- $iLotId = isset($aOptions['lot_id']) ? $aOptions['lot_id'] : 0;
- if (!$iJotId)
- return [];
- $this->pusherData('convo_' . $iLotId, ['convo' => $iLotId, 'action' => 'deleted', 'data' => $iJotId]);
- return $this->serviceDeleteJot($iJotId, true);
- }
- /*
- * Moved to Services
- */
- function serviceGetConvosList($sParams = '')
- {
- $aOptions = json_decode($sParams, true);
- $aData = $this->serviceGetTalksList($aOptions);
- $aList = $aData['list'];
- if (isset($aData['code']) && !(int) $aData['code'] && !empty($aData['list']))
- $aList = $this->_oTemplate->getLotsPreview($this->_iProfileId, $aData['list']);
- $CNF = &$this->_oConfig->CNF;
- $aResult = [];
- if (!empty($aList)) {
- foreach ($aList as $iKey => $aItem) {
- $sImageUrl = bx_api_get_relative_url($aItem['bx_if:user']['content']['icon']);
- $aResult[] = [
- 'author_data' => (int) $aItem[$CNF['FIELD_AUTHOR']] ? BxDolProfile::getInstance()->getData($aItem[$CNF['FIELD_AUTHOR']]) : [
- 'id' => 0,
- 'display_type' => 'unit',
- 'display_name' => $aItem['bx_if:user']['content']['talk_type'],
- 'url' => $sImageUrl,
- 'url_avatar' => $sImageUrl,
- 'module' => isset($aItem['author_module']) ? $aItem['author_module'] : 'bx_pages',
- ],
- 'title' => $aItem[$CNF['FIELD_TITLE']],
- 'message' => $aItem['bx_if:user']['content']['message'],
- 'date' => $aItem['bx_if:timer']['content']['time'],
- 'id' => $aData['list'][$iKey][$CNF['FIELD_HASH']],
- 'id2' => $aItem[$CNF['FIELD_ID']],
- 'unread' => $aItem['count'],
- 'total_messages' => $this->_oDb->getJotsNumber($aItem[$CNF['FIELD_ID']], 0)
- ];
- }
- }
- return $aResult;
- }
- public function checkAllowedDeleteAnyEntryForProfile($isPerformAction = false, $iProfileId = false)
- {
- return true;
- }
- public function checkAllowedEditAnyEntryForProfile($isPerformAction = false, $iProfileId = false)
- {
- return true;
- }
- /**
- * Moved to Services
- */
- public function unitAPI($iProfileId, $aParams = [])
- {
- $CNF = &$this->_oConfig->CNF;
- $oProfile = BxDolProfile::getInstance($iProfileId);
- if (!$oProfile)
- return '';
- $sModule = $oProfile->getModule();
- $iContentId = $oProfile->getContentId();
- $oModule = BxDolModule::getInstance($sModule);
- $aData = $oModule->_oDb->getContentInfoById($iContentId);
- $oPCNF = &$oModule->_oConfig->CNF;
- // get profile's url
- $sUrl = bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $oPCNF['URI_VIEW_ENTRY'] . '&id=' . $iContentId));
- $aResult = [
- 'id' => $iContentId,
- 'module' => $sModule,
- 'added' => $aData[$oPCNF['FIELD_ADDED']],
- 'title' => $aData[$oPCNF['FIELD_TITLE']],
- 'url' => bx_api_get_relative_url($sUrl),
- 'image' => bx_api_get_image($oPCNF['OBJECT_STORAGE'], $aData[$oPCNF['FIELD_PICTURE']]),
- 'cover' => bx_api_get_image($oPCNF['OBJECT_STORAGE'], $aData[$oPCNF['FIELD_COVER']])
- ];
- $oPrivacy = BxDolPrivacy::getObjectInstance($oPCNF['OBJECT_PRIVACY_VIEW']);
- $bPrivacy = $oPrivacy !== false;
- $sKey = 'OBJECT_MENU_SNIPPET_META';
- if (!empty($CNF[$sKey]) && ($oMetaMenu = BxDolMenu::getObjectInstance($CNF[$sKey], $oModule->_oTemplate)) !== false) {
- $bPublic = !$bPrivacy || $oPrivacy->check($iContentId) || $oPrivacy->isPartiallyVisible($aData[$CNF['FIELD_ALLOW_VIEW_TO']]);
- $oMetaMenu->setContentModule($sModule);
- $oMetaMenu->setContentId($iContentId);
- $oMetaMenu->setContentPublic($bPublic);
- $aResult['meta'] = $oMetaMenu->getCodeAPI();
- }
- return $aResult;
- }
- function serviceGetBlockContactsMessenger($mixedParams = [])
- {
- if (bx_is_api())
- return bx_srv($this->getName(), 'get_block_contacts', [$mixedParams], 'Services');
- return $this->_oTemplate->getContacts($this->_iProfileId, $mixedParams);
- }
- public function serviceGetBroadcastFields($aInputsAdd = array())
- {
- $aFields = $this->_oTemplate->_getBroadcastFields();
- $aResult = [];
- foreach ($aFields as $sName => $aField) {
- if (isset($aField['skip']) || !isset($aField['caption']))
- continue;
- $aResult[$sName] = $aField['caption'];
- }
- return $aResult;
- }
- private function queueBroadcastDelivery($iConvoId, $iJotId, $iAuthorId, $aNotificationsType = [], $iAfterUserId = 0)
- {
- if (!$iConvoId || !$iJotId || !$iAuthorId)
- return false;
- $sStamp = str_replace('.', '', sprintf('%.6F', microtime(true)));
- $sJobName = sprintf('%s_broadcast_%d_%d_%s', $this->_oConfig->getName(), $iConvoId, $iAfterUserId, $sStamp);
- return BxDolBackgroundJobs::getInstance()->add($sJobName, [
- $this->_oConfig->getName(),
- 'process_broadcast_queue',
- [$iConvoId, $iJotId, $iAuthorId, (array) $aNotificationsType, $iAfterUserId],
- 'Module'
- ], 5);
- }
- public function serviceProcessBroadcastQueue($iConvoId, $iJotId, $iAuthorId, $aNotificationsType = [], $iAfterUserId = 0)
- {
- if (!$iConvoId || !$iJotId || !$iAuthorId)
- return false;
- $CNF = &$this->_oConfig->CNF;
- $aConvoInfo = $this->_oDb->getLotInfoById($iConvoId);
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- if (empty($aConvoInfo) || empty($aJotInfo) || (int) $aConvoInfo[$CNF['FIELD_TYPE']] !== BX_IM_TYPE_BROADCAST)
- return false;
- $sModule = $this->_oConfig->getObject('alert');
- for ($iBatch = 0; $iBatch < self::BROADCAST_BATCHES_PER_RUN; $iBatch++) {
- $aParticipants = $this->_oDb->getBroadcastParticipants($iConvoId, self::BROADCAST_BATCH_SIZE + 1, $iAfterUserId);
- if (empty($aParticipants))
- return true;
- $bHasMore = count($aParticipants) > self::BROADCAST_BATCH_SIZE;
- if ($bHasMore)
- $aParticipants = array_slice($aParticipants, 0, self::BROADCAST_BATCH_SIZE);
- $this->_oDb->markAsNewJot($aParticipants, $iConvoId, $iJotId, false);
- foreach ($aParticipants as $iPart) {
- bx_alert($sModule, 'got_broadcast_ntfs', $iConvoId, $iAuthorId, [
- 'object_author_id' => $iPart,
- 'recipient_id' => $iPart,
- 'subobject_id' => $iJotId,
- 'source' => $sModule . '_' . $iJotId,
- 'source_mac' => $sModule . '_' . $iAuthorId . '_' . $iJotId,
- ] + (array) $aNotificationsType);
- }
- $iAfterUserId = (int) end($aParticipants);
- if (!$bHasMore)
- return true;
- }
- return $this->queueBroadcastDelivery($iConvoId, $iJotId, $iAuthorId, $aNotificationsType, $iAfterUserId);
- }
- private function getProfilesByCriteria($aData, $aOptions = [])
- {
- $bCountOnly = !empty($aOptions['count_only']);
- $aExcludeProfiles = $aOptions['exclude_profiles'] ?? [];
- $aIncludeProfiles = $aOptions['include_profiles'] ?? [];
- if (isset($aData['connection_type'])) {
- if ($oConnection = $this->_oConfig->getConnectionByType($aData['connection_type'])) {
- if ($bCountOnly && empty($aExcludeProfiles) && empty($aIncludeProfiles))
- return (int)$oConnection->getConnectedContentCount($this->_iProfileId, $aData['connection_type'] === 'friends');
- $aProfiles = $oConnection->getConnectedContent($this->_iProfileId, $aData['connection_type'] === 'friends');
- if (!empty($aExcludeProfiles))
- $aProfiles = array_values(array_diff($aProfiles, $aExcludeProfiles));
- if (!empty($aIncludeProfiles))
- $aProfiles = array_unique(array_merge($aProfiles, $aIncludeProfiles));
- return $bCountOnly ? count($aProfiles) : $aProfiles;
- }
- }
- $CNF = &$this->_oConfig->CNF;
- if (!($oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_FILTER'], $CNF['OBJECT_FORM_FILTER_DISPLAY'], $this->_oTemplate)))
- return false;
- $oForm->filteredForm();
- $aFields = [];
- foreach ($oForm->aInputs as &$aInput) {
- if (!isset($aData[$aInput['name']]) || isset($aInput['skip']) || $aInput['name'] === 'convo_type')
- continue;
- if (!empty($aInput['values']))
- $aFields[$aInput['name']] = array_filter($aData[$aInput['name']], function ($sVal) use ($aInput) {
- return in_array($sVal, array_keys($aInput['values']));
- });
- else
- $aFields[$aInput['name']] = $aData[$aInput['name']];
- }
- $aParams = [];
- if (!empty($aExcludeProfiles))
- $aParams['exclude_profiles'] = $aExcludeProfiles;
- if (!empty($aIncludeProfiles))
- $aParams['include_profiles'] = $aIncludeProfiles;
- $aProfiles = $this->_oDb->getProfilesByCriteria($aFields, $aParams);
- bx_alert($this->_oConfig->getObject('alert'), 'broadcast_profiles_list', 0, 0, [
- 'profiles' => &$aProfiles
- ]);
- if ($bCountOnly)
- return count($aProfiles);
- return $aProfiles;
- }
- function actionCalculateProfiles()
- {
- $aData = bx_get('data');
- $aManuall = array_values(array_unique(array_filter(array_map('intval', (array)bx_get('manually')), function ($iProfileId) {
- return $iProfileId > 0;
- })));
- $iConvoType = isset($aData['convo_type']) ? $aData['convo_type'] : 0;
- if (!$this->isLogged() || (empty($aData) && empty($aManuall)) || !$iConvoType)
- return false;
- $aParams['count_only'] = true;
- if (!empty($aManuall))
- $aParams['include_profiles'] = $aManuall;
- $iTotal = (int)$this->getProfilesByCriteria($aData, $aParams);
- echoJson(['msg' => _t('_bx_messenger_broadcast_total_profiles', $iTotal)]);
- }
- function serviceGetBroadcastCard($iJotId)
- {
- if (!$iJotId)
- return '';
- $aLotInfo = $this->_oDb->getLotByJotId($iJotId, false);
- $aJotInfo = $this->_oDb->getJotById($iJotId);
- return $this->_oTemplate->parseHtmlByName('broadcast-message.html', ['title' => $aLotInfo['title'], 'content' => $aJotInfo['message']]);
- }
- function actionGetFilterCriteria()
- {
- if (!$this->isLogged() && $this->_oConfig->isAllowedAction(BX_MSG_ACTION_CREATE_BROADCASTS) !== true)
- return echoJson(['code' => 1]);
- $CNF = &$this->_oConfig->CNF;
- $sType = bx_get('type');
- $sHtml = '';
- switch ($sType) {
- case BX_MSG_TALK_TYPE_BROADCAST:
- $oForm = BxDolForm::getObjectInstance($CNF['OBJECT_FORM_FILTER'], $CNF['OBJECT_FORM_FILTER_DISPLAY'], $this->_oTemplate);
- if ($oForm->filteredForm())
- $sHtml = $oForm->getCode();
- else
- $sHtml = MsgBox(_t('_bx_messenger_no_criteria_available'));
- break;
- case 'followers':
- case 'friends':
- $sHtml = $this->_oTemplate->getConnectionsForm($sType, $this->_iProfileId);
- break;
- /*default:
- $aForm = [
- 'form_attrs' => [
- 'method' => 'post',
- 'id' => $CNF['OBJECT_FORM_ENTRY'],
- 'class' => 'space-y-4 max-h-60 overflow-y-auto'
- ],
- 'inputs' => $this->_oTemplate->getNotificationFormData()
- ];
- $oForm = new BxTemplFormView($aForm);
- $sHtml = $oForm -> getCode();*/
- }
- echoJson(['code' => 0, 'html' => $sHtml]);
- }
- public function actionAjaxGetRecipients()
- {
- $sTerm = bx_get('term');
- $a = BxDolService::call('system', 'profiles_search', array($sTerm), 'TemplServiceProfiles');
- header('Content-Type:text/javascript; charset=utf-8');
- echo (json_encode($a));
- }
- function actionGetTalkInfo()
- {
- $iLotId = (int) bx_get('lot_id');
- if (!$iLotId)
- return echoJson(array('code' => 1, 'html' => MsgBox(_t('_bx_messenger_not_found'))));
- if (!$this->isAvailable($iLotId))
- return echoJson(array('code' => 1, 'message' => '_bx_messenger_not_participant'));
- $sContent = $this->_oTemplate->getInfoBlockContent($iLotId);
- return echoJson(array('code' => 0, 'html' => $sContent));
- }
- public function broadcastNewJot($iLotId, $iJotId)
- {
- $iLotId = (int)$iLotId;
- $iJotId = (int)$iJotId;
- if (!$iLotId || !$iJotId)
- return false;
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($iLotId);
- if (empty($aLotInfo) || empty($aLotInfo[$CNF['FIELD_HASH']]))
- return false;
- $sHash = mb_strtolower($aLotInfo[$CNF['FIELD_HASH']]);
- // NEO JotItem expects Services API shape (menu.items)
- bx_import('Services', $this->_aModule);
- $oServices = new BxMessengerServices();
- $this->pusherData('convo_' . $sHash, [
- 'convo' => $iLotId,
- 'action' => 'added',
- 'data' => $oServices->serviceGetConvoMessages([
- 'load' => 'ids',
- 'lot' => $sHash,
- 'jot' => $iJotId,
- ]),
- ]);
- $aParticipantsList = $this->_oDb->getParticipantsList($iLotId, true);
- foreach ($aParticipantsList as $iProfile) {
- $this->pusherData('profile_' . $iProfile, ['convo' => $iLotId]);
- }
- return true;
- }
- /**
- * Moved to Services
- */
- private function pusherData($sAction, $aData = [])
- {
- $oSockets = BxDolSockets::getInstance();
- if (isset($aData['convo']) && (int) $aData['convo']) {
- $CNF = &$this->_oConfig->CNF;
- $aLotInfo = $this->_oDb->getLotInfoById($aData['convo']);
- $aData['id'] = mb_strtolower($aLotInfo[$CNF['FIELD_HASH']]);
- }
- $aData['user_id'] = $this->_iProfileId;
- if ($oSockets->isEnabled() && $sAction && !empty($aData)) {
- $oSockets->sendEvent('bx', 'messenger', $sAction, $aData);
- }
- }
- }
- /** @} */
|