webim.js 407KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283
  1. /* webim javascript SDK
  2. * VER 1.7.2
  3. */
  4. (function(global, factory) {
  5. global['Long'] = factory();
  6. })(window, function() {
  7. 'use strict';
  8. function Long(low, high, unsigned) {
  9. this.low = low | 0;
  10. this.high = high | 0;
  11. this.unsigned = !!unsigned;
  12. }
  13. Long.prototype.__isLong__;
  14. Object.defineProperty(Long.prototype, '__isLong__', {
  15. value: true,
  16. enumerable: false,
  17. configurable: false
  18. });
  19. function isLong(obj) {
  20. return (obj && obj['__isLong__']) === true;
  21. }
  22. Long.isLong = isLong;
  23. var INT_CACHE = {};
  24. var UINT_CACHE = {};
  25. function fromInt(value, unsigned) {
  26. var obj, cachedObj, cache;
  27. if (unsigned) {
  28. value >>>= 0;
  29. if ((cache = 0 <= value && value < 256)) {
  30. cachedObj = UINT_CACHE[value];
  31. if (cachedObj) return cachedObj;
  32. }
  33. obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);
  34. if (cache) UINT_CACHE[value] = obj;
  35. return obj;
  36. } else {
  37. value |= 0;
  38. if ((cache = -128 <= value && value < 128)) {
  39. cachedObj = INT_CACHE[value];
  40. if (cachedObj) return cachedObj;
  41. }
  42. obj = fromBits(value, value < 0 ? -1 : 0, false);
  43. if (cache) INT_CACHE[value] = obj;
  44. return obj;
  45. }
  46. }
  47. Long.fromInt = fromInt;
  48. function fromNumber(value, unsigned) {
  49. if (isNaN(value) || !isFinite(value)) return unsigned ? UZERO : ZERO;
  50. if (unsigned) {
  51. if (value < 0) return UZERO;
  52. if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;
  53. } else {
  54. if (value <= -TWO_PWR_63_DBL) return MIN_VALUE;
  55. if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE;
  56. }
  57. if (value < 0) return fromNumber(-value, unsigned).neg();
  58. return fromBits(value % TWO_PWR_32_DBL | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);
  59. }
  60. Long.fromNumber = fromNumber;
  61. function fromBits(lowBits, highBits, unsigned) {
  62. return new Long(lowBits, highBits, unsigned);
  63. }
  64. Long.fromBits = fromBits;
  65. var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)
  66. function fromString(str, unsigned, radix) {
  67. if (str.length === 0) throw Error('empty string');
  68. if (str === 'NaN' || str === 'Infinity' || str === '+Infinity' || str === '-Infinity') return ZERO;
  69. if (typeof unsigned === 'number') {
  70. // For goog.math.long compatibility
  71. (radix = unsigned), (unsigned = false);
  72. } else {
  73. unsigned = !!unsigned;
  74. }
  75. radix = radix || 10;
  76. if (radix < 2 || 36 < radix) throw RangeError('radix');
  77. var p;
  78. if ((p = str.indexOf('-')) > 0) throw Error('interior hyphen');
  79. else if (p === 0) {
  80. return fromString(str.substring(1), unsigned, radix).neg();
  81. }
  82. var radixToPower = fromNumber(pow_dbl(radix, 8));
  83. var result = ZERO;
  84. for (var i = 0; i < str.length; i += 8) {
  85. var size = Math.min(8, str.length - i),
  86. value = parseInt(str.substring(i, i + size), radix);
  87. if (size < 8) {
  88. var power = fromNumber(pow_dbl(radix, size));
  89. result = result.mul(power).add(fromNumber(value));
  90. } else {
  91. result = result.mul(radixToPower);
  92. result = result.add(fromNumber(value));
  93. }
  94. }
  95. result.unsigned = unsigned;
  96. return result;
  97. }
  98. Long.fromString = fromString;
  99. function fromValue(val) {
  100. if (val /* is compatible */ instanceof Long) return val;
  101. if (typeof val === 'number') return fromNumber(val);
  102. if (typeof val === 'string') return fromString(val);
  103. // Throws for non-objects, converts non-instanceof Long:
  104. return fromBits(val.low, val.high, val.unsigned);
  105. }
  106. Long.fromValue = fromValue;
  107. var TWO_PWR_16_DBL = 1 << 16;
  108. var TWO_PWR_24_DBL = 1 << 24;
  109. var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;
  110. var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;
  111. var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;
  112. var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);
  113. var ZERO = fromInt(0);
  114. Long.ZERO = ZERO;
  115. var UZERO = fromInt(0, true);
  116. Long.UZERO = UZERO;
  117. var ONE = fromInt(1);
  118. Long.ONE = ONE;
  119. var UONE = fromInt(1, true);
  120. Long.UONE = UONE;
  121. var NEG_ONE = fromInt(-1);
  122. Long.NEG_ONE = NEG_ONE;
  123. var MAX_VALUE = fromBits(0xffffffff | 0, 0x7fffffff | 0, false);
  124. Long.MAX_VALUE = MAX_VALUE;
  125. var MAX_UNSIGNED_VALUE = fromBits(0xffffffff | 0, 0xffffffff | 0, true);
  126. Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;
  127. var MIN_VALUE = fromBits(0, 0x80000000 | 0, false);
  128. Long.MIN_VALUE = MIN_VALUE;
  129. var LongPrototype = Long.prototype;
  130. LongPrototype.toInt = function toInt() {
  131. return this.unsigned ? this.low >>> 0 : this.low;
  132. };
  133. LongPrototype.toNumber = function toNumber() {
  134. if (this.unsigned) return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0);
  135. return this.high * TWO_PWR_32_DBL + (this.low >>> 0);
  136. };
  137. LongPrototype.toString = function toString(radix) {
  138. radix = radix || 10;
  139. if (radix < 2 || 36 < radix) throw RangeError('radix');
  140. if (this.isZero()) return '0';
  141. if (this.isNegative()) {
  142. // Unsigned Longs are never negative
  143. if (this.eq(MIN_VALUE)) {
  144. // We need to change the Long value before it can be negated, so we remove
  145. // the bottom-most digit in this base and then recurse to do the rest.
  146. var radixLong = fromNumber(radix),
  147. div = this.div(radixLong),
  148. rem1 = div.mul(radixLong).sub(this);
  149. return div.toString(radix) + rem1.toInt().toString(radix);
  150. } else return '-' + this.neg().toString(radix);
  151. }
  152. var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),
  153. rem = this;
  154. var result = '';
  155. while (true) {
  156. var remDiv = rem.div(radixToPower),
  157. intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,
  158. digits = intval.toString(radix);
  159. rem = remDiv;
  160. if (rem.isZero()) return digits + result;
  161. else {
  162. while (digits.length < 6) digits = '0' + digits;
  163. result = '' + digits + result;
  164. }
  165. }
  166. };
  167. LongPrototype.getHighBits = function getHighBits() {
  168. return this.high;
  169. };
  170. LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {
  171. return this.high >>> 0;
  172. };
  173. LongPrototype.getLowBits = function getLowBits() {
  174. return this.low;
  175. };
  176. LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {
  177. return this.low >>> 0;
  178. };
  179. LongPrototype.getNumBitsAbs = function getNumBitsAbs() {
  180. if (this.isNegative())
  181. // Unsigned Longs are never negative
  182. return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
  183. var val = this.high != 0 ? this.high : this.low;
  184. for (var bit = 31; bit > 0; bit--) if ((val & (1 << bit)) != 0) break;
  185. return this.high != 0 ? bit + 33 : bit + 1;
  186. };
  187. LongPrototype.isZero = function isZero() {
  188. return this.high === 0 && this.low === 0;
  189. };
  190. LongPrototype.isNegative = function isNegative() {
  191. return !this.unsigned && this.high < 0;
  192. };
  193. LongPrototype.isPositive = function isPositive() {
  194. return this.unsigned || this.high >= 0;
  195. };
  196. LongPrototype.isOdd = function isOdd() {
  197. return (this.low & 1) === 1;
  198. };
  199. LongPrototype.isEven = function isEven() {
  200. return (this.low & 1) === 0;
  201. };
  202. LongPrototype.equals = function equals(other) {
  203. if (!isLong(other)) other = fromValue(other);
  204. if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) return false;
  205. return this.high === other.high && this.low === other.low;
  206. };
  207. LongPrototype.eq = LongPrototype.equals;
  208. LongPrototype.notEquals = function notEquals(other) {
  209. return !this.eq(/* validates */ other);
  210. };
  211. LongPrototype.neq = LongPrototype.notEquals;
  212. /**
  213. * Tests if this Long's value is less than the specified's.
  214. * @param {!Long|number|string} other Other value
  215. * @returns {boolean}
  216. */
  217. LongPrototype.lessThan = function lessThan(other) {
  218. return this.comp(/* validates */ other) < 0;
  219. };
  220. /**
  221. * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.
  222. * @function
  223. * @param {!Long|number|string} other Other value
  224. * @returns {boolean}
  225. */
  226. LongPrototype.lt = LongPrototype.lessThan;
  227. /**
  228. * Tests if this Long's value is less than or equal the specified's.
  229. * @param {!Long|number|string} other Other value
  230. * @returns {boolean}
  231. */
  232. LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {
  233. return this.comp(/* validates */ other) <= 0;
  234. };
  235. /**
  236. * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
  237. * @function
  238. * @param {!Long|number|string} other Other value
  239. * @returns {boolean}
  240. */
  241. LongPrototype.lte = LongPrototype.lessThanOrEqual;
  242. /**
  243. * Tests if this Long's value is greater than the specified's.
  244. * @param {!Long|number|string} other Other value
  245. * @returns {boolean}
  246. */
  247. LongPrototype.greaterThan = function greaterThan(other) {
  248. return this.comp(/* validates */ other) > 0;
  249. };
  250. /**
  251. * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.
  252. * @function
  253. * @param {!Long|number|string} other Other value
  254. * @returns {boolean}
  255. */
  256. LongPrototype.gt = LongPrototype.greaterThan;
  257. /**
  258. * Tests if this Long's value is greater than or equal the specified's.
  259. * @param {!Long|number|string} other Other value
  260. * @returns {boolean}
  261. */
  262. LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {
  263. return this.comp(/* validates */ other) >= 0;
  264. };
  265. /**
  266. * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
  267. * @function
  268. * @param {!Long|number|string} other Other value
  269. * @returns {boolean}
  270. */
  271. LongPrototype.gte = LongPrototype.greaterThanOrEqual;
  272. /**
  273. * Compares this Long's value with the specified's.
  274. * @param {!Long|number|string} other Other value
  275. * @returns {number} 0 if they are the same, 1 if the this is greater and -1
  276. * if the given one is greater
  277. */
  278. LongPrototype.compare = function compare(other) {
  279. if (!isLong(other)) other = fromValue(other);
  280. if (this.eq(other)) return 0;
  281. var thisNeg = this.isNegative(),
  282. otherNeg = other.isNegative();
  283. if (thisNeg && !otherNeg) return -1;
  284. if (!thisNeg && otherNeg) return 1;
  285. // At this point the sign bits are the same
  286. if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1;
  287. // Both are positive if at least one is unsigned
  288. return other.high >>> 0 > this.high >>> 0 || (other.high === this.high && other.low >>> 0 > this.low >>> 0) ? -1 : 1;
  289. };
  290. /**
  291. * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.
  292. * @function
  293. * @param {!Long|number|string} other Other value
  294. * @returns {number} 0 if they are the same, 1 if the this is greater and -1
  295. * if the given one is greater
  296. */
  297. LongPrototype.comp = LongPrototype.compare;
  298. /**
  299. * Negates this Long's value.
  300. * @returns {!Long} Negated Long
  301. */
  302. LongPrototype.negate = function negate() {
  303. if (!this.unsigned && this.eq(MIN_VALUE)) return MIN_VALUE;
  304. return this.not().add(ONE);
  305. };
  306. /**
  307. * Negates this Long's value. This is an alias of {@link Long#negate}.
  308. * @function
  309. * @returns {!Long} Negated Long
  310. */
  311. LongPrototype.neg = LongPrototype.negate;
  312. /**
  313. * Returns the sum of this and the specified Long.
  314. * @param {!Long|number|string} addend Addend
  315. * @returns {!Long} Sum
  316. */
  317. LongPrototype.add = function add(addend) {
  318. if (!isLong(addend)) addend = fromValue(addend);
  319. // Divide each number into 4 chunks of 16 bits, and then sum the chunks.
  320. var a48 = this.high >>> 16;
  321. var a32 = this.high & 0xffff;
  322. var a16 = this.low >>> 16;
  323. var a00 = this.low & 0xffff;
  324. var b48 = addend.high >>> 16;
  325. var b32 = addend.high & 0xffff;
  326. var b16 = addend.low >>> 16;
  327. var b00 = addend.low & 0xffff;
  328. var c48 = 0,
  329. c32 = 0,
  330. c16 = 0,
  331. c00 = 0;
  332. c00 += a00 + b00;
  333. c16 += c00 >>> 16;
  334. c00 &= 0xffff;
  335. c16 += a16 + b16;
  336. c32 += c16 >>> 16;
  337. c16 &= 0xffff;
  338. c32 += a32 + b32;
  339. c48 += c32 >>> 16;
  340. c32 &= 0xffff;
  341. c48 += a48 + b48;
  342. c48 &= 0xffff;
  343. return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
  344. };
  345. /**
  346. * Returns the difference of this and the specified Long.
  347. * @param {!Long|number|string} subtrahend Subtrahend
  348. * @returns {!Long} Difference
  349. */
  350. LongPrototype.subtract = function subtract(subtrahend) {
  351. if (!isLong(subtrahend)) subtrahend = fromValue(subtrahend);
  352. return this.add(subtrahend.neg());
  353. };
  354. /**
  355. * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.
  356. * @function
  357. * @param {!Long|number|string} subtrahend Subtrahend
  358. * @returns {!Long} Difference
  359. */
  360. LongPrototype.sub = LongPrototype.subtract;
  361. /**
  362. * Returns the product of this and the specified Long.
  363. * @param {!Long|number|string} multiplier Multiplier
  364. * @returns {!Long} Product
  365. */
  366. LongPrototype.multiply = function multiply(multiplier) {
  367. if (this.isZero()) return ZERO;
  368. if (!isLong(multiplier)) multiplier = fromValue(multiplier);
  369. if (multiplier.isZero()) return ZERO;
  370. if (this.eq(MIN_VALUE)) return multiplier.isOdd() ? MIN_VALUE : ZERO;
  371. if (multiplier.eq(MIN_VALUE)) return this.isOdd() ? MIN_VALUE : ZERO;
  372. if (this.isNegative()) {
  373. if (multiplier.isNegative()) return this.neg().mul(multiplier.neg());
  374. else
  375. return this.neg()
  376. .mul(multiplier)
  377. .neg();
  378. } else if (multiplier.isNegative()) return this.mul(multiplier.neg()).neg();
  379. // If both longs are small, use float multiplication
  380. if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);
  381. // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
  382. // We can skip products that would overflow.
  383. var a48 = this.high >>> 16;
  384. var a32 = this.high & 0xffff;
  385. var a16 = this.low >>> 16;
  386. var a00 = this.low & 0xffff;
  387. var b48 = multiplier.high >>> 16;
  388. var b32 = multiplier.high & 0xffff;
  389. var b16 = multiplier.low >>> 16;
  390. var b00 = multiplier.low & 0xffff;
  391. var c48 = 0,
  392. c32 = 0,
  393. c16 = 0,
  394. c00 = 0;
  395. c00 += a00 * b00;
  396. c16 += c00 >>> 16;
  397. c00 &= 0xffff;
  398. c16 += a16 * b00;
  399. c32 += c16 >>> 16;
  400. c16 &= 0xffff;
  401. c16 += a00 * b16;
  402. c32 += c16 >>> 16;
  403. c16 &= 0xffff;
  404. c32 += a32 * b00;
  405. c48 += c32 >>> 16;
  406. c32 &= 0xffff;
  407. c32 += a16 * b16;
  408. c48 += c32 >>> 16;
  409. c32 &= 0xffff;
  410. c32 += a00 * b32;
  411. c48 += c32 >>> 16;
  412. c32 &= 0xffff;
  413. c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
  414. c48 &= 0xffff;
  415. return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
  416. };
  417. /**
  418. * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.
  419. * @function
  420. * @param {!Long|number|string} multiplier Multiplier
  421. * @returns {!Long} Product
  422. */
  423. LongPrototype.mul = LongPrototype.multiply;
  424. /**
  425. * Returns this Long divided by the specified. The result is signed if this Long is signed or
  426. * unsigned if this Long is unsigned.
  427. * @param {!Long|number|string} divisor Divisor
  428. * @returns {!Long} Quotient
  429. */
  430. LongPrototype.divide = function divide(divisor) {
  431. if (!isLong(divisor)) divisor = fromValue(divisor);
  432. if (divisor.isZero()) throw Error('division by zero');
  433. if (this.isZero()) return this.unsigned ? UZERO : ZERO;
  434. var approx, rem, res;
  435. if (!this.unsigned) {
  436. // This section is only relevant for signed longs and is derived from the
  437. // closure library as a whole.
  438. if (this.eq(MIN_VALUE)) {
  439. if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) return MIN_VALUE;
  440. // recall that -MIN_VALUE == MIN_VALUE
  441. else if (divisor.eq(MIN_VALUE)) return ONE;
  442. else {
  443. // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
  444. var halfThis = this.shr(1);
  445. approx = halfThis.div(divisor).shl(1);
  446. if (approx.eq(ZERO)) {
  447. return divisor.isNegative() ? ONE : NEG_ONE;
  448. } else {
  449. rem = this.sub(divisor.mul(approx));
  450. res = approx.add(rem.div(divisor));
  451. return res;
  452. }
  453. }
  454. } else if (divisor.eq(MIN_VALUE)) return this.unsigned ? UZERO : ZERO;
  455. if (this.isNegative()) {
  456. if (divisor.isNegative()) return this.neg().div(divisor.neg());
  457. return this.neg()
  458. .div(divisor)
  459. .neg();
  460. } else if (divisor.isNegative()) return this.div(divisor.neg()).neg();
  461. res = ZERO;
  462. } else {
  463. // The algorithm below has not been made for unsigned longs. It's therefore
  464. // required to take special care of the MSB prior to running it.
  465. if (!divisor.unsigned) divisor = divisor.toUnsigned();
  466. if (divisor.gt(this)) return UZERO;
  467. if (divisor.gt(this.shru(1)))
  468. // 15 >>> 1 = 7 ; with divisor = 8 ; true
  469. return UONE;
  470. res = UZERO;
  471. }
  472. // Repeat the following until the remainder is less than other: find a
  473. // floating-point that approximates remainder / other *from below*, add this
  474. // into the result, and subtract it from the remainder. It is critical that
  475. // the approximate value is less than or equal to the real value so that the
  476. // remainder never becomes negative.
  477. rem = this;
  478. while (rem.gte(divisor)) {
  479. // Approximate the result of division. This may be a little greater or
  480. // smaller than the actual value.
  481. approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));
  482. // We will tweak the approximate result by changing it in the 48-th digit or
  483. // the smallest non-fractional digit, whichever is larger.
  484. var log2 = Math.ceil(Math.log(approx) / Math.LN2),
  485. delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48),
  486. // Decrease the approximation until it is smaller than the remainder. Note
  487. // that if it is too large, the product overflows and is negative.
  488. approxRes = fromNumber(approx),
  489. approxRem = approxRes.mul(divisor);
  490. while (approxRem.isNegative() || approxRem.gt(rem)) {
  491. approx -= delta;
  492. approxRes = fromNumber(approx, this.unsigned);
  493. approxRem = approxRes.mul(divisor);
  494. }
  495. // We know the answer can't be zero... and actually, zero would cause
  496. // infinite recursion since we would make no progress.
  497. if (approxRes.isZero()) approxRes = ONE;
  498. res = res.add(approxRes);
  499. rem = rem.sub(approxRem);
  500. }
  501. return res;
  502. };
  503. /**
  504. * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.
  505. * @function
  506. * @param {!Long|number|string} divisor Divisor
  507. * @returns {!Long} Quotient
  508. */
  509. LongPrototype.div = LongPrototype.divide;
  510. /**
  511. * Returns this Long modulo the specified.
  512. * @param {!Long|number|string} divisor Divisor
  513. * @returns {!Long} Remainder
  514. */
  515. LongPrototype.modulo = function modulo(divisor) {
  516. if (!isLong(divisor)) divisor = fromValue(divisor);
  517. return this.sub(this.div(divisor).mul(divisor));
  518. };
  519. /**
  520. * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
  521. * @function
  522. * @param {!Long|number|string} divisor Divisor
  523. * @returns {!Long} Remainder
  524. */
  525. LongPrototype.mod = LongPrototype.modulo;
  526. /**
  527. * Returns the bitwise NOT of this Long.
  528. * @returns {!Long}
  529. */
  530. LongPrototype.not = function not() {
  531. return fromBits(~this.low, ~this.high, this.unsigned);
  532. };
  533. /**
  534. * Returns the bitwise AND of this Long and the specified.
  535. * @param {!Long|number|string} other Other Long
  536. * @returns {!Long}
  537. */
  538. LongPrototype.and = function and(other) {
  539. if (!isLong(other)) other = fromValue(other);
  540. return fromBits(this.low & other.low, this.high & other.high, this.unsigned);
  541. };
  542. /**
  543. * Returns the bitwise OR of this Long and the specified.
  544. * @param {!Long|number|string} other Other Long
  545. * @returns {!Long}
  546. */
  547. LongPrototype.or = function or(other) {
  548. if (!isLong(other)) other = fromValue(other);
  549. return fromBits(this.low | other.low, this.high | other.high, this.unsigned);
  550. };
  551. /**
  552. * Returns the bitwise XOR of this Long and the given one.
  553. * @param {!Long|number|string} other Other Long
  554. * @returns {!Long}
  555. */
  556. LongPrototype.xor = function xor(other) {
  557. if (!isLong(other)) other = fromValue(other);
  558. return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);
  559. };
  560. /**
  561. * Returns this Long with bits shifted to the left by the given amount.
  562. * @param {number|!Long} numBits Number of bits
  563. * @returns {!Long} Shifted Long
  564. */
  565. LongPrototype.shiftLeft = function shiftLeft(numBits) {
  566. if (isLong(numBits)) numBits = numBits.toInt();
  567. if ((numBits &= 63) === 0) return this;
  568. else if (numBits < 32) return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);
  569. else return fromBits(0, this.low << (numBits - 32), this.unsigned);
  570. };
  571. /**
  572. * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.
  573. * @function
  574. * @param {number|!Long} numBits Number of bits
  575. * @returns {!Long} Shifted Long
  576. */
  577. LongPrototype.shl = LongPrototype.shiftLeft;
  578. /**
  579. * Returns this Long with bits arithmetically shifted to the right by the given amount.
  580. * @param {number|!Long} numBits Number of bits
  581. * @returns {!Long} Shifted Long
  582. */
  583. LongPrototype.shiftRight = function shiftRight(numBits) {
  584. if (isLong(numBits)) numBits = numBits.toInt();
  585. if ((numBits &= 63) === 0) return this;
  586. else if (numBits < 32) return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);
  587. else return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);
  588. };
  589. /**
  590. * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.
  591. * @function
  592. * @param {number|!Long} numBits Number of bits
  593. * @returns {!Long} Shifted Long
  594. */
  595. LongPrototype.shr = LongPrototype.shiftRight;
  596. /**
  597. * Returns this Long with bits logically shifted to the right by the given amount.
  598. * @param {number|!Long} numBits Number of bits
  599. * @returns {!Long} Shifted Long
  600. */
  601. LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {
  602. if (isLong(numBits)) numBits = numBits.toInt();
  603. numBits &= 63;
  604. if (numBits === 0) return this;
  605. else {
  606. var high = this.high;
  607. if (numBits < 32) {
  608. var low = this.low;
  609. return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);
  610. } else if (numBits === 32) return fromBits(high, 0, this.unsigned);
  611. else return fromBits(high >>> (numBits - 32), 0, this.unsigned);
  612. }
  613. };
  614. /**
  615. * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
  616. * @function
  617. * @param {number|!Long} numBits Number of bits
  618. * @returns {!Long} Shifted Long
  619. */
  620. LongPrototype.shru = LongPrototype.shiftRightUnsigned;
  621. /**
  622. * Converts this Long to signed.
  623. * @returns {!Long} Signed long
  624. */
  625. LongPrototype.toSigned = function toSigned() {
  626. if (!this.unsigned) return this;
  627. return fromBits(this.low, this.high, false);
  628. };
  629. /**
  630. * Converts this Long to unsigned.
  631. * @returns {!Long} Unsigned long
  632. */
  633. LongPrototype.toUnsigned = function toUnsigned() {
  634. if (this.unsigned) return this;
  635. return fromBits(this.low, this.high, true);
  636. };
  637. /**
  638. * Converts this Long to its byte representation.
  639. * @param {boolean=} le Whether little or big endian, defaults to big endian
  640. * @returns {!Array.<number>} Byte representation
  641. */
  642. LongPrototype.toBytes = function(le) {
  643. return le ? this.toBytesLE() : this.toBytesBE();
  644. };
  645. /**
  646. * Converts this Long to its little endian byte representation.
  647. * @returns {!Array.<number>} Little endian byte representation
  648. */
  649. LongPrototype.toBytesLE = function() {
  650. var hi = this.high,
  651. lo = this.low;
  652. return [lo & 0xff, (lo >>> 8) & 0xff, (lo >>> 16) & 0xff, (lo >>> 24) & 0xff, hi & 0xff, (hi >>> 8) & 0xff, (hi >>> 16) & 0xff, (hi >>> 24) & 0xff];
  653. };
  654. /**
  655. * Converts this Long to its big endian byte representation.
  656. * @returns {!Array.<number>} Big endian byte representation
  657. */
  658. LongPrototype.toBytesBE = function() {
  659. var hi = this.high,
  660. lo = this.low;
  661. return [(hi >>> 24) & 0xff, (hi >>> 16) & 0xff, (hi >>> 8) & 0xff, hi & 0xff, (lo >>> 24) & 0xff, (lo >>> 16) & 0xff, (lo >>> 8) & 0xff, lo & 0xff];
  662. };
  663. return Long;
  664. });
  665. (function (factory) {
  666. global['SparkMD5'] = factory();
  667. }(function (undefined) {
  668. 'use strict';
  669. /*
  670. * Fastest md5 implementation around (JKM md5).
  671. * Credits: Joseph Myers
  672. *
  673. * @see http://www.myersdaily.org/joseph/javascript/md5-text.html
  674. * @see http://jsperf.com/md5-shootout/7
  675. */
  676. /* this function is much faster,
  677. so if possible we use it. Some IEs
  678. are the only ones I know of that
  679. need the idiotic second function,
  680. generated by an if clause. */
  681. var add32 = function (a, b) {
  682. return (a + b) & 0xFFFFFFFF;
  683. },
  684. hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
  685. function cmn(q, a, b, x, s, t) {
  686. a = add32(add32(a, q), add32(x, t));
  687. return add32((a << s) | (a >>> (32 - s)), b);
  688. }
  689. function md5cycle(x, k) {
  690. var a = x[0],
  691. b = x[1],
  692. c = x[2],
  693. d = x[3];
  694. a += (b & c | ~b & d) + k[0] - 680876936 | 0;
  695. a = (a << 7 | a >>> 25) + b | 0;
  696. d += (a & b | ~a & c) + k[1] - 389564586 | 0;
  697. d = (d << 12 | d >>> 20) + a | 0;
  698. c += (d & a | ~d & b) + k[2] + 606105819 | 0;
  699. c = (c << 17 | c >>> 15) + d | 0;
  700. b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
  701. b = (b << 22 | b >>> 10) + c | 0;
  702. a += (b & c | ~b & d) + k[4] - 176418897 | 0;
  703. a = (a << 7 | a >>> 25) + b | 0;
  704. d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
  705. d = (d << 12 | d >>> 20) + a | 0;
  706. c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
  707. c = (c << 17 | c >>> 15) + d | 0;
  708. b += (c & d | ~c & a) + k[7] - 45705983 | 0;
  709. b = (b << 22 | b >>> 10) + c | 0;
  710. a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
  711. a = (a << 7 | a >>> 25) + b | 0;
  712. d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
  713. d = (d << 12 | d >>> 20) + a | 0;
  714. c += (d & a | ~d & b) + k[10] - 42063 | 0;
  715. c = (c << 17 | c >>> 15) + d | 0;
  716. b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
  717. b = (b << 22 | b >>> 10) + c | 0;
  718. a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
  719. a = (a << 7 | a >>> 25) + b | 0;
  720. d += (a & b | ~a & c) + k[13] - 40341101 | 0;
  721. d = (d << 12 | d >>> 20) + a | 0;
  722. c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
  723. c = (c << 17 | c >>> 15) + d | 0;
  724. b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
  725. b = (b << 22 | b >>> 10) + c | 0;
  726. a += (b & d | c & ~d) + k[1] - 165796510 | 0;
  727. a = (a << 5 | a >>> 27) + b | 0;
  728. d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
  729. d = (d << 9 | d >>> 23) + a | 0;
  730. c += (d & b | a & ~b) + k[11] + 643717713 | 0;
  731. c = (c << 14 | c >>> 18) + d | 0;
  732. b += (c & a | d & ~a) + k[0] - 373897302 | 0;
  733. b = (b << 20 | b >>> 12) + c | 0;
  734. a += (b & d | c & ~d) + k[5] - 701558691 | 0;
  735. a = (a << 5 | a >>> 27) + b | 0;
  736. d += (a & c | b & ~c) + k[10] + 38016083 | 0;
  737. d = (d << 9 | d >>> 23) + a | 0;
  738. c += (d & b | a & ~b) + k[15] - 660478335 | 0;
  739. c = (c << 14 | c >>> 18) + d | 0;
  740. b += (c & a | d & ~a) + k[4] - 405537848 | 0;
  741. b = (b << 20 | b >>> 12) + c | 0;
  742. a += (b & d | c & ~d) + k[9] + 568446438 | 0;
  743. a = (a << 5 | a >>> 27) + b | 0;
  744. d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
  745. d = (d << 9 | d >>> 23) + a | 0;
  746. c += (d & b | a & ~b) + k[3] - 187363961 | 0;
  747. c = (c << 14 | c >>> 18) + d | 0;
  748. b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
  749. b = (b << 20 | b >>> 12) + c | 0;
  750. a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
  751. a = (a << 5 | a >>> 27) + b | 0;
  752. d += (a & c | b & ~c) + k[2] - 51403784 | 0;
  753. d = (d << 9 | d >>> 23) + a | 0;
  754. c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
  755. c = (c << 14 | c >>> 18) + d | 0;
  756. b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
  757. b = (b << 20 | b >>> 12) + c | 0;
  758. a += (b ^ c ^ d) + k[5] - 378558 | 0;
  759. a = (a << 4 | a >>> 28) + b | 0;
  760. d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
  761. d = (d << 11 | d >>> 21) + a | 0;
  762. c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
  763. c = (c << 16 | c >>> 16) + d | 0;
  764. b += (c ^ d ^ a) + k[14] - 35309556 | 0;
  765. b = (b << 23 | b >>> 9) + c | 0;
  766. a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
  767. a = (a << 4 | a >>> 28) + b | 0;
  768. d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
  769. d = (d << 11 | d >>> 21) + a | 0;
  770. c += (d ^ a ^ b) + k[7] - 155497632 | 0;
  771. c = (c << 16 | c >>> 16) + d | 0;
  772. b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
  773. b = (b << 23 | b >>> 9) + c | 0;
  774. a += (b ^ c ^ d) + k[13] + 681279174 | 0;
  775. a = (a << 4 | a >>> 28) + b | 0;
  776. d += (a ^ b ^ c) + k[0] - 358537222 | 0;
  777. d = (d << 11 | d >>> 21) + a | 0;
  778. c += (d ^ a ^ b) + k[3] - 722521979 | 0;
  779. c = (c << 16 | c >>> 16) + d | 0;
  780. b += (c ^ d ^ a) + k[6] + 76029189 | 0;
  781. b = (b << 23 | b >>> 9) + c | 0;
  782. a += (b ^ c ^ d) + k[9] - 640364487 | 0;
  783. a = (a << 4 | a >>> 28) + b | 0;
  784. d += (a ^ b ^ c) + k[12] - 421815835 | 0;
  785. d = (d << 11 | d >>> 21) + a | 0;
  786. c += (d ^ a ^ b) + k[15] + 530742520 | 0;
  787. c = (c << 16 | c >>> 16) + d | 0;
  788. b += (c ^ d ^ a) + k[2] - 995338651 | 0;
  789. b = (b << 23 | b >>> 9) + c | 0;
  790. a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
  791. a = (a << 6 | a >>> 26) + b | 0;
  792. d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
  793. d = (d << 10 | d >>> 22) + a | 0;
  794. c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
  795. c = (c << 15 | c >>> 17) + d | 0;
  796. b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
  797. b = (b << 21 |b >>> 11) + c | 0;
  798. a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
  799. a = (a << 6 | a >>> 26) + b | 0;
  800. d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
  801. d = (d << 10 | d >>> 22) + a | 0;
  802. c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
  803. c = (c << 15 | c >>> 17) + d | 0;
  804. b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
  805. b = (b << 21 |b >>> 11) + c | 0;
  806. a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
  807. a = (a << 6 | a >>> 26) + b | 0;
  808. d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
  809. d = (d << 10 | d >>> 22) + a | 0;
  810. c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
  811. c = (c << 15 | c >>> 17) + d | 0;
  812. b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
  813. b = (b << 21 |b >>> 11) + c | 0;
  814. a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
  815. a = (a << 6 | a >>> 26) + b | 0;
  816. d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
  817. d = (d << 10 | d >>> 22) + a | 0;
  818. c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
  819. c = (c << 15 | c >>> 17) + d | 0;
  820. b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
  821. b = (b << 21 | b >>> 11) + c | 0;
  822. x[0] = a + x[0] | 0;
  823. x[1] = b + x[1] | 0;
  824. x[2] = c + x[2] | 0;
  825. x[3] = d + x[3] | 0;
  826. }
  827. function md5blk(s) {
  828. var md5blks = [],
  829. i; /* Andy King said do it this way. */
  830. for (i = 0; i < 64; i += 4) {
  831. md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
  832. }
  833. return md5blks;
  834. }
  835. function md5blk_array(a) {
  836. var md5blks = [],
  837. i; /* Andy King said do it this way. */
  838. for (i = 0; i < 64; i += 4) {
  839. md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
  840. }
  841. return md5blks;
  842. }
  843. function md51(s) {
  844. var n = s.length,
  845. state = [1732584193, -271733879, -1732584194, 271733878],
  846. i,
  847. length,
  848. tail,
  849. tmp,
  850. lo,
  851. hi;
  852. for (i = 64; i <= n; i += 64) {
  853. md5cycle(state, md5blk(s.substring(i - 64, i)));
  854. }
  855. s = s.substring(i - 64);
  856. length = s.length;
  857. tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  858. for (i = 0; i < length; i += 1) {
  859. tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
  860. }
  861. tail[i >> 2] |= 0x80 << ((i % 4) << 3);
  862. if (i > 55) {
  863. md5cycle(state, tail);
  864. for (i = 0; i < 16; i += 1) {
  865. tail[i] = 0;
  866. }
  867. }
  868. // Beware that the final length might not fit in 32 bits so we take care of that
  869. tmp = n * 8;
  870. tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
  871. lo = parseInt(tmp[2], 16);
  872. hi = parseInt(tmp[1], 16) || 0;
  873. tail[14] = lo;
  874. tail[15] = hi;
  875. md5cycle(state, tail);
  876. return state;
  877. }
  878. function md51_array(a) {
  879. var n = a.length,
  880. state = [1732584193, -271733879, -1732584194, 271733878],
  881. i,
  882. length,
  883. tail,
  884. tmp,
  885. lo,
  886. hi;
  887. for (i = 64; i <= n; i += 64) {
  888. md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
  889. }
  890. // Not sure if it is a bug, however IE10 will always produce a sub array of length 1
  891. // containing the last element of the parent array if the sub array specified starts
  892. // beyond the length of the parent array - weird.
  893. // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
  894. a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
  895. length = a.length;
  896. tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
  897. for (i = 0; i < length; i += 1) {
  898. tail[i >> 2] |= a[i] << ((i % 4) << 3);
  899. }
  900. tail[i >> 2] |= 0x80 << ((i % 4) << 3);
  901. if (i > 55) {
  902. md5cycle(state, tail);
  903. for (i = 0; i < 16; i += 1) {
  904. tail[i] = 0;
  905. }
  906. }
  907. // Beware that the final length might not fit in 32 bits so we take care of that
  908. tmp = n * 8;
  909. tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
  910. lo = parseInt(tmp[2], 16);
  911. hi = parseInt(tmp[1], 16) || 0;
  912. tail[14] = lo;
  913. tail[15] = hi;
  914. md5cycle(state, tail);
  915. return state;
  916. }
  917. function rhex(n) {
  918. var s = '',
  919. j;
  920. for (j = 0; j < 4; j += 1) {
  921. s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
  922. }
  923. return s;
  924. }
  925. function hex(x) {
  926. var i;
  927. for (i = 0; i < x.length; i += 1) {
  928. x[i] = rhex(x[i]);
  929. }
  930. return x.join('');
  931. }
  932. // In some cases the fast add32 function cannot be used..
  933. if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {
  934. add32 = function (x, y) {
  935. var lsw = (x & 0xFFFF) + (y & 0xFFFF),
  936. msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  937. return (msw << 16) | (lsw & 0xFFFF);
  938. };
  939. }
  940. // ---------------------------------------------------
  941. /**
  942. * ArrayBuffer slice polyfill.
  943. *
  944. * @see https://github.com/ttaubert/node-arraybuffer-slice
  945. */
  946. if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
  947. (function () {
  948. function clamp(val, length) {
  949. val = (val | 0) || 0;
  950. if (val < 0) {
  951. return Math.max(val + length, 0);
  952. }
  953. return Math.min(val, length);
  954. }
  955. ArrayBuffer.prototype.slice = function (from, to) {
  956. var length = this.byteLength,
  957. begin = clamp(from, length),
  958. end = length,
  959. num,
  960. target,
  961. targetArray,
  962. sourceArray;
  963. if (to !== undefined) {
  964. end = clamp(to, length);
  965. }
  966. if (begin > end) {
  967. return new ArrayBuffer(0);
  968. }
  969. num = end - begin;
  970. target = new ArrayBuffer(num);
  971. targetArray = new Uint8Array(target);
  972. sourceArray = new Uint8Array(this, begin, num);
  973. targetArray.set(sourceArray);
  974. return target;
  975. };
  976. })();
  977. }
  978. // ---------------------------------------------------
  979. /**
  980. * Helpers.
  981. */
  982. function toUtf8(str) {
  983. if (/[\u0080-\uFFFF]/.test(str)) {
  984. str = unescape(encodeURIComponent(str));
  985. }
  986. return str;
  987. }
  988. function utf8Str2ArrayBuffer(str, returnUInt8Array) {
  989. var length = str.length,
  990. buff = new ArrayBuffer(length),
  991. arr = new Uint8Array(buff),
  992. i;
  993. for (i = 0; i < length; i += 1) {
  994. arr[i] = str.charCodeAt(i);
  995. }
  996. return returnUInt8Array ? arr : buff;
  997. }
  998. function arrayBuffer2Utf8Str(buff) {
  999. return String.fromCharCode.apply(null, new Uint8Array(buff));
  1000. }
  1001. function concatenateArrayBuffers(first, second, returnUInt8Array) {
  1002. var result = new Uint8Array(first.byteLength + second.byteLength);
  1003. result.set(new Uint8Array(first));
  1004. result.set(new Uint8Array(second), first.byteLength);
  1005. return returnUInt8Array ? result : result.buffer;
  1006. }
  1007. function hexToBinaryString(hex) {
  1008. var bytes = [],
  1009. length = hex.length,
  1010. x;
  1011. for (x = 0; x < length - 1; x += 2) {
  1012. bytes.push(parseInt(hex.substr(x, 2), 16));
  1013. }
  1014. return String.fromCharCode.apply(String, bytes);
  1015. }
  1016. // ---------------------------------------------------
  1017. /**
  1018. * SparkMD5 OOP implementation.
  1019. *
  1020. * Use this class to perform an incremental md5, otherwise use the
  1021. * static methods instead.
  1022. */
  1023. function SparkMD5() {
  1024. // call reset to init the instance
  1025. this.reset();
  1026. }
  1027. /**
  1028. * Appends a string.
  1029. * A conversion will be applied if an utf8 string is detected.
  1030. *
  1031. * @param {String} str The string to be appended
  1032. *
  1033. * @return {SparkMD5} The instance itself
  1034. */
  1035. SparkMD5.prototype.append = function (str) {
  1036. // Converts the string to utf8 bytes if necessary
  1037. // Then append as binary
  1038. this.appendBinary(toUtf8(str));
  1039. return this;
  1040. };
  1041. /**
  1042. * Appends a binary string.
  1043. *
  1044. * @param {String} contents The binary string to be appended
  1045. *
  1046. * @return {SparkMD5} The instance itself
  1047. */
  1048. SparkMD5.prototype.appendBinary = function (contents) {
  1049. this._buff += contents;
  1050. this._length += contents.length;
  1051. var length = this._buff.length,
  1052. i;
  1053. for (i = 64; i <= length; i += 64) {
  1054. md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));
  1055. }
  1056. this._buff = this._buff.substring(i - 64);
  1057. return this;
  1058. };
  1059. /**
  1060. * Finishes the incremental computation, reseting the internal state and
  1061. * returning the result.
  1062. *
  1063. * @param {Boolean} raw True to get the raw string, false to get the hex string
  1064. *
  1065. * @return {String} The result
  1066. */
  1067. SparkMD5.prototype.end = function (raw) {
  1068. var buff = this._buff,
  1069. length = buff.length,
  1070. i,
  1071. tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  1072. ret;
  1073. for (i = 0; i < length; i += 1) {
  1074. tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
  1075. }
  1076. this._finish(tail, length);
  1077. ret = hex(this._hash);
  1078. if (raw) {
  1079. ret = hexToBinaryString(ret);
  1080. }
  1081. this.reset();
  1082. return ret;
  1083. };
  1084. /**
  1085. * Resets the internal state of the computation.
  1086. *
  1087. * @return {SparkMD5} The instance itself
  1088. */
  1089. SparkMD5.prototype.reset = function () {
  1090. this._buff = '';
  1091. this._length = 0;
  1092. this._hash = [1732584193, -271733879, -1732584194, 271733878];
  1093. return this;
  1094. };
  1095. /**
  1096. * Gets the internal state of the computation.
  1097. *
  1098. * @return {Object} The state
  1099. */
  1100. SparkMD5.prototype.getState = function () {
  1101. return {
  1102. buff: this._buff,
  1103. length: this._length,
  1104. hash: this._hash
  1105. };
  1106. };
  1107. /**
  1108. * Gets the internal state of the computation.
  1109. *
  1110. * @param {Object} state The state
  1111. *
  1112. * @return {SparkMD5} The instance itself
  1113. */
  1114. SparkMD5.prototype.setState = function (state) {
  1115. this._buff = state.buff;
  1116. this._length = state.length;
  1117. this._hash = state.hash;
  1118. return this;
  1119. };
  1120. /**
  1121. * Releases memory used by the incremental buffer and other additional
  1122. * resources. If you plan to use the instance again, use reset instead.
  1123. */
  1124. SparkMD5.prototype.destroy = function () {
  1125. delete this._hash;
  1126. delete this._buff;
  1127. delete this._length;
  1128. };
  1129. /**
  1130. * Finish the final calculation based on the tail.
  1131. *
  1132. * @param {Array} tail The tail (will be modified)
  1133. * @param {Number} length The length of the remaining buffer
  1134. */
  1135. SparkMD5.prototype._finish = function (tail, length) {
  1136. var i = length,
  1137. tmp,
  1138. lo,
  1139. hi;
  1140. tail[i >> 2] |= 0x80 << ((i % 4) << 3);
  1141. if (i > 55) {
  1142. md5cycle(this._hash, tail);
  1143. for (i = 0; i < 16; i += 1) {
  1144. tail[i] = 0;
  1145. }
  1146. }
  1147. // Do the final computation based on the tail and length
  1148. // Beware that the final length may not fit in 32 bits so we take care of that
  1149. tmp = this._length * 8;
  1150. tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
  1151. lo = parseInt(tmp[2], 16);
  1152. hi = parseInt(tmp[1], 16) || 0;
  1153. tail[14] = lo;
  1154. tail[15] = hi;
  1155. md5cycle(this._hash, tail);
  1156. };
  1157. /**
  1158. * Performs the md5 hash on a string.
  1159. * A conversion will be applied if utf8 string is detected.
  1160. *
  1161. * @param {String} str The string
  1162. * @param {Boolean} raw True to get the raw string, false to get the hex string
  1163. *
  1164. * @return {String} The result
  1165. */
  1166. SparkMD5.hash = function (str, raw) {
  1167. // Converts the string to utf8 bytes if necessary
  1168. // Then compute it using the binary function
  1169. return SparkMD5.hashBinary(toUtf8(str), raw);
  1170. };
  1171. /**
  1172. * Performs the md5 hash on a binary string.
  1173. *
  1174. * @param {String} content The binary string
  1175. * @param {Boolean} raw True to get the raw string, false to get the hex string
  1176. *
  1177. * @return {String} The result
  1178. */
  1179. SparkMD5.hashBinary = function (content, raw) {
  1180. var hash = md51(content),
  1181. ret = hex(hash);
  1182. return raw ? hexToBinaryString(ret) : ret;
  1183. };
  1184. // ---------------------------------------------------
  1185. /**
  1186. * SparkMD5 OOP implementation for array buffers.
  1187. *
  1188. * Use this class to perform an incremental md5 ONLY for array buffers.
  1189. */
  1190. SparkMD5.ArrayBuffer = function () {
  1191. // call reset to init the instance
  1192. this.reset();
  1193. };
  1194. /**
  1195. * Appends an array buffer.
  1196. *
  1197. * @param {ArrayBuffer} arr The array to be appended
  1198. *
  1199. * @return {SparkMD5.ArrayBuffer} The instance itself
  1200. */
  1201. SparkMD5.ArrayBuffer.prototype.append = function (arr) {
  1202. var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),
  1203. length = buff.length,
  1204. i;
  1205. this._length += arr.byteLength;
  1206. for (i = 64; i <= length; i += 64) {
  1207. md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));
  1208. }
  1209. this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);
  1210. return this;
  1211. };
  1212. /**
  1213. * Finishes the incremental computation, reseting the internal state and
  1214. * returning the result.
  1215. *
  1216. * @param {Boolean} raw True to get the raw string, false to get the hex string
  1217. *
  1218. * @return {String} The result
  1219. */
  1220. SparkMD5.ArrayBuffer.prototype.end = function (raw) {
  1221. var buff = this._buff,
  1222. length = buff.length,
  1223. tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  1224. i,
  1225. ret;
  1226. for (i = 0; i < length; i += 1) {
  1227. tail[i >> 2] |= buff[i] << ((i % 4) << 3);
  1228. }
  1229. this._finish(tail, length);
  1230. ret = hex(this._hash);
  1231. if (raw) {
  1232. ret = hexToBinaryString(ret);
  1233. }
  1234. this.reset();
  1235. return ret;
  1236. };
  1237. /**
  1238. * Resets the internal state of the computation.
  1239. *
  1240. * @return {SparkMD5.ArrayBuffer} The instance itself
  1241. */
  1242. SparkMD5.ArrayBuffer.prototype.reset = function () {
  1243. this._buff = new Uint8Array(0);
  1244. this._length = 0;
  1245. this._hash = [1732584193, -271733879, -1732584194, 271733878];
  1246. return this;
  1247. };
  1248. /**
  1249. * Gets the internal state of the computation.
  1250. *
  1251. * @return {Object} The state
  1252. */
  1253. SparkMD5.ArrayBuffer.prototype.getState = function () {
  1254. var state = SparkMD5.prototype.getState.call(this);
  1255. // Convert buffer to a string
  1256. state.buff = arrayBuffer2Utf8Str(state.buff);
  1257. return state;
  1258. };
  1259. /**
  1260. * Gets the internal state of the computation.
  1261. *
  1262. * @param {Object} state The state
  1263. *
  1264. * @return {SparkMD5.ArrayBuffer} The instance itself
  1265. */
  1266. SparkMD5.ArrayBuffer.prototype.setState = function (state) {
  1267. // Convert string to buffer
  1268. state.buff = utf8Str2ArrayBuffer(state.buff, true);
  1269. return SparkMD5.prototype.setState.call(this, state);
  1270. };
  1271. SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
  1272. SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
  1273. /**
  1274. * Performs the md5 hash on an array buffer.
  1275. *
  1276. * @param {ArrayBuffer} arr The array buffer
  1277. * @param {Boolean} raw True to get the raw string, false to get the hex one
  1278. *
  1279. * @return {String} The result
  1280. */
  1281. SparkMD5.ArrayBuffer.hash = function (arr, raw) {
  1282. var hash = md51_array(new Uint8Array(arr)),
  1283. ret = hex(hash);
  1284. return raw ? hexToBinaryString(ret) : ret;
  1285. };
  1286. return SparkMD5;
  1287. }));
  1288. if (typeof Array.prototype.forEach != 'function') {
  1289. Array.prototype.forEach = function(callback) {
  1290. for (var i = 0; i < this.length; i++) {
  1291. callback.apply(this, [this[i], i, this]);
  1292. }
  1293. };
  1294. }
  1295. /* webim API definitions
  1296. */
  1297. var msgCache = {};
  1298. var webim = {
  1299. // namespace object webim
  1300. /* function init
  1301. * sdk登录
  1302. * params:
  1303. * loginInfo - Object, 登录身份相关参数集合,详见下面
  1304. * {
  1305. * sdkAppID - String, 用户标识接入SDK的应用ID,必填
  1306. * accountType - int, 账号类型,必填
  1307. * identifier - String, 用户帐号,必须是字符串类型,必填
  1308. * identifierNick - String, 用户昵称,选填
  1309. * userSig - String, 鉴权Token,必须是字符串类型,必填
  1310. * }
  1311. * listeners - Object, 事件回调函数集合, 详见下面
  1312. * {
  1313. * onConnNotify - function(connInfo), 用于收到连接状态相关通知的回调函数,目前未使用
  1314. * jsonpCallback -function(rspData),//IE9(含)以下浏览器用到的jsonp回调函数
  1315. * onMsgNotify - function(newMsgList), 用于收到消息通知的回调函数,
  1316. * newMsgList为新消息数组,格式为[Msg对象]
  1317. * 使用方有两种处理回调: 1)处理newMsgList中的增量消息,2)直接访问webim.MsgStore获取最新的消息
  1318. * onGroupInfoChangeNotify - function(groupInfo), 用于监听群组资料变更的回调函数,
  1319. * groupInfo为新的群组资料信息
  1320. * onGroupSystemNotifys - Object, 用于监听(多终端同步)群系统消息的回调函数对象
  1321. *
  1322. * }
  1323. * options - Object, 其它选项, 目前未使用
  1324. * return:
  1325. * (无)
  1326. */
  1327. login: function(loginInfo, listeners, options) {},
  1328. /* function syncMsgs
  1329. * 拉取最新C2C消息
  1330. * 一般不需要使用方直接调用, SDK底层会自动同步最新消息并通知使用方, 一种有用的调用场景是用户手动触发刷新消息
  1331. * params:
  1332. * cbOk - function(msgList)类型, 当同步消息成功时的回调函数, msgList为新消息数组,格式为[Msg对象],
  1333. * 如果此参数为null或undefined则同步消息成功后会像自动同步那样回调cbNotify
  1334. * cbErr - function(err)类型, 当同步消息失败时的回调函数, err为错误对象
  1335. * return:
  1336. * (无)
  1337. */
  1338. syncMsgs: function(cbOk, cbErr) {},
  1339. /* function getC2CHistoryMsgs
  1340. * 拉取C2C漫游消息
  1341. * params:
  1342. * options - 请求参数
  1343. * cbOk - function(msgList)类型, 成功时的回调函数, msgList为消息数组,格式为[Msg对象],
  1344. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1345. * return:
  1346. * (无)
  1347. */
  1348. getC2CHistoryMsgs: function(options, cbOk, cbErr) {},
  1349. /* function syncGroupMsgs
  1350. * 拉取群漫游消息
  1351. * params:
  1352. * options - 请求参数
  1353. * cbOk - function(msgList)类型, 成功时的回调函数, msgList为消息数组,格式为[Msg对象],
  1354. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1355. * return:
  1356. * (无)
  1357. */
  1358. syncGroupMsgs: function(options, cbOk, cbErr) {},
  1359. /* function sendMsg
  1360. * 发送一条消息
  1361. * params:
  1362. * msg - webim.Msg类型, 要发送的消息对象
  1363. * cbOk - function()类型, 当发送消息成功时的回调函数
  1364. * cbErr - function(err)类型, 当发送消息失败时的回调函数, err为错误对象
  1365. * return:
  1366. * (无)
  1367. */
  1368. sendMsg: function(msg, cbOk, cbErr) {},
  1369. /* function logout
  1370. * sdk登出
  1371. * params:
  1372. * cbOk - function()类型, 成功时回调函数
  1373. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1374. * return:
  1375. * (无)
  1376. */
  1377. logout: function(cbOk, cbErr) {},
  1378. /* function setAutoRead
  1379. * 设置会话自动已读上报标志
  1380. * params:
  1381. * selSess - webim.Session类型, 当前会话
  1382. * isOn - boolean, 将selSess的自动已读消息标志改为isOn,同时是否上报当前会话已读消息
  1383. * isResetAll - boolean,是否重置所有会话的自动已读标志
  1384. * return:
  1385. * (无)
  1386. */
  1387. setAutoRead: function(selSess, isOn, isResetAll) {},
  1388. /* function getProfilePortrait
  1389. * 拉取资料(搜索用户)
  1390. * params:
  1391. * cbOk - function()类型, 成功时回调函数
  1392. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1393. * return:
  1394. * (无)
  1395. */
  1396. getProfilePortrait: function(options, cbOk, cbErr) {},
  1397. /* function setProfilePortrait
  1398. * 设置个人资料
  1399. * params:
  1400. * cbOk - function()类型, 成功时回调函数
  1401. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1402. * return:
  1403. * (无)
  1404. */
  1405. setProfilePortrait: function(options, cbOk, cbErr) {},
  1406. /* function applyAddFriend
  1407. * 申请添加好友
  1408. * params:
  1409. * cbOk - function()类型, 成功时回调函数
  1410. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1411. * return:
  1412. * (无)
  1413. */
  1414. applyAddFriend: function(options, cbOk, cbErr) {},
  1415. /* function getPendency
  1416. * 拉取好友申请
  1417. * params:
  1418. * cbOk - function()类型, 成功时回调函数
  1419. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1420. * return:
  1421. * (无)
  1422. */
  1423. getPendency: function(options, cbOk, cbErr) {},
  1424. /* function deletePendency
  1425. * 删除好友申请
  1426. * params:
  1427. * cbOk - function()类型, 成功时回调函数
  1428. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1429. * return:
  1430. * (无)
  1431. */
  1432. deletePendency: function(options, cbOk, cbErr) {},
  1433. /* function responseFriend
  1434. * 响应好友申请
  1435. * params:
  1436. * cbOk - function()类型, 成功时回调函数
  1437. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1438. * return:
  1439. * (无)
  1440. */
  1441. responseFriend: function(options, cbOk, cbErr) {},
  1442. /* function getAllFriend
  1443. * 拉取我的好友
  1444. * params:
  1445. * cbOk - function()类型, 成功时回调函数
  1446. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1447. * return:
  1448. * (无)
  1449. */
  1450. getAllFriend: function(options, cbOk, cbErr) {},
  1451. /* function deleteFriend
  1452. * 删除好友
  1453. * params:
  1454. * cbOk - function()类型, 成功时回调函数
  1455. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1456. * return:
  1457. * (无)
  1458. */
  1459. deleteFriend: function(options, cbOk, cbErr) {},
  1460. /* function addBlackList
  1461. * 增加黑名单
  1462. * params:
  1463. * cbOk - function()类型, 成功时回调函数
  1464. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1465. * return:
  1466. * (无)
  1467. */
  1468. addBlackList: function(options, cbOk, cbErr) {},
  1469. /* function getBlackList
  1470. * 删除黑名单
  1471. * params:
  1472. * cbOk - function()类型, 成功时回调函数
  1473. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1474. * return:
  1475. * (无)
  1476. */
  1477. getBlackList: function(options, cbOk, cbErr) {},
  1478. /* function deleteBlackList
  1479. * 我的黑名单
  1480. * params:
  1481. * cbOk - function()类型, 成功时回调函数
  1482. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1483. * return:
  1484. * (无)
  1485. */
  1486. deleteBlackList: function(options, cbOk, cbErr) {},
  1487. /* function uploadPic
  1488. * 上传图片
  1489. * params:
  1490. * options - 请求参数,详见api文档
  1491. * cbOk - function()类型, 成功时回调函数
  1492. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1493. * return:
  1494. * (无)
  1495. */
  1496. uploadPic: function(options, cbOk, cbErr) {},
  1497. /* function createGroup
  1498. * 创建群
  1499. * params:
  1500. * options - 请求参数,详见api文档
  1501. * cbOk - function()类型, 成功时回调函数
  1502. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1503. * return:
  1504. * (无)
  1505. */
  1506. createGroup: function(options, cbOk, cbErr) {},
  1507. /* function applyJoinGroup
  1508. * 申请加群
  1509. * params:
  1510. * options - 请求参数,详见api文档
  1511. * cbOk - function()类型, 成功时回调函数
  1512. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1513. * return:
  1514. * (无)
  1515. */
  1516. applyJoinGroup: function(options, cbOk, cbErr) {},
  1517. /* function handleApplyJoinGroup
  1518. * 处理申请加群(同意或拒绝)
  1519. * params:
  1520. * options - 请求参数,详见api文档
  1521. * cbOk - function()类型, 成功时回调函数
  1522. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1523. * return:
  1524. * (无)
  1525. */
  1526. handleApplyJoinGroup: function(options, cbOk, cbErr) {},
  1527. /* function deleteApplyJoinGroupPendency
  1528. * 删除加群申请
  1529. * params:
  1530. * options - 请求参数,详见api文档
  1531. * cbOk - function()类型, 成功时回调函数
  1532. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1533. * return:
  1534. * (无)
  1535. */
  1536. deleteApplyJoinGroupPendency: function(options, cbOk, cbErr) {},
  1537. /* function quitGroup
  1538. * 主动退群
  1539. * params:
  1540. * options - 请求参数,详见api文档
  1541. * cbOk - function()类型, 成功时回调函数
  1542. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1543. * return:
  1544. * (无)
  1545. */
  1546. quitGroup: function(options, cbOk, cbErr) {},
  1547. /* function getGroupPublicInfo
  1548. * 读取群公开资料-高级接口
  1549. * params:
  1550. * options - 请求参数,详见api文档
  1551. * cbOk - function()类型, 成功时回调函数
  1552. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1553. * return:
  1554. * (无)
  1555. */
  1556. getGroupPublicInfo: function(options, cbOk, cbErr) {},
  1557. /* function getGroupInfo
  1558. * 读取群详细资料-高级接口
  1559. * params:
  1560. * options - 请求参数,详见api文档
  1561. * cbOk - function()类型, 成功时回调函数
  1562. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1563. * return:
  1564. * (无)
  1565. */
  1566. getGroupInfo: function(options, cbOk, cbErr) {},
  1567. /* function modifyGroupBaseInfo
  1568. * 修改群基本资料
  1569. * params:
  1570. * options - 请求参数,详见api文档
  1571. * cbOk - function()类型, 成功时回调函数
  1572. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1573. * return:
  1574. * (无)
  1575. */
  1576. modifyGroupBaseInfo: function(options, cbOk, cbErr) {},
  1577. /* function destroyGroup
  1578. * 解散群
  1579. * params:
  1580. * options - 请求参数,详见api文档
  1581. * cbOk - function()类型, 成功时回调函数
  1582. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1583. * return:
  1584. * (无)
  1585. */
  1586. destroyGroup: function(options, cbOk, cbErr) {},
  1587. /* function getJoinedGroupListHigh
  1588. * 获取我的群组-高级接口
  1589. * params:
  1590. * options - 请求参数,详见api文档
  1591. * cbOk - function()类型, 成功时回调函数
  1592. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1593. * return:
  1594. * (无)
  1595. */
  1596. getJoinedGroupListHigh: function(options, cbOk, cbErr) {},
  1597. /* function getGroupMemberInfo
  1598. * 获取群组成员列表
  1599. * params:
  1600. * options - 请求参数,详见api文档
  1601. * cbOk - function()类型, 成功时回调函数
  1602. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1603. * return:
  1604. * (无)
  1605. */
  1606. getGroupMemberInfo: function(options, cbOk, cbErr) {},
  1607. /* function addGroupMember
  1608. * 邀请好友加群
  1609. * params:
  1610. * options - 请求参数,详见api文档
  1611. * cbOk - function()类型, 成功时回调函数
  1612. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1613. * return:
  1614. * (无)
  1615. */
  1616. addGroupMember: function(options, cbOk, cbErr) {},
  1617. /* function modifyGroupMember
  1618. * 修改群成员资料(角色或者群消息提类型示)
  1619. * params:
  1620. * options - 请求参数,详见api文档
  1621. * cbOk - function()类型, 成功时回调函数
  1622. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1623. * return:
  1624. * (无)
  1625. */
  1626. modifyGroupMember: function(options, cbOk, cbErr) {},
  1627. /* function forbidSendMsg
  1628. * 设置群成员禁言时间
  1629. * params:
  1630. * options - 请求参数,详见api文档
  1631. * cbOk - function()类型, 成功时回调函数
  1632. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1633. * return:
  1634. * (无)
  1635. */
  1636. forbidSendMsg: function(options, cbOk, cbErr) {},
  1637. /* function deleteGroupMember
  1638. * 删除群成员
  1639. * params:
  1640. * options - 请求参数,详见api文档
  1641. * cbOk - function()类型, 成功时回调函数
  1642. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1643. * return:
  1644. * (无)
  1645. */
  1646. deleteGroupMember: function(options, cbOk, cbErr) {},
  1647. /* function getPendencyGroup
  1648. * 获取群组未决列表
  1649. * params:
  1650. * options - 请求参数,详见api文档
  1651. * cbOk - function()类型, 成功时回调函数
  1652. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1653. * return:
  1654. * (无)
  1655. */
  1656. getPendencyGroup: function(options, cbOk, cbErr) {},
  1657. /* function getPendencyReport
  1658. * 好友未决已读上报
  1659. * params:
  1660. * options - 请求参数,详见api文档
  1661. * cbOk - function()类型, 成功时回调函数
  1662. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1663. * return:
  1664. * (无)
  1665. */
  1666. getPendencyReport: function(options, cbOk, cbErr) {},
  1667. /* function getPendencyGroupRead
  1668. * 群组未决已读上报
  1669. * params:
  1670. * options - 请求参数,详见api文档
  1671. * cbOk - function()类型, 成功时回调函数
  1672. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1673. * return:
  1674. * (无)
  1675. */
  1676. getPendencyGroupRead: function(options, cbOk, cbErr) {},
  1677. /* function sendCustomGroupNotify
  1678. * 发送自定义群通知
  1679. * params:
  1680. * options - 请求参数,详见api文档
  1681. * cbOk - function()类型, 成功时回调函数
  1682. * cbErr - function(err)类型, 失败时回调函数, err为错误对象
  1683. * return:
  1684. * (无)
  1685. */
  1686. sendCustomGroupNotify: function(options, cbOk, cbErr) {},
  1687. /* class webim.Msg
  1688. * 一条消息的描述类, 消息发送、接收的API中都会涉及此类型的对象
  1689. * properties:
  1690. * sess - Session object-ref, 消息所属的会话(e.g:我与好友A的C2C会话,我与群组G的GROUP会话)
  1691. * isSend - Boolean, true表示是我发出消息, false表示是发给我的消息)
  1692. * seq - Integer, 消息序列号, 用于判断消息是否同一条
  1693. * random - Integer, 消息随机数,用于判断消息是否同一条
  1694. * time - Integer, 消息时间戳, 为unix timestamp
  1695. * fromAccount -String, 消息发送者帐号
  1696. * subType -Integer, 消息子类型,c2c消息时,0-表示普通消息;群消息时,0-普通消息,1-点赞消息,2-提示消息
  1697. * fromAccountNick -String, 消息发送者昵称
  1698. * elems - Array of webim.Msg.Elem, 描述消息内容的元素列表
  1699. * constructor:
  1700. * Msg(sess, isSend, seq,random time,fromAccount) - 构造函数, 参数定义同上面properties中定义
  1701. * methods:
  1702. * addText(text) - 向elems中添加一个TEXT元素
  1703. * addFace(face) - 向elems中添加一个FACE元素
  1704. * toHtml() - 转成可展示的html String
  1705. *addFace
  1706. * sub-class webim.Msg.Elem
  1707. * 消息中一个组成元素的描述类, 一条消息的内容被抽象描述为N个元素的有序列表
  1708. * properties:
  1709. * type - 元素类型, 目前有TEXT(文本)、FACE(表情)、IMAGE(图片)等
  1710. * content- 元素内容体, 当TEXT时为String, 当PIC时为UrlString
  1711. * constructor:
  1712. * Elem(type, content) - 构造函数, 参数定义同上面properties中定义
  1713. *
  1714. * sub-class webim.Msg.Elem.TextElem
  1715. * 文本
  1716. * properties:
  1717. * text - String 内容
  1718. * constructor:
  1719. * TextElem(text) - 构造函数, 参数定义同上面properties中定义
  1720. *
  1721. * sub-class webim.Msg.Elem.FaceElem
  1722. * 表情
  1723. * properties:
  1724. * index - Integer 表情索引, 用户自定义
  1725. * data - String 额外数据,用户自定义
  1726. * constructor:
  1727. * FaceElem(index,data) - 构造函数, 参数定义同上面properties中定义
  1728. *
  1729. *
  1730. */
  1731. Msg: function(sess, isSend, seq, random, time, fromAccount, subType, fromAccountNick, fromAccountHeadurl) {
  1732. /*Class constructor*/
  1733. },
  1734. /* singleton object MsgStore
  1735. * webim.MsgStore是消息数据的Model对象(参考MVC概念), 它提供接口访问当前存储的会话和消息数据
  1736. * 下面说明下会话数据类型: Session
  1737. *
  1738. * class Session
  1739. * 一个Session对象描述一个会话,会话可简单理解为最近会话列表的一个条目,它由两个字段唯一标识:
  1740. * type - String, 会话类型(如"C2C", "GROUP", ...)
  1741. * id - String, 会话ID(如C2C类型中为对方帐号,"C2C"时为好友ID,"GROUP"时为群ID)
  1742. * properties:
  1743. * (Session对象未对外暴露任何属性字段, 所有访问通过下面的getter方法进行)
  1744. * methods:
  1745. * type() - String, 返回会话类型,"C2C"表示与好友私聊,"GROUP"表示群聊
  1746. * id() - String, 返回会话ID
  1747. * name() - String, 返回会话标题(如C2C类型中为对方的昵称,暂不支持)
  1748. * icon() - String, 返回会话图标(对C2C类型中为对方的头像URL,暂不支持)
  1749. * unread() - Integer, 返回会话未读条数
  1750. * time() - Integer, 返回会话最后活跃时间, 为unix timestamp
  1751. * curMaxMsgSeq() - Integer, 返回会话最大消息序列号
  1752. * msgCount() - Integer, 返回会话中所有消息条数
  1753. * msg(index) - webim.Msg, 返回会话中第index条消息
  1754. */
  1755. MsgStore: {
  1756. /* function sessMap
  1757. * 获取所有会话
  1758. * return:
  1759. * 所有会话对象
  1760. */
  1761. sessMap: function() {
  1762. return {
  1763. /*Object*/
  1764. };
  1765. },
  1766. /* function sessCount
  1767. * 获取当前会话的个数
  1768. * return:
  1769. * Integer, 会话个数
  1770. */
  1771. sessCount: function() {
  1772. return 0;
  1773. },
  1774. /* function sessByTypeId
  1775. * 根据会话类型和会话ID取得相应会话
  1776. * params:
  1777. * type - String, 会话类型(如"C2C", "GROUP", ...)
  1778. * id - String, 会话ID(如对方ID)
  1779. * return:
  1780. * Session, 会话对象(说明见上面)
  1781. */
  1782. sessByTypeId: function(type, id) {
  1783. return {
  1784. /*Session Object*/
  1785. };
  1786. },
  1787. /* function delSessByTypeId
  1788. * 根据会话类型和会话ID删除相应会话
  1789. * params:
  1790. * type - String, 会话类型(如"C2C", "GROUP", ...)
  1791. * id - String, 会话ID(如对方ID)
  1792. * return:
  1793. * Boolean, 布尔类型
  1794. */
  1795. delSessByTypeId: function(type, id) {
  1796. return true;
  1797. },
  1798. /* function resetCookieAndSyncFlag
  1799. * 重置上一次读取新c2c消息Cookie和是否继续拉取标记
  1800. * return:
  1801. *
  1802. */
  1803. resetCookieAndSyncFlag: function() {},
  1804. downloadMap: {}
  1805. }
  1806. };
  1807. /* webim API implementation
  1808. */
  1809. (function(webim) {
  1810. //sdk版本
  1811. var SDK = {
  1812. VERSION: '1.7.2', //sdk版本号
  1813. APPID: '537048168', //web im sdk 版本 APPID
  1814. PLAATFORM: '10' //发送请求时判断其是来自web端的请求
  1815. };
  1816. //是否启用正式环境,默认启用
  1817. var isAccessFormaEnvironment = true;
  1818. // var isAccessFormaEnvironment = false;
  1819. //后台接口主机
  1820. var SRV_HOST = {
  1821. FORMAL: {
  1822. COMMON: 'https://webim.tim.qq.com',
  1823. PIC: 'https://pic.tim.qq.com'
  1824. },
  1825. TEST: {
  1826. COMMON: 'https://test.tim.qq.com',
  1827. PIC: 'https://pic.tim.qq.com'
  1828. }
  1829. };
  1830. //浏览器版本信息
  1831. var BROWSER_INFO = {};
  1832. //是否为ie9(含)以下
  1833. var lowerBR = false;
  1834. //服务名称
  1835. var SRV_NAME = {
  1836. OPEN_IM: 'openim', //私聊(拉取未读c2c消息,长轮询,c2c消息已读上报等)服务名
  1837. GROUP: 'group_open_http_svc', //群组管理(拉取群消息,创建群,群成员管理,群消息已读上报等)服务名
  1838. FRIEND: 'sns', //关系链管理(好友管理,黑名单管理等)服务名
  1839. PROFILE: 'profile', //资料管理(查询,设置个人资料等)服务名
  1840. RECENT_CONTACT: 'recentcontact', //最近联系人服务名
  1841. PIC: 'openpic', //图片(或文件)服务名
  1842. BIG_GROUP: 'group_open_http_noauth_svc', //直播大群 群组管理(申请加大群)服务名
  1843. BIG_GROUP_LONG_POLLING: 'group_open_long_polling_http_noauth_svc', //直播大群 长轮询(拉取消息等)服务名
  1844. IM_OPEN_STAT: 'imopenstat', //质量上报,统计接口错误率
  1845. DEL_CHAT: 'recentcontact', //删除会话
  1846. WEB_IM: 'webim'
  1847. };
  1848. //不同服务对应的版本号
  1849. var SRV_NAME_VER = {
  1850. openim: 'v4',
  1851. group_open_http_svc: 'v4',
  1852. sns: 'v4',
  1853. profile: 'v4',
  1854. recentcontact: 'v4',
  1855. openpic: 'v4',
  1856. group_open_http_noauth_svc: 'v1',
  1857. group_open_long_polling_http_noauth_svc: 'v1',
  1858. imopenstat: 'v4',
  1859. webim: 'v3'
  1860. };
  1861. //不同的命令名对应的上报类型ID,用于接口质量上报
  1862. var CMD_EVENT_ID_MAP = {
  1863. login: 1, //登录
  1864. pic_up: 3, //上传图片
  1865. apply_join_group: 9, //申请加入群组
  1866. create_group: 10, //创建群组
  1867. longpolling: 18, //普通长轮询
  1868. send_group_msg: 19, //群聊
  1869. sendmsg: 20 //私聊
  1870. };
  1871. //聊天类型
  1872. var SESSION_TYPE = {
  1873. C2C: 'C2C', //私聊
  1874. GROUP: 'GROUP' //群聊
  1875. };
  1876. //最近联系人类型
  1877. var RECENT_CONTACT_TYPE = {
  1878. C2C: 1, //好友
  1879. GROUP: 2 //群
  1880. };
  1881. //消息最大长度(字节)
  1882. var MSG_MAX_LENGTH = {
  1883. C2C: 12000, //私聊消息
  1884. GROUP: 8898 //群聊
  1885. };
  1886. //后台接口返回类型
  1887. var ACTION_STATUS = {
  1888. OK: 'OK', //成功
  1889. FAIL: 'FAIL' //失败
  1890. };
  1891. var ERROR_CODE_CUSTOM = 99999; //自定义后台接口返回错误码
  1892. //消息元素类型
  1893. var MSG_ELEMENT_TYPE = {
  1894. TEXT: 'TIMTextElem', //文本
  1895. FACE: 'TIMFaceElem', //表情
  1896. IMAGE: 'TIMImageElem', //图片
  1897. CUSTOM: 'TIMCustomElem', //自定义
  1898. SOUND: 'TIMSoundElem', //语音,只支持显示
  1899. FILE: 'TIMFileElem', //文件,只支持显示
  1900. LOCATION: 'TIMLocationElem', //地理位置
  1901. GROUP_TIP: 'TIMGroupTipElem' //群提示消息,只支持显示
  1902. };
  1903. //图片类型
  1904. var IMAGE_TYPE = {
  1905. ORIGIN: 1, //原图
  1906. LARGE: 2, //缩略大图
  1907. SMALL: 3 //缩略小图
  1908. };
  1909. //图片格式
  1910. var IMAGE_FORMAT = {
  1911. JPG: 0x1,
  1912. JPEG: 0x1,
  1913. GIF: 0x2,
  1914. PNG: 0x3,
  1915. BMP: 0x4,
  1916. UNKNOWN: 0xff
  1917. };
  1918. //上传资源包类型
  1919. var UPLOAD_RES_PKG_FLAG = {
  1920. RAW_DATA: 0, //原始数据
  1921. BASE64_DATA: 1 //base64编码数据
  1922. };
  1923. //下载文件配置
  1924. var DOWNLOAD_FILE = {
  1925. BUSSINESS_ID: '10001', //下载文件业务ID
  1926. AUTH_KEY: '617574686b6579', //下载文件authkey
  1927. SERVER_IP: '182.140.186.147' //下载文件服务器IP
  1928. };
  1929. //下载文件类型
  1930. var DOWNLOAD_FILE_TYPE = {
  1931. SOUND: 2106, //语音
  1932. FILE: 2107 //普通文件
  1933. };
  1934. //上传资源类型
  1935. var UPLOAD_RES_TYPE = {
  1936. IMAGE: 1, //图片
  1937. FILE: 2, //文件
  1938. SHORT_VIDEO: 3, //短视频
  1939. SOUND: 4 //语音,PTT
  1940. };
  1941. //版本号,用于上传图片或文件接口
  1942. var VERSION_INFO = {
  1943. APP_VERSION: '2.1', //应用版本号
  1944. SERVER_VERSION: 1 //服务端版本号
  1945. };
  1946. //长轮询消息类型
  1947. var LONG_POLLINNG_EVENT_TYPE = {
  1948. C2C: 1, //新的c2c消息通知
  1949. GROUP_COMMON: 3, //新的群普通消息
  1950. GROUP_TIP: 4, //新的群提示消息
  1951. GROUP_SYSTEM: 5, //新的群系统消息
  1952. GROUP_TIP2: 6, //新的群提示消息2
  1953. FRIEND_NOTICE: 7, //好友系统通知
  1954. PROFILE_NOTICE: 8, //资料系统通知
  1955. C2C_COMMON: 9, //新的C2C消息
  1956. C2C_EVENT: 10
  1957. };
  1958. //c2c消息子类型
  1959. var C2C_MSG_SUB_TYPE = {
  1960. COMMON: 0 //普通消息
  1961. };
  1962. //c2c消息子类型
  1963. var C2C_EVENT_SUB_TYPE = {
  1964. READED: 92, //已读消息同步
  1965. KICKEDOUT: 96
  1966. };
  1967. //群消息子类型
  1968. var GROUP_MSG_SUB_TYPE = {
  1969. COMMON: 0, //普通消息
  1970. LOVEMSG: 1, //点赞消息
  1971. TIP: 2, //提示消息
  1972. REDPACKET: 3 //红包消息
  1973. };
  1974. //群消息优先级类型
  1975. var GROUP_MSG_PRIORITY_TYPE = {
  1976. REDPACKET: 1, //红包消息
  1977. COMMON: 2, //普通消息
  1978. LOVEMSG: 3 //点赞消息
  1979. };
  1980. //群提示消息类型
  1981. var GROUP_TIP_TYPE = {
  1982. JOIN: 1, //加入群组
  1983. QUIT: 2, //退出群组
  1984. KICK: 3, //被踢出群组
  1985. SET_ADMIN: 4, //被设置为管理员
  1986. CANCEL_ADMIN: 5, //被取消管理员
  1987. MODIFY_GROUP_INFO: 6, //修改群资料
  1988. MODIFY_MEMBER_INFO: 7 //修改群成员信息
  1989. };
  1990. //群提示消息-群资料变更类型
  1991. var GROUP_TIP_MODIFY_GROUP_INFO_TYPE = {
  1992. FACE_URL: 1, //修改群头像URL
  1993. NAME: 2, //修改群名称
  1994. OWNER: 3, //修改群主
  1995. NOTIFICATION: 4, //修改群公告
  1996. INTRODUCTION: 5 //修改群简介
  1997. };
  1998. //群系统消息类型
  1999. var GROUP_SYSTEM_TYPE = {
  2000. JOIN_GROUP_REQUEST: 1, //申请加群请求(只有管理员会收到)
  2001. JOIN_GROUP_ACCEPT: 2, //申请加群被同意(只有申请人能够收到)
  2002. JOIN_GROUP_REFUSE: 3, //申请加群被拒绝(只有申请人能够收到)
  2003. KICK: 4, //被管理员踢出群(只有被踢者接收到)
  2004. DESTORY: 5, //群被解散(全员接收)
  2005. CREATE: 6, //创建群(创建者接收, 不展示)
  2006. INVITED_JOIN_GROUP_REQUEST: 7, //邀请加群(被邀请者接收)
  2007. QUIT: 8, //主动退群(主动退出者接收, 不展示)
  2008. SET_ADMIN: 9, //设置管理员(被设置者接收)
  2009. CANCEL_ADMIN: 10, //取消管理员(被取消者接收)
  2010. REVOKE: 11, //群已被回收(全员接收, 不展示)
  2011. READED: 15, //群消息已读同步
  2012. CUSTOM: 255, //用户自定义通知(默认全员接收)
  2013. INVITED_JOIN_GROUP_REQUEST_AGREE: 12 //邀请加群(被邀请者需同意)
  2014. };
  2015. //好友系统通知子类型
  2016. var FRIEND_NOTICE_TYPE = {
  2017. FRIEND_ADD: 1, //好友表增加
  2018. FRIEND_DELETE: 2, //好友表删除
  2019. PENDENCY_ADD: 3, //未决增加
  2020. PENDENCY_DELETE: 4, //未决删除
  2021. BLACK_LIST_ADD: 5, //黑名单增加
  2022. BLACK_LIST_DELETE: 6, //黑名单删除
  2023. PENDENCY_REPORT: 7, //未决已读上报
  2024. FRIEND_UPDATE: 8 //好友数据更新
  2025. };
  2026. //资料系统通知子类型
  2027. var PROFILE_NOTICE_TYPE = {
  2028. PROFILE_MODIFY: 1 //资料修改
  2029. };
  2030. //腾讯登录服务错误码(用于托管模式)
  2031. var TLS_ERROR_CODE = {
  2032. OK: 0, //成功
  2033. SIGNATURE_EXPIRATION: 11 //用户身份凭证过期
  2034. };
  2035. //长轮询连接状态
  2036. var CONNECTION_STATUS = {
  2037. INIT: -1, //初始化
  2038. ON: 0, //连接正常
  2039. RECONNECT: 1, //连接恢复正常
  2040. OFF: 9999 //连接已断开,可能是用户网络问题,或者长轮询接口报错引起的
  2041. };
  2042. var UPLOAD_PIC_BUSSINESS_TYPE = {
  2043. //图片业务类型
  2044. GROUP_MSG: 1, //私聊图片
  2045. C2C_MSG: 2, //群聊图片
  2046. USER_HEAD: 3, //用户头像
  2047. GROUP_HEAD: 4 //群头像
  2048. };
  2049. var FRIEND_WRITE_MSG_ACTION = {
  2050. //好友输入消息状态
  2051. ING: 14, //正在输入
  2052. STOP: 15 //停止输入
  2053. };
  2054. //ajax默认超时时间,单位:毫秒
  2055. var ajaxDefaultTimeOut = 15000;
  2056. //大群长轮询接口返回正常时,延时一定时间再发起下一次请求
  2057. var OK_DELAY_TIME = 1000;
  2058. //大群长轮询接口发生错误时,延时一定时间再发起下一次请求
  2059. var ERROR_DELAY_TIME = 5000;
  2060. //群提示消息最多显示人数
  2061. var GROUP_TIP_MAX_USER_COUNT = 10;
  2062. //长轮询连接状态
  2063. var curLongPollingStatus = CONNECTION_STATUS.INIT;
  2064. //当长轮询连接断开后,是否已经回调过
  2065. var longPollingOffCallbackFlag = false;
  2066. //当前长轮询返回错误次数
  2067. var curLongPollingRetErrorCount = 0;
  2068. //长轮询默认超时时间,单位:毫秒
  2069. var longPollingDefaultTimeOut = 60000;
  2070. //长轮询返回错误次数达到一定值后,发起新的长轮询请求间隔时间,单位:毫秒
  2071. var longPollingIntervalTime = 5000;
  2072. //没有新消息时,长轮询返回60008错误码是正常的
  2073. var longPollingTimeOutErrorCode = 60008;
  2074. //多实例登录被kick的错误码
  2075. var longPollingKickedErrorCode = 91101;
  2076. var longPollingPackageTooLargeErrorCode = 10018;
  2077. var LongPollingId = null;
  2078. //当前大群长轮询返回错误次数
  2079. var curBigGroupLongPollingRetErrorCount = 0;
  2080. //最大允许长轮询返回错误次数
  2081. var LONG_POLLING_MAX_RET_ERROR_COUNT = 10;
  2082. //上传重试累计
  2083. var Upload_Retry_Times = 0;
  2084. //最大上传重试
  2085. var Upload_Retry_Max_Times = 20;
  2086. //ie7/8/9采用jsonp方法解决ajax跨域限制
  2087. var jsonpRequestId = 0; //jsonp请求id
  2088. //最新jsonp请求返回的json数据
  2089. var jsonpLastRspData = null;
  2090. //兼容ie7/8/9,jsonp回调函数
  2091. var jsonpCallback = null;
  2092. var uploadResultIframeId = 0; //用于上传图片的iframe id
  2093. var ipList = []; //文件下载地址
  2094. var authkey = null; //文件下载票据
  2095. var expireTime = null; //文件下载票据超时时间
  2096. //错误码
  2097. var ERROR = {};
  2098. //当前登录用户
  2099. var ctx = {
  2100. sdkAppID: null,
  2101. appIDAt3rd: null,
  2102. accountType: null,
  2103. identifier: null,
  2104. tinyid: null,
  2105. identifierNick: null,
  2106. userSig: null,
  2107. a2: null,
  2108. contentType: 'json',
  2109. apn: 1
  2110. };
  2111. var opt = {};
  2112. var xmlHttpObjSeq = 0; //ajax请求id
  2113. var xmlHttpObjMap = {}; //发起的ajax请求
  2114. var curSeq = 0; //消息seq
  2115. var tempC2CMsgList = []; //新c2c消息临时缓存
  2116. var tempC2CHistoryMsgList = []; //漫游c2c消息临时缓存
  2117. var maxApiReportItemCount = 20; //一次最多上报条数
  2118. var apiReportItems = []; //暂存api接口质量上报数据
  2119. var onLongPullingNotify = null;
  2120. var Resources = {
  2121. downloadMap: {}
  2122. };
  2123. //表情标识字符和索引映射关系对象,用户可以自定义
  2124. var emotionDataIndexs = {
  2125. '[惊讶]': 0,
  2126. '[撇嘴]': 1,
  2127. '[色]': 2,
  2128. '[发呆]': 3,
  2129. '[得意]': 4,
  2130. '[流泪]': 5,
  2131. '[害羞]': 6,
  2132. '[闭嘴]': 7,
  2133. '[睡]': 8,
  2134. '[大哭]': 9,
  2135. '[尴尬]': 10,
  2136. '[发怒]': 11,
  2137. '[调皮]': 12,
  2138. '[龇牙]': 13,
  2139. '[微笑]': 14,
  2140. '[难过]': 15,
  2141. '[酷]': 16,
  2142. '[冷汗]': 17,
  2143. '[抓狂]': 18,
  2144. '[吐]': 19,
  2145. '[偷笑]': 20,
  2146. '[可爱]': 21,
  2147. '[白眼]': 22,
  2148. '[傲慢]': 23,
  2149. '[饿]': 24,
  2150. '[困]': 25,
  2151. '[惊恐]': 26,
  2152. '[流汗]': 27,
  2153. '[憨笑]': 28,
  2154. '[大兵]': 29,
  2155. '[奋斗]': 30,
  2156. '[咒骂]': 31,
  2157. '[疑问]': 32,
  2158. '[嘘]': 33,
  2159. '[晕]': 34
  2160. };
  2161. //表情对象,用户可以自定义
  2162. var emotions = {
  2163. "0": ["[惊讶]", "data:image/gif;base64,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"],
  2164. "1": ["[撇嘴]", "data:image/gif;base64,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"],
  2165. "2": ["[色]", "data:image/gif;base64,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"],
  2166. "3": ["[发呆]", "data:image/gif;base64,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"],
  2167. "4": ["[得意]", "data:image/gif;base64,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"],
  2168. "5": ["[流泪]", "data:image/gif;base64,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"],
  2169. "6": ["[害羞]", "data:image/gif;base64,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"],
  2170. "7": ["[闭嘴]", "data:image/gif;base64,R0lGODlhGAAYAPf/AOWmJunn5P21Ef+5E//+x/bIW+23SvbELcObarZlDe7FU//ePcqIJP/2dNW1Ov6zDf/+0eSXCtTFuvfamrx0FN7Z1f/oTf/7m/Hu6f/5h51wSNfRzP/KJfzjq//qUOOeE8yrhOnIkcidRN2cG//3eMV7E7aCR7uRZf/89vCxHv79/Ofe0NaOFP/hQsu5rtd7BP/9sr+EVPbetO/KPM6CC/zVOf/NKN++VP7sWahiEv/lSNzX0tnUz/CjC9OjJePEau2MBqdcCMyUKcKKPubi3+7HPP/7lfvNNP/VMf/RLbFtHF0jAMevmP66GNulQ6prJdmNC/a6NP/1baWCZfq2HM6AFNnLxv/bOf/XNNmYIu3PWPW3KfbpaeyyKdiSGvGrEv/GIPv6+v/wXf/wX7d7M9DAtuqkFtK3hf/DHciqVP/cOvXy8f37+fr59rBsKb1/Lt/CibBlD+3LR65mD//8oP/uV/3dQ//9uP/AGsuJGsmDGdWtLP/kR8t9CLp0K/Hp2v/FH/jGMfHQSNKsM/DUQuaiHLmIU+2iDf7gRNiWIM2pfP/sU9/TzPSoDMqsPfXx7d+5P/uvDd+iHfn388ykY/riSrBqF/XeTPbBJP/3e92RCcVqBPnEJdCcJPbSN/fhTt+lIL6EOrp0IvOxF+upFuDDj+G3N+zPbfe8HtW5QPbugPbqb+3ihfbmW/bXPsqWH7prDYczANadVO7VtubPvOPf3OzUuOfQuu7ZwenUv5lDA9ixa/fBRdOWM8eCFe+zMPry5/XBS/346//xX9iVFciQPv/SMOG/jOarIa5wLLFzK+rj3PfKZ/zw1t6oLuGgIv7tvdCfSs+gKdKweu65Nu/XWP7nT9eRHvnXqPHMP+G6ON+8S9DIwu7UR5BWHvbvktGZHczCu7l9IOSuQP3CJIxSG9G1RNG6VOzRgd6wKsemT+yqGdO7n9/Ce+7SZfHXcO/AM/PIOPfOMeLY0ezj0ZleLPvBH9GsdN/Qq+K3NOrfyubaw+TYzOy+Kv///////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBQD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgTKkTRoQCvLVGCMZvQTOHAaUuWDELUYkENHxlBLCywxIGDJRYs6GixxAdIBQhVFAi0yEMdMcPE1PGgYwESDilgGpxwIFuWKlmqZSIhZVi2RFW8pHj2o6CwX/BkzWIzS9YpIxm0aOUqy4yTFQSJ6rHlry0uBjDoMGDrtoSZXWEGGqiRgI2/WLHYJCAAo+/fwAkE9AowEMACCrf+LsnlB8IdUZGXxMoFa0CeHQOfLTAVg5Y/WjFKEf5R+nSMDwN8bRg44gofSEp0uWl3J26GbZZ0xZGERkCJ2QKzYGnhYViDDEYugG0wzEMLLDbwPKCA/J+TA2p0LLcaJoXE0qaLdKhJAmZAozfdQyBDskCHTTFjdPL0yQGPACgIVDAQMAxwcoUaLegQDxAMAhEPEjagMUAPZEjA2EDHjMABFlhc8YIMbWHzAgcSPjBHgHkNpEIxxIBhjA3ObCLjJs7gMUAkNJiwwYUFDcHCKDYAAggaaODRhAAR5GDIBrUkBIISNHzwxQACNBJBH8kwwQMRFi0DggnKBJHDEyacsEEFa1gkkAoY1FLBBjzsUAuPatY5UEAAIfkEBQUA/wAsBAADABAAEgAACMgA//3rEOWInX+IBB4JVECGQIGdlixx8PDfHolCKk5MtUTjHh8dBXpYNEwKiYqLdKhJAgZhtixVer27ILCBoERVvKSgUkTWLBSzZKET6M4nm6Dr9Nh6iIuBQAZLBeIqkYDNQxUJBFZ9yCYBBVr+/vnL5UegqFthx8LKFwMsrRjt/l340dbf2w//TFnSpeRHRUh740iqOKaiYYFNDg87zPifhcc6WqhpLHCB5StYklD+l8RYEhs2WlJuEgkIkEiRNv8D4k8FkMMBAQAh+QQFBQD/ACwEAAcAEAAOAAAIiwD/eRjWIIORfwj/jfHQAouNfxbqSMlAB8YdhBmk1NGhxgYaC2JIGIFBAAJCIyTEWFiQBJCFYZku3IFg8t+FTMNWJgEjLlasJT5rGvnpM9Y/HRIpWvxHJ+PGKy0FEjSY8N8whlg4VB1WtavXr2DDikVIBQgVY2PLQgOCSiygF9D8vWgy9sOmTRG8BgQAIfkEBQUA/wAsAwADABEAEgAACL0A/wmctmTJoH8tBPooCEKgwyUOHCxx+G+Jj4UU/y3yUEcMRR0LkHCgmC1RlSzVSJr0kkIgPFmz2MySdUqgFpgyZZn5p8eWv5+4GAhk4BNoiX8J2PiLFYtNAoFJlzZNoIbCraVLcvkRKOrqkli5YP0zFYOWP1oxSgn8UfZsjA8CISnR5aYdxW2WdMWRhCaj37+AKV4JTFjwv3hAEiuOF/iFjJ8/sb3AA9jZpsuYnQUeCQYQGsqF/30ZIKCR34AAIfkECQUA/wAsAwACABIAEwAACNwA/wmUsGRJNIECoxWUgBDhEiHSljRc0kmExIb/AlmzYKGhGmNHqGHskqhKFkEN43mpwqIQQmSyZrGZJUuLQDkxZ8q6JlCPLX9AcTEQyOBn0BICE7D5FysWmwRJlzZ9KpACLYFLcvkRKOrWP4m5YP1boC0GLX+0YpQS+MMs2hgjBFqApESXGzgQBBq5YUlXHFBoENaRkoEOjIZS6uhQY+PfAIRjMEpuLLnyPzWWM1vGrIOjBR0t1CDRfGWB6StYknAIbNkGOSpAgFBpgkdzYyBAgTzWLPDQixeHKgcEACH5BAUFAP8ALAAAAAAYABgAAAj/AP8JHEiwoMGDCBMqRNGhAK8tUYIxm9BM4cBpS5YMQtRiQQ0fGUEsLLDEgYMlFizoaLHEB0gFCFUUCLTIQx0xw8TU8aBjARIOKWAanHAgW5YqWaplIiFlTLZEVbykePbD4C94smaxmSXrlJEMWrJulWXGicEDemz5W4uLAQw6DNSyLWHGYI0EbPzFisUmAQEYePXyTSDAoBoKt/QuyeUHwh1RiZfEygVrgMEF2mLQ8kcrRqm/PzRzjvHBcsErOiAp0eWm3Z23GbZZ0hVHEprCBbG08DCsQQYjF742GOahBRYbeB6cVaNj0TApJJZKGbZIh5okYJo0MogMyQIdNnHqb+TpkwMeAVAMMuB0RU2LeEDiy49nA82AHmQMHhvBAQuWFzKstRY2L+AxQCRzIGCQCsUQA4Yxzmwi4YTOHEiDCRsgNAQLo9gAyIdoGChABDkYskEtCYGgBA0ffDGAAI1E0EcyTPBAhEU45qjjjhYFBAAh+QQFBQD/ACwDAAMAEQASAAAIzgD/CewQ5Yidf4gEHglUQIbAh52WLHHw8N8eiUIq/puYaknFJXt8eHzoYdEwKSQeDlukQ00SMAIReRjWIIORCwIbDPPQAgsHKv8s1JGSgQ6MOwIzSKnT0gaaoGJIGIFBAIJAIyTEWFiQBNACC8MyXbgDweq/C5mGbTUG6J+4WLGWwDVrJC7cWLAEDi0Ko+JSHVe6ahxckQPhwwIHPOSDGLEOC5B1tFCDBPGVBQuoAKGShMPTBxqTiNYMDQgqPI3/vYDm70WT1P8+bNoUYXBAACH5BAUFAP8ALAQAAgAQABMAAAi6AP/9k7BkSTSBAqMVlIDw3xIh0pb8ayFwSScREhEGsmbBQkM1SI5QQ9glUZUsghrG81KFRaF/yGTNYjNLlhaBcmTSlHVNjy1/QHExEMjgZ9ASCdj4ixWLTQKBSZc2TUCB1tIlufwIFHXL35JYuWCZimGVVoxSAn+Q9Wd2hAVISnS5gdPwhiVdcUChacj3o429fQMj5CP4H2GBTQTqKMy4cd8FarA0JicQCJXEjIH4+wdkQONDL14c6hsQACH5BAkAAP8ALAMACAARABAAAAi0AP8J/OfP38CDBQ8OjKVQIMOGSx4qjNiwosWLA68kEYjoUjUuDXF0myFvYA1t+NKAHDjmU5oz/ez9A5XujAp6aXAM/KQOQxtKpCKJOzOp4D51lSoRUkevIAZKmhSBKFpQn4hBIv4U9PeIUo5JoQxh2MpPA1V/f4b0GRiKDAY2jBgJLPhHXENF9STM2+qPX46KKphM4RtGg4aGKqy42KoCg4TAZVQMDKN4axsX88IUdGElzL+AACH5BAkAAP8ALAAAAAAYABgAAAj/AP8JHEiwoMGDAiUsWSIBocOBDM8sefiwQ5QjdigiNMCiSqIZBOF5qcJinMNxsmaxmSVLjsAiKVfKMnmwhC1/OHExEKjnZs4SCBOwGcgmgUChRI0aPEDhlr9YsXL5gUFHlFOouWAdrGEqBq0lsWKUIgDjh1ewMUYcXOABkhJdbkpBgHDnwg1LuuKAArTWghgSRmAQgEDWCAkxFhYk4Wvwio46UjLQgXGHagYpdXSosYHmIJYWHoY1UMXqm5EMq6pdaoGFA56DB9ToWNTqnL9zq7iY8zfIUxIwTQ4iQ7JARzec/hw5Qt7PtYCDDDhdUeNqkL81ZZD7wIRmQI+Dx0ZwYMCCxZO07DhfcR/wYM5BFcWIgTF2IA/yMr6oDIhEw4TDISyQAs59a/gDBRQ5GLLBQyDkgFwQQeCkwhNM8EAERfNM4Y83EJbjjwbhVLCGRv88sgMPO2zATTg7BEDiiwQFBAAh+QQFZAD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgFSliyRELCgQuXROO1JUqwJffYLXkocIkQaUsQtVhQ40igAjIeojDAokqiGRYs6GgBz0sVFuMQqhgnaxabWbLkiKkzo+dPWTkNTihhy59TXAxISNHT9GmJHwWF/UrAxl+sWGwSGMnA1SvYBE5WEJxwgMItf0ti5fIDg46ot3FzwTKzK8xAAzVMxaDlj1aMUgRg/BhcOMYHAb0CDASwwAMkJbrclIIA4c6FG5Z0xQEFZkCeHQOfLbAghoQRGAQgJDZCQoyFBUkADfC1YeCIKzrqSMlAB8aduhmk1NGhxgYaASV6C8yCpYWHYQ1Usfo2dlW1Sy2w2LrA84CC9H9ODqjR4aHVOX/nVnEx52+QpyRgmjR6cz4EMiQL6NCNU/444giB/XCAhwBQIFDBQMAwwMkVargyCIFlrOGPD5igMUAPZEgg2UDHjMABFlh4Ig2Gr3Q4wANzOOjXQCoUQwwYxhyQRxkE+kLFAJHQYMIGIxY0BAukgOPPGjw6RYMmORiyQS0JgZADgUEEQeATTPBABEfzTOGPN1mW448G3OywBkcCPbIDDztswE04OxTJ5p0DBQQAOw=="],
  2171. "8": ["[睡]", "data:image/gif;base64,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"],
  2172. "9": ["[大哭]", "data:image/gif;base64,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"],
  2173. "10": ["[尴尬]", "data:image/gif;base64,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"],
  2174. "11": ["[发怒]", "data:image/gif;base64,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"],
  2175. "12": ["[调皮]", "data:image/gif;base64,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"],
  2176. "13": ["[龇牙]", "data:image/gif;base64,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"],
  2177. "14": ["[微笑]", "data:image/gif;base64,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"],
  2178. "15": ["[难过]", "data:image/gif;base64,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"],
  2179. "16": ["[酷]", "data:image/gif;base64,R0lGODlhGAAYAPf/ANWiOtWkVP60Dv/89v/cOvjGMP+5E//XNf/1beXEav/wXdnUz//VMbhrEv/wX2loS/+7FDIsDf/GIOSXCv/aOf/DHf/tV//pT//9sf/ePf/AGv/FIP/+0P/6lf/KJf/4e//5iP/3eP/3d//dPf/EH//9uQ4LA9ShMtSfLP7hRf/gQf3dQ/7dP97bgv/TLv/PK//LKdXHSvfGK/y1Ef2xDPGsEtSmRvCjC9ilGdqOC5+SM7+HEnJuNmZjLmZaGxgUBdfRzP/fRf/lR6WclKpSBr5pCdfSzf/sU//RLf/qUP/mSL2Xdern5OPf3NzX0/////v6+t3Y1I5lQf/iQv/LJv/oTP/pTf/oTf+3EP/xX//uV8t+CPe8N9LFuFdXR65wLPncnOG/jOrj3NOYEPWyEs2sg+fe0P+/GcKKPlpZNv/ePr13FKxtJfbEL/XBS5SMhffIW8iQPvry50g4CYV+ePW3KeGgIe24SyQiDLiESfzw1suJGqdgEMyLIu7CUntvI86ACP/7mzkyDqhdCf/hQrSAR/jbmrd7MvPesOC0N++zMPjKX/fKZ/3XOcivltiVFf/TMOnIkfOpDYczAPTy8bmIU5OQTruRZcCXZ/Du7PbGWczHbdmYIZyTOv38/P79/Pi3GvnEJfvhpfzlr65mD//MJ+afELFzK+HZZuWmJvvLMPrNN/zPNP346/C/JMJ8FP/+x+ro5cWebdWOEfbYmfHIWG9tRv//197Z1d/a1v7IJXVwMmZeIPfBReCfJMeCFvuvDP7nT+jl4t2cH/3fRMmphu65Nu3HU/W5M/SnC/CwH86EDr1/Lv/2dGZgJrNvGtixa+Tg3ebi3//+/PzfQf/qUY13Hf/rUfPRNtmkQtylRKpjE9KWM7eCRbVpHeC3PTw4Nfz3k3p0bv/rU//8mtejTdKUINKYJeaqH+XFW+aqIP/3e/OyGO7YbeCoJOC7T7hsGO7Zgfn4woRzIMaHK92bGN2cGMaJNf/XNP/7n9ahQbVpGf/RLv/SLQAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFFAD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgTKhwwalGvOsjcMAKjR+FAUVxWrUhBiEUjVgVqIVoIp0CwK1esWFFCiAADVcb8IJymqcC4JFoUZFGgJYmQDAx0KTt20FCbC4lOIBDx4R2CLEfOueO3wVeCgq0UEUuSBZ6NDuTugWh2ogEhfFRAZTNDkJYJf3h2bQpAJIG3eEQAxPgTwZ+/HdCgDLzzw6/fB3RhEdHHw7DfMdyEDUwlyPASKV5ucSiRxp+UJYbJ7HEy0M48y08c+30C2t8cA7+MDByGra/jBxhsqf6BA8srIAM54aOmw1kPSy0CdQCBqhMvH9ZcnRGwBrhAbTIICDmSBUGIdSKeHrYRQgCJBAjJmMkWGEkdgwxCruXc2fMnAyoasOSQFWWgnD6hUEDAFEpUYcUVSgThUikVGHDDIV3EQlAY9VBxAD4UjKBGEUUEgQQVFUBAAymY5CLYQJ/E8YgEkLyARD9FTBKEBBoYAAwgeRjBxEFozMIODCRsEEQQZ0CAxQTbVAJEEwmV8cwyptRgwAySTLDFF44sII1FYhTTzSmD8MFGIZcAgQslFgnkSSZNRAHEAk5Es2OadBYUEAAh+QQFFAD/ACwDAAMAEQARAAAIhAD/CRwoUAXBgwQvVPm3cArCgYlQDPxmodo/c+4QHmkAQCC9fw5QNCCABGGzf0TS7WtH5F8Shw/zlSOCgQgABA+HgBMoj8M/DOEGihsy8M0QojmHvCFIBynCIXQeSp1K9Z+Ghx9CHOwnEN1UiyP+eZh6oUgRqfYGEqj60AXbgRsGXj0YEAA7"],
  2180. "17": ["[冷汗]", "data:image/gif;base64,R0lGODlhGAAYAPf/APzjqm0pAPymN//rXf+0S+WnJv/4h93Y1Ojj3f7TNf7dRPjGMfx6Rfz16cOaappFA//wXdaDFfvNeeqYKvjamv/qUPu0ErBqFv96a7dlDf/ubdubKfuuDf/oTf/lSvfKZ/+ZMdLFufbm0P/+x9y1bf/6nODEVv7aOf/2df7VYern5NuZIP+5E//8suCoIteZM7aCR//89vSVF8+hMP/DHbl3TtfRzMOKPcurhf7ZQPa7NenTxv/SPP/+0f79/J07AP/RLs6CC/+/UMitlf/IMfOfMP/dPf/6lcSIJv/SUvbicLuQZv9rTqhhEsN8FP+XTf+1YfbLNf+bJeumFvfLX/+SYvflmKlbCf+mKf/3eNulQ/+DN/fIW/qwLu24S6FIBf9ZXMmDG/CwH/6MK/+PXP/FIP/1bf/MOP+LRv+8PP/gQtnUzv/LJ9ChiL51E+LGtOSXCv/cTv+hXf+/Gv/OTf/7oP/dUfrUeP9zU8t+Cf/NL//OK/+yGKFTD/6jG//lR//FXP/9uPnCJv/CKP+5Iv/uV/22Mv2rEf/nTP+tUvfBRchaHP+wPP+wJv+JU6tYJP/HS8eCFuK9jOC1MfKqD//FKP/BIf/jTf+iQt+gIfbeW+C8Pva8Jv+nc7t4NeafEP+rTv9zXf/mXtGPGPOxGP9fZf+2D//pWP97Xv/aXP/TTu3SrOPf3Pv6+axtJa5wLPbEL/Ty8enIkfDu7O+zMPXBS+msLfW3KciQPvzw1vXGWbeBMO2+WLFzK7d9IfvIK/nFL7mHVP/FQPPesOm4Uv/4e9CFJ/9gaPaAVuKyUv+vR9qymuje0L5/LsuJGv/xX//jRv/rU923obBjELJrQPm6Ke3Cb+WFRe2jS+fIqLlQEOnTvO3IcNWqka5mO/bmsLJmJ/LEMP+xWv/DOPNxOPvjff/bOd6HEP++Mf/LR+JaN+2WNOihJPO/KP/0lP/RYOa6MP+3cdnOx8SVgf+oZLlPFblXC/rDJv6nF+2AO/+qHP+kSf37+oczAP///////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCAD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgTKowBgIqiWzpqfaCQS+FAADqAJThh5ASQX5x4DVvIBZiCDhVSIoKm5sQ9W8QQ+tC1oEK0QhCeQShU4U9LIGKSHaQAK9qmfv12Fcti5pkvpC4SZCJRsAEtDzP6mTBwpMQRAyieVZjUb5QgLcwIUojioZAZA3VaBGpRx4CZQn/M7aExhUSrgV5ydICQ5UiLET1GtDiSBUIHI0DKWHiBYGABNR2eZSkRqIfnQCWKPXsc2YKzAwMzGfEwAIW7w4kXoxhwKYceGiwi2UjNI06qaRKsULjSosS0FKkUTUNHyIKT3QJXnIEkBNuXAH24fdX1APs6AVgOucWB/k9LNQKg6NGDIqFcFg2iACV68gSEHxnNyMtil0ZZInGAvCMKBKfYkQ4BmIBg3zkOoCZQA8ZUM44w6agSxyUd/KEAD+MY0og+MngSggoESVJAJXpslIMRHSUARCVz8MHBNA3+NZAPuLhQBht7AAEEUmyUMQcLHAQBgw0kGnRDJqTQUAZSSLFgChxNBGMDKwnhgEQQn1DCggWUwJHHK0OsUZlCCOAAQy9XNOEKDEvYcEAsFgnkwyysHGDDGgewkmSdgBIUEAAh+QQFCAD/ACwCAAQAEwAOAAAIngD/Cfy3QM3ADgMTKly4UA9DhSgeSpw48A9FDxQzDoQgEQKihZdEfRkZ4IHAkQ9K/rP0b8U/VUkubPMXIINAN8xoZjDUiM+/cQTkXLvy5Z81gcmIXsmHRgq+f132OUKFoUq8OwJTiCODBw+DMQInMHpChgw9QCkExiHwxBGDLVIGdklDQAgkVXb+YUxniBEWPwuJ6OGhcM8/Qv8OCQwIACH5BAUIAP8ALAMABQASAA0AAAiTAP8JHEiQIJCCCLMgXMiwocM/DiMOfEYFSZ8m3wSWC9OnD7x/NFgMDCMiwL8wAkmaDENkIB1AYVb9W4XypEyajASmAUUG2YUHFyQIpPLzAgMGIPwIeBKq1DEMnSSg+PdOTigwYJhsEYjJESpUVaC8E5gkkSM8TBiMiSCQkTICQpIMzCGMkQAQUggO+ncGoZ69BAMCACH5BAUIAP8ALAYABAAMABAAAAhKAIEp+EeQ4J+CCBMW1KOwocOCmjZEeGGFoBKJK6KEEREgQBiCGzuGyeCvYwaCJE2S9Ofv5L+VLRXWeUizZsEUNePY3MnzHwuCAQEAIfkECRAA/wAsBAADABQADgAACFcA/wkcSHDglzYFBS5QUxCaQEH/vjxCmLCiQCBOutXoZtHijx3+MuzomPCHP387fvDzQFJgOJEof7RqOTDTxwzz/iGiKXDUDzfyeAoVWGKo0aNIW9rhGRAAIfkECRAA/wAsAAAAABgAGAAACP8A/wkcSLCgwYMIEypcyBCADmAJThg5AeQXJ17DFMbgskBNhwoVOiCCpubEPVvGWiHUtaBCtEIQnkEoVOFPST0/mvE7CCvapn79dhXLYuaZL6AuMv14pMKghxn9TBg4UuKIARTPKkzql+HNmx8G/xTStCHCCyst6igpuyLKD3/+li3xQbADhDAiAgQIM6IFXr1h3sJ9tHNgh2cZ/OnN0CNQ4sWC/YEleElUYrgZ+l72l2HUj2w/lhSkAyjMKn+rwrQoYRp1GEYZfmSwURAUGWQXHlyQYJVK7gsMGIDw44Y2wSehSh3D0EkCCg3v5IQCA4bJFhnNjA/E5AgVqipQUkA0OJUkkSM8TBiMieDgQMEujJQREJIkTgcPOYQxEgBCigxPITTF0IAEFpiQKQYmqOCCDBIYEAAh+QQFEAD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgTKowBgIqiWzpqfaCQS+FAADqAJThh5ASQX5x4DVvIBZiaCig7IIKm5sQ9W8QQ+tC1oEK0QhCeQShU4U9LIGKSHaQAK9qmfv12Fcti5pkvpC4SZCJRsAEtDzP6mTBwpMQRAyieVZjUb5SYL28IUojyp5CmDRFeWGlRRwncFVH25JEGrtVALzk6QAgjIkCAMCNaEDYcpt0Pfz/WDCygpsOzDP4MZ+gRCLNmN8v8LasxMJORS6Iw+/OXIbFq1o9X/xi4ggcdQGFW+VsVpkWJ3LvDxIZMOw0oMsguPLgg4SsV5RcY1Hvj7423gVoEPAlV6hiGThJQaLl4JycUGDDqtP34MmSgrAmYHKFCVQVKCginkiRyhIcJgzEROHDAQA0Y0wUjyhAgRBJxdOBBDsIwIgAIUsjgSQgqECRJAYMQcQYPORjRUQJ6DEIIH4dMI6BfA/mAiwtlsLEHEEAgxUYZc7DAQRAw2JChQTdkQgoNZSCFFAumwNFEMDawkhAOSATxCSUsWEAJHHm8MsQaCFiEAA4w9HJFE67AsIQNB8RikUA+zMLKATascQArP65pJ0EBAQAh+QQFEAD/ACwEAAQAEwAOAAAIYAD//Vvwr4PACv/+CFzIsKHDhxAjSlwIgaEgLcz+eZi4kMYUEhwXAilj4QWCkP+AkPri5ABKInmkXbGBssiPfz9CoFy07N+yGih/+Bt6M6RQoijtvfH3hhrKc19+UHsTEAAh+QQJEAD/ACwLAAQADAARAAAIWAA7/IP2r6DBgwgTKlz4bKHDhxALlmHhzKElFpEWMmrEx4kNhQzGPHDzMSGTRdL6lERI7se/HyEUZlj2b1mwf+YQ/vDH02XCnT0V9nnj700NhUOo/ajxJiAAIfkEBTIA/wAsAAAAABgAGAAACPoA/wkcSLCgwYMIEypcyLChQ4EdEEFTc+KeLWIP/0EoVOEPRSBikj3MYuaZr379XCTIRMLhEQMonlWY1G+UIC3MDP4x2KKOkg0RVkTZQ2MKiVYMR7QIIyJAgDBAylh4gYBhj0AZ/DnNAIQGC2cHkrbI6s9fBiKWWESywbBFiTCr/K0Kw6gRHydsF76kcuHBBQYMQPhxk1chCg3v5IQCA4bJFhnNCieEcCpJIkd4mDAYE8FBWIV2OkDLIYyRABBSZHgKoYKhkRMJ9AwixOfQNM9IF6JkU2YOCw5BYNhozRBlPxam4DQJZoOVQxYWKMHJ82rImqoZs2vfXjAgADs="],
  2181. "18": ["[抓狂]", "data:image/gif;base64,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"],
  2182. "19": ["[吐]", "data:image/gif;base64,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"],
  2183. "20": ["[偷笑]", "data:image/gif;base64,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"],
  2184. "21": ["[可爱]", "data:image/gif;base64,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"],
  2185. "22": ["[白眼]", "data:image/gif;base64,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"],
  2186. "23": ["[傲慢]", "data:image/gif;base64,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"],
  2187. "24": ["[饿]", "data:image/gif;base64,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"],
  2188. "25": ["[困]", "data:image/gif;base64,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"],
  2189. "26": ["[惊恐]", "data:image/gif;base64,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"],
  2190. "27": ["[流汗]", "data:image/gif;base64,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"],
  2191. "28": ["[憨笑]", "data:image/gif;base64,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"],
  2192. "29": ["[大兵]", "data:image/gif;base64,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"],
  2193. "30": ["[奋斗]", "data:image/gif;base64,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"],
  2194. "31": ["[咒骂]", "data:image/gif;base64,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"],
  2195. "32": ["[疑问]", "data:image/gif;base64,R0lGODlhGAAYAPf/ALhmDRwXD+O2aKhYGfqUePfamuSyNNx5Vf//7ejj3t3Y1PzVO45BBNGKLPDKguKZLMKaav/0bfGsEv/wXv//5FsjAP++Sv7cRfW6J9yoVP+8VbNuGv/89uafEMmphrFzK//9x+iiGJ5JCP/3d//zdunJoP+6E+7ezbaCR8t+CP/LNePf3P/90v/pYv/LJv/ePf/3iN2dIc6CC7BSKNCeXf/oTfjKX//8sfTGOfHeytfRzP71lffr2/2wDP/CIduTGbd7MuSrQea5eN6POf61EMyEG8OfgfPjz/79/MZ7KP/RNejl5fCjC/+/G//qVP/hQtCCEv/6naliEiQjGv/iSvHh0fv6+v/uWOCYHeisLdOLGv7sWP/DHdeyk+rEk//SLtSQJ4YyAPHcxNeZPf/tV9nUz//VMdeuiMqJNv/lSOSXCuyyKP/7ldusar9qCf/qUP3jTcNwEdKGGMRwC9F9LezEPr9+Mf/iSejBh+2CZtPNyM5/Ef/AGv/FH9OHFvzvcNaqddqODK5wLPThdP/kdP/hSvDcgv/lfuGqWP/8uP/cOv/PY9SHFc+ORc6NONGUQf/ZW//FcMB2G//PK/uvDP/AKcp1F/OnDty2Yf/kR/jGMPXnpch2DvWea/mpUP/Kf//mTf/3e//EYN6VDP+bgP+sN/7hSNqUK/+WX/+3HP6qIsp7Ef+XTeqgMf+ePuCCReKLNe/IQP/vWqdRBPnx5urWxcaDNcKBPOvRsMSNX+O6hMx7ENSIFd6zff//+P/cYvzw1sivlvTy8cl/FbFkEfbKM6lPFvjGPvPesKxtJblpLuGdUP+pYvDu7LmIU/W5M+2+WNWPH/fBRfXBS/vhpern5P6tgffKZ7yRZfbGWffIW/zlr6hdCf3gSv+jb/HNQMp8EtLEt+7s7P/XNP7hR//bOduZMMyDK///2//IV/LRRtyRE/346v/HV/2vRjAnHqFQDf/WP7xzH/GvHPa1HuqgQcikfcV5E/jeT9qYIdOukP/YNPXopgAAAP///////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJFAD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgTKlzIkMM2G9IwPJt2rQAwhv+oHVtw4cWTFwuUaIKGTCEHbd3IpanBMs2TYjH8+DHH7iCSbHDSvLkyoeeVb+BK0OKhq4gVgwVwxNASzcCfUCMiFMHlz1+YML0eFWSXZZVQomB2sBlkq6q/CmFwyeHFSIjAAsOoWsUq4IahW2b9WRlTR9YWA26DlK0apkIONCBuEDthVhyUK5C37PqXD2/eKnZYJMKUq1ZVI3uoiL7D6d+DxXnP0Ei8I8OAASJmrFJCe80500M6V+0yYNONKDAIRepEII+lED5C7BLzbwizA8ZgK3MQhQ0MEi0gtdNQ79QcN3ZyCNJc5skbKQLWPh2CGmGCk0LxVFQKMeqDnoFeWlnQIGrRrxY+vZHGC2a4wAcRgUCgwEACsIUFDhdQAUpLTyhSIBcmMAFEONUIJIQBW8hSxw/jlPPCC7LMMossLmDYAzEKHvUPFFtAdsUuLkzyxRcprsiHCZTIgIIOHQq0xx1IUsEJBlz04SQXPxKhhhTO6LACQQ2sQZsSc2wgQwcSmEDEJWqkIEgwZSRQkBhQIBdCEgl4gMIH3EiRDArY6KCAMAcd0YgbSYiHRDMrKKBDGQqsUKRBAQEAIfkECRQA/wAsAAAAABgAGAAACP8A/wkcSLCgwYMIEypcyJDDNhvSMDybdq0AMIb/qB1bcOHCkxcLlGiChuzfEXOMMhwhyEFbN1NpashM86RYDD9+Tp2KJatOvhwCkWSDk+bNlQlIr3wDV4IWD0BQrkiN1UBgARwxtEQz8CfUiAhFcPnzFybMsDtU0nL6xy7LqqY8dIHZwWaQrbH+KoRZpaSvkjn/CgwTSzZMLwE3DN3C628JmhA+fKwD9C/I3bFhKuRAA+IGsRN4m2FzQ5qGwHyLGVexwyIRply1xuqDB0uenoEPPjM+Q6PzjgwDBoiYkYcVHR24h8Ae22XAphtRYBCK1IkAAVSukiAXOITZAWPClTneiMIGBokWkNJpcFdKlaTt/5Z58kaKgLVPh7xGmOCkUDwVlaRyiR3wedGKBRqIssgvLST1RhovmOFCE0QEAoECAwnACyNY4HABFaDM9IQiEnJhAhNAhFONQEIYsEVPP4yjyAsvyDLLLLK4YGIPxFxohUBQbCHVFbu4MMkXX9iIIx8mUCIDCjqsKNAeaamFARd9ZMkFk0SoIYUzOqxAUANr+DXHBjJ0IIEJRFyiRgqCBFNGAgWJAQVkISSRgAcofMCNFMmggI0OCghz0BGNuJEEUEg0s4ICOpShwApSGhQQACH5BAkUAP8ALAAAAAAYABgAAAj/AP8JHEiw4MB+Afr1M8jQoEKF7xY2nKhQYEWDHLbZkIbh2bRrBYAVvEiQ2rEFF148ebFAiSZoyCySFMhBWzdyaWroTPOkWAw/fsyxm/kPSTY4ad5cmcD0yjdwJWjx0FXEisECOGJoiWbgT6gREYrg8ucvTJheM9llWRV1KpgdbAbZIuuvQpgSAQIwEiKwwLCxZc8KuGHoFl1/VsbUcULGAN8gc8mGqZADDYgbxE7QFQfliuctu/7lM3y4ih0WiTDlqkXWyB4qsKlw+vcg8+EzNC7vyDBggIgZq5QIX3OO9pDVZLsM4HcjCgxCkToRyGMphI8Qu8T8G8LsgDHfyhxE5GEDg0QLSO001Ds1x42dHAKXefJGioC1T4e+RpjgpFA8FRhIMMoHegzkRSsWaCDKIr+0wBQZb6TxghkuNEFEIBAoMJAAvDCCBQ4XFALKTk8oQiEXJjABRDjVCCSEAVvIUscP45TzwguyzDKLLC6g2AMxGVr1DxRbeHbFLi5M8sUXOe7IhwmUyICCDi0KtMcdsXGCARd9dMnFk0SoIYUzOqxAUANrCKfEHBvI0IEEJhBxiRopCBJMGQkUJAYU1oWQRAIeoPABN1IkgwI2OiggDENHNOJGEvAh0cwKCuhQhgIrVGlQQAAh+QQJFAD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgTKlzIkMM2G9IwPJt2rQAwhv+oHVtw4cKTFwuUaIKGTCCiaIjwEOSgrZupNDVipnlSLIYfP6fAGHCiTo4XgUiywUnz5sqEo2S+gStBi4euVaCuXMHXQGABHDG0RDPwJ9SICEVw+fMXJkyvLHDu3IHyj12WVUydgtnBZpCtsf4qhMlxT4kSLGj+FRgmlqxZATcM3cI7tgqAeevcCAxyd2yYCjnQgLhB7ATjMwDiSBaYbzHjKnZYJMKUq9bYLrNgJVEw8EHnzzQ278gwYICIGXlY0dFRe0jr1wM23YgCg1CkTgQIoHKVhLjAIcwOGPOtzEEUNjBItN6A1E6Du1KqJFn/t8yTN1IErH065DXCBCeF4qmolOqSnfVetGKBBqIs8ksLSL2RxgtmuMAHEYFAQJtAAvDCCBY4XEAFKDXIMssssjTIhQlMABFONQIJYcAWstTxwzjlvPCChyC6MGIPxEhohUBQsCjVLi5M8sUXNMrChwmUyICCDigKtAcVUN7BCQZc9GElF0cSoYYUzuiwAkENrOGXEnNsIEMHEphAxCVqpCBIMGUkUJAYUITgQwhJJOABCh9wI0UyKGCjgwLCHHREI24kkcM/SDSzggI6lKHACk0aFBAAIfkECRQA/wAsAAAAABgAGAAACP8A/wkcSLDgP18U+gXo14+CL4MQByJgyPBdPwQRI07sh44FQwoGOWyzIQ3Ds2nXCgDzhYACBXQMMRKkdmzBhQtPXixQogkasn8bGz4UyEFbN3JpaihN86RYDD9+zLH7OPQfkmxw0rwhM6ErmW/gStDioWsMC3RV/xXAEUNLNAN/Qo2IUASXP39hwuBhGESIQHZZVoklC2YHm0G27vqrEEZAgCkkDPgtMMwu3jC9BNwwdEuxP3HRSJCYsGXXvyCJ74apkAMNiBvETihesucOlduc/uXr7LmKHRaJMOWqddfIKiXI15z79yC25zM0Xu/IMGCAiBmWQvgIsUsM8yHD73b/GbDpRhQYhCJ1IpDnVRw3dnIIHMLsgDHryhxEYQODRAtI7WjgTitYbKDHQMt44g0pBFjzySFyRTCBE4XEo0IlqVxihw4DedGKBRqIssgvLXR1xRtpvGCGC00QEQgECgwkAC+MYIHDBVSAstQTiqzIhQlMABFONQIJYcAWstTxwziKvPCCLLPMIosLP/ZADIxWCATFFld0uYsLk3zxBZRS8mECJTKgoAORAu1xm22cYMBFH3Ry0YQJRKghhTM6rEBQA2sgp8QcG8jQgQR4XqJGCoIEU0YCBYkBhXYhJJGAByh8wI0UyaCAjQ4KCAPREY24kYR8SDSzggI6lKHACmwaAhQQACH5BAkUAP8ALAAAAAAYABgAAAj/AP8JHEiwoMGDCBMqXMiQwzYb0jA8m3atADCG/6gdW3DhxZMXC5RogoZMIQdt3UylqcEyzZNiMfz4McfuIJJscNK8ITOhJ5lv4ErQ4qGriBWDBXDE0BLNwJ9QIyIUweXPX5gwvR4VZJdllVCiYHawGWSrqr8KYXJIOkGwwDCqVrEKuGHoltmqVdy0OSowSNmqYSrkQAPiBrETd89A0cJrjMB8du9WscMiEaZctap2ASAHnywDGf49OJyYRuEdGQYMEDGDDhQyV8jsEj0Es+YB/G5EgUEoUicCeaCQu3OHCqd/Q5gdMLZamYMobGCQaAGpnYZ6q5Ron6N1mSdvpAhY0Pt0CGqECU4KxVORhRO9eXEaCfTSyoIGUYt+teh55U2aF2a4IEEgc8hjz0AC8MIIFjhcUAgoLT2hSIBcSDCKIOEsIZAQBmwhSx0/jFPOCy/IMssssrjAhQk9EIONAnxBscUVNO7iwiRffGEiinyYQIkMKJRRzUB7FEccJxhw0ceSXPRIhBpSOKPDCgQ1sIZ2SsyxgQwdSGACEZeokYIgwZSRQEFiQBGCDyEkkYAHKHzAjRTJoICNDgoIc9ARjbiRRA7/INHMCgroUIYCKwx5UEAAIfkECRQA/wAsAAAAABgAGAAACP8A/wkcSLDgP18U+gXo14+CL4MQByJgyPBdPwQRI07sh44FQwoGOWyzIQ3Ds2nXCgDzhYACBXQMMRKkdmzBhRdPXixQogkasn8bGz4UyEFbN3JpaihN86RYDD9+zLH7OPQfkmxw0ry5MqErmW/gStDioWsMC3RV/xXAEUNLNAN/Qo2IUASXP39hwuBhGESIQHZZVoklC2YHm0G27vqrEEZAgCkkDPgtMMwu3jC9BNwwdEuxP3HRSJCYsGXXvyCJ74apkAMNiBvETihesoeK7Tuc/uXr7LmKHRaJMOWqddfIKiXI15z79yC25zM0Xu/IMGCAiBmWQvgIsUsM8yHD73b/GbDpRhQYhCJ1IpDnVRw3dnIIHMLsgDHryhxEYQODRAtI7WjgTitYbKDHQMt44g0pBFjzySFyRTCBE4XEo0IlqVxihw4DedGKBRqIssgvLXR1xRtpvGCGC00QEQgECgwkAC+MYIHDBVSAstQTiqzIhQlMABFONQIJYcAWstTxwzjlvPCCLLPMIosLP/ZADIxWCATFFld0uYsLk3zxBZRS8mECJTKgoAORAtV2h22cYMBFH3Ry0YQJRKghhTM6rEBQA2sgp8QcG8jQgQR4XqJGCoIEU0YCBYkBhXYhJJGAByh8wI0UyaCAjQ4KCAPREY24kYR8SDSzggI6lKHACmwaAhQQACH5BAkUAP8ALAAAAAAYABgAAAj/AP8JHEiwoMGDCBMqXMiQwzYb0jA8m3atADCG/6gdW3DhxZMXC5RogoZMIKJoiPAQ5KCtG7k0NWKmeVIshh8/p8AY2KJOjheBSLLBSfOGzISjV76BK0HrCA0oW65cwddAYAEcMbREM/An1IgIRXD58xeGQT5Td6hQgfKPXZZVTHnoArODzSBbY/1VCONojRIlWND8KzBMLNkwvQTcMHQrrz9xXebMW+dGYBC8Y8NUyIEGxA1iJ/JaMeImTmWB+Ro7rmKHRSJMuWqN7QIPVpIyAx+AdnyGhucdGQYMEDEjDys6OnIPiT17AL8bUWAQitSJAAFUrpIkFziE2QFjw5U54ojCBgaJFpDaaXBXSpWk7f+WefJGioC1T4e8RpjgpFA8FZWkcokd8HnRigUaiLLILy0g9UYaL5jhAh9EBAKBAgMJwAsjWOBwARWgyPSEIhJyYQITQIRTjUBC7CRLHT+MU84LL8gyyyyyuGBiD8RcaIVAUEl1xS4uTPLFFzbiyIcJlMiAgg4rCrTHHWlRwQkGXPShJRdNmECEGlI4o8MKBDXg119zbCBDBxJ4eYkaKQgSTBkJFCQGFCH4EEISCXiAwgfcSJEMCtjooIAwBx3RiBtJ5PAPEs2soIAOZSiwQpQGBQQAIfkECRQA/wAsAAAAABgAGAAACP8A/wkcSLDgP18U+gXo14+CL4MQByJgyPBdPwQRI07sh44FQwoGOWyzIQ3Ds2nXCgDzhYACBXQMMRKkdmzBhRdPXixQogkasn8bGz4UyEFbN3JpaihN86RYDD9+zLH7OPQfkmxw0ry5MqHrlW/gStDioWsMC3RV/xXAEUNLNAN/Qo2IUASXP39hwuBhGESIQHZZVoklC2YHm0G27vqrEEZAgCkkDPgtMMwu3jC9BNwwdEuxP3HRSJCYsGXXvyCJ74apkAMNiBvETihesoeK7Tuc/uXr7LmKHRaJMOWqddfIKiXI15z79yC25zM0Xu/IMGCAiBmWQvgIsUsM8yHD73b/GbDpRhQYhCJ1IpDnVRw3dnIIHMLsgDHryhxEYQODRAtI7WjgTitYbKDHQMt44g0pBFjzySFyRTCBE4XEo0IlqVxihw4DedGKBRqIssgvLXj1RhovmOECH0QEAoECAwnACyNY4HBBIaAs9YQiKnJhAhNAhFONQEIYsIUsdfwwTjkvvCDLLLPI4oKPPRDzohUCQbHFFVzu4sIkX3zxZJR8mECJDCjoMKRAtdlGBScYcNHHnFyUSYQaUjijwwoENbAGckrMsYEMHUhgAhGXqJGCIMGUkUBBYkChXQhJJOABCh9wI0UyKGCjgwLCQHREI24kIR8SzayggA5lKLDCmgYFAQQAIfkECRQA/wAsAAAAABgAGAAACP8A/wkcSLCgwYMIEypcyJDDNhvSMDybdq0AMIb/qB1bcOHFkxcLlGiChkwgomiI8BDkoK0buTQ1YqZ5UiyGHz+nwBjYok6OF4FIssFJ8+bKhKNXvoErQesIDShbrlzB10BgARwxtEQz8CfUiAhFcPnzF4ZBPlNU0kL5xy7LKqY8dIHZwWaQrbH+KoRxtEaJEixo/hUYJpZsmF4Cbhi6hdefuC5z5q1zIzDI3bFhKuRAA+IGsRN4rRhxE4eywHyMG1exwyIRply1xnaBBytJmYEPPjc+Q6PzjgwDBoiYkYcVHR24h8CWPWDTjSgwCEXqRIAAKldJkAscwuyAMeHKHEThYQODRAtI7TS4K6VKkvZ/yzx5I0XA2qdDXiNMcFIonopKqVxix3tetGKBBqIs8ksLSL2RyQtmuNAEEYFAoMBAAvDCCBY4XFAIKDI9oUiEXJjABBDhVCOQEDvJUscP+yjywguyzDKLLC6U2AMxFlohEFRSXbGLC5N88UWNN/JhAiUyoKCDigLtkdYdd3CCARd9ZMmFkkSoIYUzOqxAUAN9+TXHBjJ0IIEJRFyiRgqCBFNGAgWJAUUIPoSQRAIeoPABN1IkgwI2OiggzEFHNOJGEjn8g0QzKyigQxkKrAClQQEBACH5BAkUAP8ALAAAAAAYABgAAAj/AP8JHEiwoMGDCBMqXMiQwzYb0jA8m3atADCG/6gdW3DhxZMXC5RogoZMIQdt3cilqcEyzZNiMfz4McfuIJJscNK8uTKh55Vv4ErQ4qGriBWDBXDE0BLNwJ9QIyIUweXPX5gwbaIxYiREILssq4QSBbODzSBbVf1VCDOmjqwtBroWGEbVapheAm4YupXWnzgoVwJv2fUvCNqqYSrkQAPiBrETaZfsuUOZCqd/+fj2rWKHRSJMuWpVNbJKiek15/49eNz3DI3GOzIMGCBihqUQPkLsEqN6SOiqXQZsuhEFBqFInQjkeRXHjZ0cAocwO2CMtjIHUdjAINECUjsN7lph19mgZ+AyT95IEbD26RDUCBOcFIqnolKqS3Z0DPTSyoIGUYv80oJPb6TxghkuNEFEIBAoMJAAvDCCBQ4XFAJKS08ogiAXJjABRDjVCCSEAVvIUscP45TzwguyzDKLLC5w2AMxDR71DxRbBHbFLi5M8sUXLb7IhwmUyICCDiEKtAcVd1BhGQZc9CElF02YQIQaUjijwwoENbCGaUrMsYEMHUhg5SVqpCBIMGUkUJAYUOAWQhIJeIDCB9xIkQwK2OiggDAHHdGIG0lAh0QzKyigQxkKrJCkQQEBACH5BAUUAP8ALAAAAAAYABgAAAj/AP8JHEiwoMGDCBMqXMiQwzYb0jA8m3atADCG/6gdW3DhwpMXC5RogoZMIKJoiPAQ5KCtG7k0NWKmeVIshh8/p8AY2KJOjheBSLLBSfPmyoSjV76BK0HrCA0oW65cwddAYAEcMbREM/An1IgIRXD58xeGQT5Td6hQgfKPXZZVTHnoArODzSBbY/1VCONojRIlWND8KzBMLNkwvQTcMHQrrz9xXebMW+dGYBC8Y8NUyIEGxA1iJ/JaMeImTmWB+Ro7rmKHRSJMuWqN7QIPVpIyAx+AdnyGhucdGQYMEDEjDys6OnIPiT17wKYbUWAQitSJAAFUrpIkFziE2QFjw5U54ojCBgaJFpDSaXBXSpWk7f+WefJGioC1T4e8RpjgpFA8FZWkcokd8HnRigUaiLLILy0cRcYbabxghgtNEBEIBAoMJAAvjGCBwwWFgCLTE4pMyIUJTAARTjUCCbGTLHX8ME45L7wgyyyzyOLCiT0Qg6EVAkEl1RW7uDDJF1/cmCMfJlAiAwo6sCjQHmmpxQkGXPShJRdNmECEGlI4o8MKBDXg119zbCBDBxJ4eYkaKQgSTBkJFCQGFCH4EEISCXiAwgfcSJEMCtjooIAwBx3RiBtJ5PAPEs2soIAOZSiwgpQGBQQAIfkECRQA/wAsAQAEABcAEQAACDIA/wkcSLCgwYOmDipcOJAMw4cMqdyBSLGixYsYM2rcyLHjwiseMyoKaVHiv4kG+TwMCAAh+QQFFAD/ACwAAAAAGAAYAAAI/wD/CRxIsKDBgwgTKlzIsKFCascWXHjx5MUCJZqgIVPIQVs3cmlqiEzzpFgMP37MsTuIJBucNG/ITJh55Ru4ErR46CpixWABHDG0RDPwJ9SICEVw+fMXJkybaIwYCRHILssqnDrB7GAzyNZSfxXCjKkja4uBqQWGKWUappeAG4ZuffUnDsqVu1t2/QvidWmYCjnQgLhB7MTXJXuoKL7D6V8+uXOr2GGRCFOuWkuNrFLCec25fw8Kzz1DY/CODAMGiJhhKYSPELvEgB5yeWmXAZtuRIFBKFInAnlexXFjJ4fAIcwOGFOtzEEUNjBItIDUToO7Vlg26Bm4zJM3UgSsfY06ZDTCBCeF4qmolOqSHR0DvbSyoEHUol8taL5J88KMiyZEBAKBAgMJwAsjWOBwARWgjPSEIv5xYQITQIRTzUAGbCFLHT+MU84LL8gyyyyyuCBhD8QM2JNAW9x1xS4uTPLFFyKSyIcJlMiAgg4XDkTFHXdQwQkGXPRhJBdNmECEGlI4o8MKDkUp5ZQOBQQAOw=="],
  2196. "33": ["[嘘]", "data:image/gif;base64,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"],
  2197. "34": ["[晕]", "data:image/gif;base64,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"]
  2198. };
  2199. //工具类
  2200. var tool = new function() {
  2201. //格式化时间戳
  2202. //format格式如下:
  2203. //yyyy-MM-dd hh:mm:ss 年月日时分秒(默认格式)
  2204. //yyyy-MM-dd 年月日
  2205. //hh:mm:ss 时分秒
  2206. this.formatTimeStamp = function(timestamp, format) {
  2207. if (!timestamp) {
  2208. return 0;
  2209. }
  2210. var formatTime;
  2211. format = format || 'yyyy-MM-dd hh:mm:ss';
  2212. var date = new Date(timestamp * 1000);
  2213. var o = {
  2214. 'M+': date.getMonth() + 1, //月份
  2215. 'd+': date.getDate(), //日
  2216. 'h+': date.getHours(), //小时
  2217. 'm+': date.getMinutes(), //分
  2218. 's+': date.getSeconds() //秒
  2219. };
  2220. if (/(y+)/.test(format)) {
  2221. formatTime = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  2222. } else {
  2223. formatTime = format;
  2224. }
  2225. for (var k in o) {
  2226. if (new RegExp('(' + k + ')').test(formatTime))
  2227. formatTime = formatTime.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
  2228. }
  2229. return formatTime;
  2230. };
  2231. //根据群类型英文名转换成中文名
  2232. this.groupTypeEn2Ch = function(type_en) {
  2233. var type_ch = null;
  2234. switch (type_en) {
  2235. case 'Public':
  2236. type_ch = '公开群';
  2237. break;
  2238. case 'ChatRoom':
  2239. type_ch = '聊天室';
  2240. break;
  2241. case 'Private':
  2242. type_ch = '私有群'; //即讨论组
  2243. break;
  2244. case 'AVChatRoom':
  2245. type_ch = '直播聊天室';
  2246. break;
  2247. default:
  2248. type_ch = type_en;
  2249. break;
  2250. }
  2251. return type_ch;
  2252. };
  2253. //根据群类型中文名转换成英文名
  2254. this.groupTypeCh2En = function(type_ch) {
  2255. var type_en = null;
  2256. switch (type_ch) {
  2257. case '公开群':
  2258. type_en = 'Public';
  2259. break;
  2260. case '聊天室':
  2261. type_en = 'ChatRoom';
  2262. break;
  2263. case '私有群': //即讨论组
  2264. type_en = 'Private';
  2265. break;
  2266. case '直播聊天室':
  2267. type_en = 'AVChatRoom';
  2268. break;
  2269. default:
  2270. type_en = type_ch;
  2271. break;
  2272. }
  2273. return type_en;
  2274. };
  2275. //根据群身份英文名转换成群身份中文名
  2276. this.groupRoleEn2Ch = function(role_en) {
  2277. var role_ch = null;
  2278. switch (role_en) {
  2279. case 'Member':
  2280. role_ch = '成员';
  2281. break;
  2282. case 'Admin':
  2283. role_ch = '管理员';
  2284. break;
  2285. case 'Owner':
  2286. role_ch = '群主';
  2287. break;
  2288. default:
  2289. role_ch = role_en;
  2290. break;
  2291. }
  2292. return role_ch;
  2293. };
  2294. //根据群身份中文名转换成群身份英文名
  2295. this.groupRoleCh2En = function(role_ch) {
  2296. var role_en = null;
  2297. switch (role_ch) {
  2298. case '成员':
  2299. role_en = 'Member';
  2300. break;
  2301. case '管理员':
  2302. role_en = 'Admin';
  2303. break;
  2304. case '群主':
  2305. role_en = 'Owner';
  2306. break;
  2307. default:
  2308. role_en = role_ch;
  2309. break;
  2310. }
  2311. return role_en;
  2312. };
  2313. //根据群消息提示类型英文转换中文
  2314. this.groupMsgFlagEn2Ch = function(msg_flag_en) {
  2315. var msg_flag_ch = null;
  2316. switch (msg_flag_en) {
  2317. case 'AcceptAndNotify':
  2318. msg_flag_ch = '接收并提示';
  2319. break;
  2320. case 'AcceptNotNotify':
  2321. msg_flag_ch = '接收不提示';
  2322. break;
  2323. case 'Discard':
  2324. msg_flag_ch = '屏蔽';
  2325. break;
  2326. default:
  2327. msg_flag_ch = msg_flag_en;
  2328. break;
  2329. }
  2330. return msg_flag_ch;
  2331. };
  2332. //根据群消息提示类型中文名转换英文名
  2333. this.groupMsgFlagCh2En = function(msg_flag_ch) {
  2334. var msg_flag_en = null;
  2335. switch (msg_flag_ch) {
  2336. case '接收并提示':
  2337. msg_flag_en = 'AcceptAndNotify';
  2338. break;
  2339. case '接收不提示':
  2340. msg_flag_en = 'AcceptNotNotify';
  2341. break;
  2342. case '屏蔽':
  2343. msg_flag_en = 'Discard';
  2344. break;
  2345. default:
  2346. msg_flag_en = msg_flag_ch;
  2347. break;
  2348. }
  2349. return msg_flag_en;
  2350. };
  2351. //将空格和换行符转换成HTML标签
  2352. this.formatText2Html = function(text) {
  2353. var html = text;
  2354. if (html) {
  2355. html = this.xssFilter(html); //用户昵称或群名称等字段会出现脚本字符串
  2356. html = html.replace(/ /g, '&nbsp;');
  2357. html = html.replace(/\n/g, '<br/>');
  2358. }
  2359. return html;
  2360. };
  2361. //将HTML标签转换成空格和换行符
  2362. this.formatHtml2Text = function(html) {
  2363. var text = html;
  2364. if (text) {
  2365. text = text.replace(/&nbsp;/g, ' ');
  2366. text = text.replace(/<br\/>/g, '\n');
  2367. }
  2368. return text;
  2369. };
  2370. //获取字符串(UTF-8编码)所占字节数
  2371. //参考:http://zh.wikipedia.org/zh-cn/UTF-8
  2372. this.getStrBytes = function(str) {
  2373. if (str == null || str === undefined) return 0;
  2374. if (typeof str != 'string') {
  2375. return 0;
  2376. }
  2377. var total = 0,
  2378. charCode,
  2379. i,
  2380. len;
  2381. for (i = 0, len = str.length; i < len; i++) {
  2382. charCode = str.charCodeAt(i);
  2383. if (charCode <= 0x007f) {
  2384. total += 1; //字符代码在000000 – 00007F之间的,用一个字节编码
  2385. } else if (charCode <= 0x07ff) {
  2386. total += 2; //000080 – 0007FF之间的字符用两个字节
  2387. } else if (charCode <= 0xffff) {
  2388. total += 3; //000800 – 00D7FF 和 00E000 – 00FFFF之间的用三个字节,注: Unicode在范围 D800-DFFF 中不存在任何字符
  2389. } else {
  2390. total += 4; //010000 – 10FFFF之间的用4个字节
  2391. }
  2392. }
  2393. return total;
  2394. };
  2395. //防止XSS攻击
  2396. this.xssFilter = function(val) {
  2397. val = val.toString();
  2398. val = val.replace(/[<]/g, '&lt;');
  2399. val = val.replace(/[>]/g, '&gt;');
  2400. val = val.replace(/"/g, '&quot;');
  2401. //val = val.replace(/'/g, "&#039;");
  2402. return val;
  2403. };
  2404. //去掉头尾空白符
  2405. this.trimStr = function(str) {
  2406. if (!str) return '';
  2407. str = str.toString();
  2408. return str.replace(/(^\s*)|(\s*$)/g, '');
  2409. };
  2410. //判断是否为8位整数
  2411. this.validNumber = function(str) {
  2412. str = str.toString();
  2413. return str.match(/(^\d{1,8}$)/g);
  2414. };
  2415. this.getReturnError = function(errorInfo, errorCode) {
  2416. if (!errorCode) {
  2417. errorCode = -100;
  2418. }
  2419. var error = {
  2420. ActionStatus: ACTION_STATUS.FAIL,
  2421. ErrorCode: errorCode,
  2422. ErrorInfo: errorInfo + '[' + errorCode + ']'
  2423. };
  2424. return error;
  2425. };
  2426. //设置cookie
  2427. //name 名字
  2428. //value 值
  2429. //expires 有效期(单位:秒)
  2430. //path
  2431. //domain 作用域
  2432. this.setCookie = function(name, value, expires, path, domain) {
  2433. var exp = new Date();
  2434. exp.setTime(exp.getTime() + expires * 1000);
  2435. document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString();
  2436. };
  2437. //获取cookie
  2438. this.getCookie = function(name) {
  2439. var result = document.cookie.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)'));
  2440. if (result != null) {
  2441. return unescape(result[2]);
  2442. }
  2443. return null;
  2444. };
  2445. //删除cookie
  2446. this.delCookie = function(name) {
  2447. var exp = new Date();
  2448. exp.setTime(exp.getTime() - 1);
  2449. var value = this.getCookie(name);
  2450. if (value != null) document.cookie = name + '=' + escape(value) + ';expires=' + exp.toGMTString();
  2451. };
  2452. //根据名字获取url参数值
  2453. this.getQueryString = function(name) {
  2454. var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
  2455. var r = window.location.search.substr(1).match(reg);
  2456. if (r != null) return unescape(r[2]);
  2457. return null;
  2458. };
  2459. //判断IE版本号,ver表示版本号
  2460. this.isIE = function(ver) {
  2461. var b = document.createElement('b');
  2462. b.innerHTML = '<!--[if IE ' + ver + ']><i></i><![endif]-->';
  2463. return b.getElementsByTagName('i').length === 1;
  2464. };
  2465. //判断浏览器版本
  2466. this.getBrowserInfo = function() {
  2467. var Sys = {};
  2468. var ua = navigator.userAgent.toLowerCase();
  2469. log.info('navigator.userAgent=' + ua);
  2470. var s;
  2471. (s = ua.match(/msie ([\d.]+)/))
  2472. ? (Sys.ie = s[1])
  2473. : (s = ua.match(/firefox\/([\d.]+)/))
  2474. ? (Sys.firefox = s[1])
  2475. : (s = ua.match(/chrome\/([\d.]+)/))
  2476. ? (Sys.chrome = s[1])
  2477. : (s = ua.match(/opera.([\d.]+)/))
  2478. ? (Sys.opera = s[1])
  2479. : (s = ua.match(/version\/([\d.]+).*safari/))
  2480. ? (Sys.safari = s[1])
  2481. : 0;
  2482. if (Sys.ie) {
  2483. //Js判断为IE浏览器
  2484. //ie10的判断这里有个问题
  2485. // Mozilla/5.0 (compatible; MSIE 9.0; qdesk 2.5.1277.202; Windows NT 6.1; WOW64; Trident/6.0)
  2486. // 是IE10 而不是IE9
  2487. if (ua.match(/trident\/(\d)\./) && ua.match(/trident\/(\d)\./)[1] == 6) {
  2488. Sys.ie = 10;
  2489. }
  2490. return {
  2491. type: 'ie',
  2492. ver: Sys.ie
  2493. };
  2494. }
  2495. if (Sys.firefox) {
  2496. //Js判断为火狐(firefox)浏览器
  2497. return {
  2498. type: 'firefox',
  2499. ver: Sys.firefox
  2500. };
  2501. }
  2502. if (Sys.chrome) {
  2503. //Js判断为谷歌chrome浏览器
  2504. return {
  2505. type: 'chrome',
  2506. ver: Sys.chrome
  2507. };
  2508. }
  2509. if (Sys.opera) {
  2510. //Js判断为opera浏览器
  2511. return {
  2512. type: 'opera',
  2513. ver: Sys.opera
  2514. };
  2515. }
  2516. if (Sys.safari) {
  2517. //Js判断为苹果safari浏览器
  2518. return {
  2519. type: 'safari',
  2520. ver: Sys.safari
  2521. };
  2522. }
  2523. return {
  2524. type: 'unknow',
  2525. ver: -1
  2526. };
  2527. };
  2528. this.replaceObject = function(keyMap, json) {
  2529. for (var a in json) {
  2530. if (keyMap[a]) {
  2531. json[keyMap[a]] = json[a];
  2532. delete json[a];
  2533. if (json[keyMap[a]] instanceof Array) {
  2534. var len = json[keyMap[a]].length;
  2535. for (var i = 0; i < len; i++) {
  2536. json[keyMap[a]][i] = this.replaceObject(keyMap, json[keyMap[a]][i]);
  2537. }
  2538. } else if (typeof json[keyMap[a]] === 'object') {
  2539. json[keyMap[a]] = this.replaceObject(keyMap, json[keyMap[a]]);
  2540. }
  2541. }
  2542. }
  2543. return json;
  2544. };
  2545. }();
  2546. //日志对象
  2547. var log = new function() {
  2548. var on = true;
  2549. this.setOn = function(onFlag) {
  2550. on = onFlag;
  2551. };
  2552. this.getOn = function() {
  2553. return on;
  2554. };
  2555. this.error = function(logStr) {
  2556. try {
  2557. on && console.error(logStr);
  2558. } catch (e) {}
  2559. };
  2560. this.warn = function(logStr) {
  2561. try {
  2562. on && console.warn(logStr);
  2563. } catch (e) {}
  2564. };
  2565. this.info = function(logStr) {
  2566. try {
  2567. on && console.info(logStr);
  2568. } catch (e) {}
  2569. };
  2570. this.debug = function(logStr) {
  2571. try {
  2572. on && console.debug(logStr);
  2573. } catch (e) {}
  2574. };
  2575. }();
  2576. //获取unix时间戳
  2577. var unixtime = function(d) {
  2578. if (!d) d = new Date();
  2579. return Math.round(d.getTime() / 1000);
  2580. };
  2581. //时间戳转日期
  2582. var fromunixtime = function(t) {
  2583. return new Date(t * 1000);
  2584. };
  2585. //获取下一个消息序号
  2586. var nextSeq = function() {
  2587. if (curSeq) {
  2588. curSeq = curSeq + 1;
  2589. } else {
  2590. curSeq = Math.round(Math.random() * 10000000);
  2591. }
  2592. return curSeq;
  2593. };
  2594. //产生随机数
  2595. var createRandom = function() {
  2596. return Math.round(Math.random() * 4294967296);
  2597. };
  2598. //获取ajax请求对象
  2599. var getXmlHttp = function() {
  2600. var xmlhttp = null;
  2601. if (window.XMLHttpRequest) {
  2602. xmlhttp = new XMLHttpRequest();
  2603. } else {
  2604. try {
  2605. xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
  2606. } catch (e) {
  2607. try {
  2608. xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
  2609. } catch (e) {
  2610. return null;
  2611. }
  2612. }
  2613. }
  2614. return xmlhttp;
  2615. };
  2616. //发起ajax请求
  2617. var ajaxRequest = function(meth, url, req, timeout, content_type, isLongPolling, cbOk, cbErr) {
  2618. var xmlHttpObj = getXmlHttp();
  2619. var error, errInfo;
  2620. if (!xmlHttpObj) {
  2621. errInfo = '创建请求失败';
  2622. var error = tool.getReturnError(errInfo, -1);
  2623. log.error(errInfo);
  2624. if (cbErr) cbErr(error);
  2625. return;
  2626. }
  2627. //保存ajax请求对象
  2628. xmlHttpObjSeq++;
  2629. xmlHttpObjMap[xmlHttpObjSeq] = xmlHttpObj;
  2630. xmlHttpObj.open(meth, url, true);
  2631. xmlHttpObj.onreadystatechange = function() {
  2632. if (xmlHttpObj.readyState == 4) {
  2633. xmlHttpObjMap[xmlHttpObjSeq] = null; //清空
  2634. if (xmlHttpObj.status == 200) {
  2635. if (cbOk) cbOk(xmlHttpObj.responseText);
  2636. xmlHttpObj = null;
  2637. curLongPollingRetErrorCount = curBigGroupLongPollingRetErrorCount = 0;
  2638. } else {
  2639. xmlHttpObj = null;
  2640. //避免刷新的时候,由于abord ajax引起的错误回调
  2641. setTimeout(function() {
  2642. var errInfo = '请求服务器失败,请检查你的网络是否正常';
  2643. var error = tool.getReturnError(errInfo, -2);
  2644. //if (!isLongPolling && cbErr) cbErr(error);
  2645. if (isLongPolling && onLongPullingNotify) {
  2646. onLongPullingNotify(error);
  2647. }
  2648. if (cbErr) cbErr(error);
  2649. }, 16);
  2650. }
  2651. }
  2652. };
  2653. xmlHttpObj.setRequestHeader('Content-Type', content_type);
  2654. //设置超时时间
  2655. if (!timeout) {
  2656. timeout = ajaxDefaultTimeOut; //设置ajax默认超时时间
  2657. }
  2658. if (timeout) {
  2659. xmlHttpObj.timeout = timeout;
  2660. xmlHttpObj.ontimeout = function(event) {
  2661. xmlHttpObj = null;
  2662. //var errInfo = "请求服务器超时";
  2663. //var error = tool.getReturnError(errInfo, -3);
  2664. //if (cbErr) cbErr(error);
  2665. };
  2666. }
  2667. //
  2668. if (xmlHttpObj.overrideMimeType) {
  2669. // xmlHttpObj.overrideMimeType("application/json;charset=utf-8");
  2670. }
  2671. xmlHttpObj.send(req);
  2672. };
  2673. //发起ajax请求(json格式数据)
  2674. var ajaxRequestJson = function(meth, url, req, timeout, content_type, isLongPolling, cbOk, cbErr) {
  2675. ajaxRequest(
  2676. meth,
  2677. url,
  2678. JSON.stringify(req),
  2679. timeout,
  2680. content_type,
  2681. isLongPolling,
  2682. function(resp) {
  2683. var json = null;
  2684. if (resp) json = JSON.parse(resp); //将返回的json字符串转换成json对象
  2685. if (isLongPolling && onLongPullingNotify) {
  2686. onLongPullingNotify(json);
  2687. }
  2688. if (cbOk) cbOk(json);
  2689. },
  2690. cbErr
  2691. );
  2692. };
  2693. //判断用户是否已登录
  2694. var isLogin = function() {
  2695. return ctx.sdkAppID && ctx.identifier;
  2696. };
  2697. //检查是否登录
  2698. var checkLogin = function(cbErr, isNeedCallBack) {
  2699. if (!isLogin()) {
  2700. if (isNeedCallBack) {
  2701. var errInfo = '请登录';
  2702. var error = tool.getReturnError(errInfo, -4);
  2703. if (cbErr) cbErr(error);
  2704. }
  2705. return false;
  2706. }
  2707. return true;
  2708. };
  2709. //检查是否访问正式环境
  2710. var isAccessFormalEnv = function() {
  2711. return isAccessFormaEnvironment;
  2712. };
  2713. //根据不同的服务名和命令,获取对应的接口地址
  2714. var getApiUrl = function(srvName, cmd, cbOk, cbErr) {
  2715. var srvHost = SRV_HOST;
  2716. if (isAccessFormalEnv()) {
  2717. srvHost = SRV_HOST.FORMAL.COMMON;
  2718. } else {
  2719. srvHost = SRV_HOST.TEST.COMMON;
  2720. }
  2721. //if (srvName == SRV_NAME.RECENT_CONTACT) {
  2722. // srvHost = SRV_HOST.TEST.COMMON;
  2723. //}
  2724. if (srvName == SRV_NAME.PIC) {
  2725. if (isAccessFormalEnv()) {
  2726. srvHost = SRV_HOST.FORMAL.PIC;
  2727. } else {
  2728. srvHost = SRV_HOST.TEST.PIC;
  2729. }
  2730. }
  2731. var url =
  2732. srvHost +
  2733. '/' +
  2734. SRV_NAME_VER[srvName] +
  2735. '/' +
  2736. srvName +
  2737. '/' +
  2738. cmd +
  2739. '?websdkappid=' +
  2740. SDK.APPID +
  2741. '&v=' +
  2742. SDK.VERSION +
  2743. '&platform=' +
  2744. SDK.PLAATFORM;
  2745. if (isLogin()) {
  2746. if (cmd == 'login' || cmd == 'accesslayer') {
  2747. url += '&identifier=' + encodeURIComponent(ctx.identifier) + '&usersig=' + ctx.userSig;
  2748. } else {
  2749. if (ctx.tinyid && ctx.a2) {
  2750. url += '&tinyid=' + ctx.tinyid + '&a2=' + ctx.a2;
  2751. } else {
  2752. if (cbErr) {
  2753. log.error('tinyid或a2为空[' + srvName + '][' + cmd + ']');
  2754. cbErr(tool.getReturnError('tinyid或a2为空[' + srvName + '][' + cmd + ']', -5));
  2755. return false;
  2756. }
  2757. }
  2758. }
  2759. url += '&contenttype=' + ctx.contentType;
  2760. }
  2761. url += '&sdkappid=' + ctx.sdkAppID + '&accounttype=' + ctx.accountType + '&apn=' + ctx.apn + '&reqtime=' + unixtime();
  2762. return url;
  2763. };
  2764. //获取语音下载url
  2765. var getSoundDownUrl = function(uuid, senderId) {
  2766. var soundUrl = null;
  2767. if (authkey && ipList[0]) {
  2768. soundUrl =
  2769. 'http://' +
  2770. ipList[0] +
  2771. '/asn.com/stddownload_common_file?authkey=' +
  2772. authkey +
  2773. '&bid=' +
  2774. DOWNLOAD_FILE.BUSSINESS_ID +
  2775. '&subbid=' +
  2776. ctx.sdkAppID +
  2777. '&fileid=' +
  2778. uuid +
  2779. '&filetype=' +
  2780. DOWNLOAD_FILE_TYPE.SOUND +
  2781. '&openid=' +
  2782. senderId +
  2783. '&ver=0';
  2784. } else {
  2785. log.error('拼接语音下载url不报错:ip或者authkey为空');
  2786. }
  2787. return soundUrl;
  2788. };
  2789. //获取文件下载地址
  2790. var getFileDownUrl = function(uuid, senderId, fileName) {
  2791. var fileUrl = null;
  2792. if (authkey && ipList[0]) {
  2793. fileUrl =
  2794. 'http://' +
  2795. ipList[0] +
  2796. '/asn.com/stddownload_common_file?authkey=' +
  2797. authkey +
  2798. '&bid=' +
  2799. DOWNLOAD_FILE.BUSSINESS_ID +
  2800. '&subbid=' +
  2801. ctx.sdkAppID +
  2802. '&fileid=' +
  2803. uuid +
  2804. '&filetype=' +
  2805. DOWNLOAD_FILE_TYPE.FILE +
  2806. '&openid=' +
  2807. senderId +
  2808. '&ver=0&filename=' +
  2809. encodeURIComponent(fileName);
  2810. } else {
  2811. log.error('拼接文件下载url不报错:ip或者authkey为空');
  2812. }
  2813. Resources.downloadMap['uuid_' + uuid] = fileUrl;
  2814. return fileUrl;
  2815. };
  2816. //获取文件下载地址
  2817. var getFileDownUrlV2 = function(uuid, senderId, fileName, downFlag, receiverId, busiId, type) {
  2818. var options = {
  2819. From_Account: senderId, //"identifer_0", // 类型: String, 发送者tinyid
  2820. To_Account: receiverId, //"identifer_1", // 类型: String, 接收者tinyid
  2821. os_platform: 10, // 类型: Number, 终端的类型 1(android) 2(ios) 3(windows) 10(others...)
  2822. Timestamp: unixtime().toString(), // 类型: Number, 时间戳
  2823. Random: createRandom().toString(), // 类型: Number, 随机值
  2824. request_info: [
  2825. // 类型: Array
  2826. {
  2827. busi_id: busiId, // 类型: Number, 群(1) C2C(2) 其他请联系sdk开发者分配
  2828. download_flag: downFlag, // 类型: Number, 申请下载地址标识 0(申请架平下载地址) 1(申请COS平台下载地址) 2(不需要申请, 直接拿url下载(这里应该不会为2))
  2829. type: type, // 类型: Number, 0(短视频缩略图), 1(文件), 2(短视频), 3(ptt), 其他待分配
  2830. uuid: uuid, // 类型: Number, 唯一标识一个文件的uuid
  2831. version: VERSION_INFO.SERVER_VERSION, // 类型: Number, 架平server版本
  2832. auth_key: authkey, // 类型: String, 认证签名
  2833. ip: ipList[0] // 类型: Number, 架平IP
  2834. }
  2835. ]
  2836. };
  2837. //获取下载地址
  2838. proto_applyDownload(
  2839. options,
  2840. function(resp) {
  2841. if (resp.error_code == 0 && resp.response_info) {
  2842. Resources.downloadMap['uuid_' + options.uuid] = resp.response_info.url;
  2843. }
  2844. if (onAppliedDownloadUrl) {
  2845. onAppliedDownloadUrl({
  2846. uuid: options.uuid,
  2847. url: resp.response_info.url,
  2848. maps: Resources.downloadMap
  2849. });
  2850. }
  2851. },
  2852. function(resp) {
  2853. log.error('获取下载地址失败', options.uuid);
  2854. }
  2855. );
  2856. };
  2857. //重置ajax请求
  2858. var clearXmlHttpObjMap = function() {
  2859. //遍历xmlHttpObjMap{}
  2860. for (var seq in xmlHttpObjMap) {
  2861. var xmlHttpObj = xmlHttpObjMap[seq];
  2862. if (xmlHttpObj) {
  2863. xmlHttpObj.abort(); //中断ajax请求(长轮询)
  2864. xmlHttpObjMap[xmlHttpObjSeq] = null; //清空
  2865. }
  2866. }
  2867. xmlHttpObjSeq = 0;
  2868. xmlHttpObjMap = {};
  2869. };
  2870. //重置sdk全局变量
  2871. var clearSdk = function() {
  2872. clearXmlHttpObjMap();
  2873. //当前登录用户
  2874. ctx = {
  2875. sdkAppID: null,
  2876. appIDAt3rd: null,
  2877. accountType: null,
  2878. identifier: null,
  2879. identifierNick: null,
  2880. userSig: null,
  2881. contentType: 'json',
  2882. apn: 1
  2883. };
  2884. opt = {};
  2885. curSeq = 0;
  2886. //ie8,9采用jsonp方法解决ajax跨域限制
  2887. jsonpRequestId = 0; //jsonp请求id
  2888. //最新jsonp请求返回的json数据
  2889. jsonpLastRspData = null;
  2890. apiReportItems = [];
  2891. MsgManager.clear();
  2892. MsgStore.clear();
  2893. //重置longpollingId
  2894. LongPollingId = null;
  2895. };
  2896. //登录
  2897. var _login = function(loginInfo, listeners, options, cbOk, cbErr) {
  2898. clearSdk();
  2899. if (options) opt = options;
  2900. if (opt.isAccessFormalEnv == false) {
  2901. log.error('请切换为正式环境!!!!');
  2902. isAccessFormaEnvironment = opt.isAccessFormalEnv;
  2903. }
  2904. if (opt.isLogOn == false) {
  2905. log.setOn(opt.isLogOn);
  2906. }
  2907. /*
  2908. if(opt.emotions){
  2909. emotions=opt.emotions;
  2910. webim.Emotions= emotions;
  2911. }
  2912. if(opt.emotionDataIndexs){
  2913. emotionDataIndexs=opt.emotionDataIndexs;
  2914. webim.EmotionDataIndexs= emotionDataIndexs;
  2915. }*/
  2916. if (!loginInfo) {
  2917. if (cbErr) {
  2918. cbErr(tool.getReturnError('loginInfo is empty', -6));
  2919. return;
  2920. }
  2921. }
  2922. if (!loginInfo.sdkAppID) {
  2923. if (cbErr) {
  2924. cbErr(tool.getReturnError('loginInfo.sdkAppID is empty', -7));
  2925. return;
  2926. }
  2927. }
  2928. if (!loginInfo.accountType) {
  2929. if (cbErr) {
  2930. cbErr(tool.getReturnError('loginInfo.accountType is empty', -8));
  2931. return;
  2932. }
  2933. }
  2934. if (loginInfo.identifier) {
  2935. ctx.identifier = loginInfo.identifier.toString();
  2936. }
  2937. if (loginInfo.identifier && !loginInfo.userSig) {
  2938. if (cbErr) {
  2939. cbErr(tool.getReturnError('loginInfo.userSig is empty', -9));
  2940. return;
  2941. }
  2942. }
  2943. if (loginInfo.userSig) {
  2944. ctx.userSig = loginInfo.userSig.toString();
  2945. }
  2946. ctx.sdkAppID = loginInfo.sdkAppID;
  2947. ctx.accountType = loginInfo.accountType;
  2948. if (ctx.identifier && ctx.userSig) {
  2949. //带登录态
  2950. proto_accesslayer(function() {
  2951. //登录
  2952. proto_login(function(identifierNick, headurl) {
  2953. MsgManager.init(
  2954. listeners,
  2955. function(mmInitResp) {
  2956. if (cbOk) {
  2957. mmInitResp.identifierNick = identifierNick;
  2958. mmInitResp.headurl = headurl;
  2959. cbOk(mmInitResp);
  2960. }
  2961. },
  2962. cbErr
  2963. );
  2964. }, cbErr);
  2965. });
  2966. } else {
  2967. //不带登录态,进入直播场景sdk
  2968. MsgManager.init(listeners, cbOk, cbErr);
  2969. }
  2970. };
  2971. //初始化浏览器信息
  2972. var initBrowserInfo = function() {
  2973. //初始化浏览器类型
  2974. BROWSER_INFO = tool.getBrowserInfo();
  2975. log.info('BROWSER_INFO: type=' + BROWSER_INFO.type + ', ver=' + BROWSER_INFO.ver);
  2976. if (BROWSER_INFO.type == 'ie') {
  2977. if (parseInt(BROWSER_INFO.ver) < 10) {
  2978. lowerBR = true;
  2979. }
  2980. }
  2981. };
  2982. //接口质量上报
  2983. var reportApiQuality = function(cmd, errorCode, errorInfo) {
  2984. if (cmd == 'longpolling' && (errorCode == longPollingTimeOutErrorCode || errorCode == longPollingKickedErrorCode)) {
  2985. //longpolling 返回60008错误可以视为正常,可以不上报
  2986. return;
  2987. }
  2988. var eventId = CMD_EVENT_ID_MAP[cmd];
  2989. if (eventId) {
  2990. var reportTime = unixtime();
  2991. var uniqKey = null;
  2992. var msgCmdErrorCode = {
  2993. Code: errorCode,
  2994. ErrMsg: errorInfo
  2995. };
  2996. if (ctx.a2) {
  2997. uniqKey = ctx.a2.substring(0, 10) + '_' + reportTime + '_' + createRandom();
  2998. } else if (ctx.userSig) {
  2999. uniqKey = ctx.userSig.substring(0, 10) + '_' + reportTime + '_' + createRandom();
  3000. }
  3001. if (uniqKey) {
  3002. var rptEvtItem = {
  3003. UniqKey: uniqKey,
  3004. EventId: eventId,
  3005. ReportTime: reportTime,
  3006. MsgCmdErrorCode: msgCmdErrorCode
  3007. };
  3008. if (cmd == 'login') {
  3009. var loginApiReportItems = [];
  3010. loginApiReportItems.push(rptEvtItem);
  3011. var loginReportOpt = {
  3012. EvtItems: loginApiReportItems,
  3013. MainVersion: SDK.VERSION,
  3014. Version: '0'
  3015. };
  3016. proto_reportApiQuality(
  3017. loginReportOpt,
  3018. function(resp) {
  3019. loginApiReportItems = null; //
  3020. },
  3021. function(err) {
  3022. loginApiReportItems = null; //
  3023. }
  3024. );
  3025. } else {
  3026. apiReportItems.push(rptEvtItem);
  3027. if (apiReportItems.length >= maxApiReportItemCount) {
  3028. //累计一定条数再上报
  3029. var reportOpt = {
  3030. EvtItems: apiReportItems,
  3031. MainVersion: SDK.VERSION,
  3032. Version: '0'
  3033. };
  3034. proto_reportApiQuality(
  3035. reportOpt,
  3036. function(resp) {
  3037. apiReportItems = []; //清空
  3038. },
  3039. function(err) {
  3040. apiReportItems = []; //清空
  3041. }
  3042. );
  3043. }
  3044. }
  3045. }
  3046. }
  3047. };
  3048. var proto_accesslayer = function(callback) {
  3049. ConnManager.apiCall(
  3050. SRV_NAME.WEB_IM,
  3051. 'accesslayer',
  3052. {},
  3053. function(data) {
  3054. if (data.ErrorCode === 0 && data.WebImAccessLayer === 1) {
  3055. SRV_HOST.FORMAL.COMMON = 'https://events.tim.qq.com';
  3056. }
  3057. callback();
  3058. },
  3059. function() {
  3060. callback();
  3061. }
  3062. );
  3063. };
  3064. // REST API calls
  3065. //上线
  3066. var proto_login = function(cbOk, cbErr) {
  3067. ConnManager.apiCall(
  3068. SRV_NAME.OPEN_IM,
  3069. 'login',
  3070. {
  3071. State: 'Online'
  3072. },
  3073. function(loginResp) {
  3074. if (loginResp.TinyId) {
  3075. ctx.tinyid = loginResp.TinyId;
  3076. } else {
  3077. if (cbErr) {
  3078. cbErr(tool.getReturnError('TinyId is empty', -10));
  3079. return;
  3080. }
  3081. }
  3082. if (loginResp.A2Key) {
  3083. ctx.a2 = loginResp.A2Key;
  3084. } else {
  3085. if (cbErr) {
  3086. cbErr(tool.getReturnError('A2Key is empty', -11));
  3087. return;
  3088. }
  3089. }
  3090. var tag_list = ['Tag_Profile_IM_Nick', 'Tag_Profile_IM_Image'];
  3091. var options = {
  3092. From_Account: ctx.identifier,
  3093. To_Account: [ctx.identifier],
  3094. LastStandardSequence: 0,
  3095. TagList: tag_list
  3096. };
  3097. proto_getProfilePortrait(
  3098. options,
  3099. function(resp) {
  3100. var nick, image;
  3101. if (resp.UserProfileItem && resp.UserProfileItem.length > 0) {
  3102. for (var i in resp.UserProfileItem) {
  3103. for (var j in resp.UserProfileItem[i].ProfileItem) {
  3104. switch (resp.UserProfileItem[i].ProfileItem[j].Tag) {
  3105. case 'Tag_Profile_IM_Nick':
  3106. nick = resp.UserProfileItem[i].ProfileItem[j].Value;
  3107. if (nick) ctx.identifierNick = nick;
  3108. break;
  3109. case 'Tag_Profile_IM_Image':
  3110. image = resp.UserProfileItem[i].ProfileItem[j].Value;
  3111. if (image) ctx.headurl = image;
  3112. break;
  3113. }
  3114. }
  3115. }
  3116. }
  3117. if (cbOk) cbOk(ctx.identifierNick, ctx.headurl); //回传当前用户昵称
  3118. },
  3119. cbErr
  3120. );
  3121. },
  3122. cbErr
  3123. );
  3124. };
  3125. //下线
  3126. var proto_logout = function(type, cbOk, cbErr) {
  3127. if (!checkLogin(cbErr, false)) {
  3128. //不带登录态
  3129. clearSdk();
  3130. if (cbOk)
  3131. cbOk({
  3132. ActionStatus: ACTION_STATUS.OK,
  3133. ErrorCode: 0,
  3134. ErrorInfo: 'logout success'
  3135. });
  3136. return;
  3137. }
  3138. if (type == 'all') {
  3139. ConnManager.apiCall(
  3140. SRV_NAME.OPEN_IM,
  3141. 'logout',
  3142. {},
  3143. function(resp) {
  3144. clearSdk();
  3145. if (cbOk) cbOk(resp);
  3146. },
  3147. cbErr
  3148. );
  3149. } else {
  3150. ConnManager.apiCall(
  3151. SRV_NAME.OPEN_IM,
  3152. 'longpollinglogout',
  3153. {
  3154. LongPollingId: LongPollingId
  3155. },
  3156. function(resp) {
  3157. clearSdk();
  3158. if (cbOk) cbOk(resp);
  3159. },
  3160. cbErr
  3161. );
  3162. }
  3163. };
  3164. //发送消息,包括私聊和群聊
  3165. var proto_sendMsg = function(msg, cbOk, cbErr) {
  3166. if (!checkLogin(cbErr, true)) return;
  3167. var msgInfo = null;
  3168. switch (msg.sess.type()) {
  3169. case SESSION_TYPE.C2C:
  3170. msgInfo = {
  3171. From_Account: ctx.identifier,
  3172. To_Account: msg.sess.id().toString(),
  3173. MsgTimeStamp: msg.time,
  3174. MsgSeq: msg.seq,
  3175. MsgRandom: msg.random,
  3176. MsgBody: [],
  3177. OfflinePushInfo: msg.offlinePushInfo
  3178. };
  3179. break;
  3180. case SESSION_TYPE.GROUP:
  3181. var subType = msg.getSubType();
  3182. msgInfo = {
  3183. GroupId: msg.sess.id().toString(),
  3184. From_Account: ctx.identifier,
  3185. Random: msg.random,
  3186. MsgBody: []
  3187. };
  3188. switch (subType) {
  3189. case GROUP_MSG_SUB_TYPE.COMMON:
  3190. msgInfo.MsgPriority = 'COMMON';
  3191. break;
  3192. case GROUP_MSG_SUB_TYPE.REDPACKET:
  3193. msgInfo.MsgPriority = 'REDPACKET';
  3194. break;
  3195. case GROUP_MSG_SUB_TYPE.LOVEMSG:
  3196. msgInfo.MsgPriority = 'LOVEMSG';
  3197. break;
  3198. case GROUP_MSG_SUB_TYPE.TIP:
  3199. log.error('不能主动发送群提示消息,subType=' + subType);
  3200. break;
  3201. default:
  3202. log.error('发送群消息时,出现未知子消息类型:subType=' + subType);
  3203. return;
  3204. break;
  3205. }
  3206. break;
  3207. default:
  3208. break;
  3209. }
  3210. for (var i in msg.elems) {
  3211. var elem = msg.elems[i];
  3212. var msgContent = null;
  3213. var msgType = elem.type;
  3214. switch (msgType) {
  3215. case MSG_ELEMENT_TYPE.TEXT: //文本
  3216. msgContent = {
  3217. Text: elem.content.text
  3218. };
  3219. break;
  3220. case MSG_ELEMENT_TYPE.FACE: //表情
  3221. msgContent = {
  3222. Index: elem.content.index,
  3223. Data: elem.content.data
  3224. };
  3225. break;
  3226. case MSG_ELEMENT_TYPE.IMAGE: //图片
  3227. var ImageInfoArray = [];
  3228. for (var j in elem.content.ImageInfoArray) {
  3229. ImageInfoArray.push({
  3230. Type: elem.content.ImageInfoArray[j].type,
  3231. Size: elem.content.ImageInfoArray[j].size,
  3232. Width: elem.content.ImageInfoArray[j].width,
  3233. Height: elem.content.ImageInfoArray[j].height,
  3234. URL: elem.content.ImageInfoArray[j].url
  3235. });
  3236. }
  3237. msgContent = {
  3238. ImageFormat: elem.content.ImageFormat,
  3239. UUID: elem.content.UUID,
  3240. ImageInfoArray: ImageInfoArray
  3241. };
  3242. break;
  3243. case MSG_ELEMENT_TYPE.SOUND: //
  3244. log.warn('web端暂不支持发送语音消息');
  3245. continue;
  3246. break;
  3247. case MSG_ELEMENT_TYPE.LOCATION: //
  3248. log.warn('web端暂不支持发送地理位置消息');
  3249. continue;
  3250. break;
  3251. case MSG_ELEMENT_TYPE.FILE: //
  3252. msgContent = {
  3253. UUID: elem.content.uuid,
  3254. FileName: elem.content.name,
  3255. FileSize: elem.content.size,
  3256. DownloadFlag: elem.content.downFlag
  3257. };
  3258. break;
  3259. case MSG_ELEMENT_TYPE.CUSTOM: //
  3260. msgContent = {
  3261. Data: elem.content.data,
  3262. Desc: elem.content.desc,
  3263. Ext: elem.content.ext
  3264. };
  3265. msgType = MSG_ELEMENT_TYPE.CUSTOM;
  3266. break;
  3267. default:
  3268. log.warn('web端暂不支持发送' + elem.type + '消息');
  3269. continue;
  3270. break;
  3271. }
  3272. if (msg.PushInfoBoolean) {
  3273. msgInfo.OfflinePushInfo = msg.PushInfo; //当android终端进程被杀掉时才走push,IOS退到后台即可
  3274. }
  3275. msgInfo.MsgBody.push({
  3276. MsgType: msgType,
  3277. MsgContent: msgContent
  3278. });
  3279. }
  3280. if (msg.sess.type() == SESSION_TYPE.C2C) {
  3281. //私聊
  3282. ConnManager.apiCall(SRV_NAME.OPEN_IM, 'sendmsg', msgInfo, cbOk, cbErr);
  3283. } else if (msg.sess.type() == SESSION_TYPE.GROUP) {
  3284. //群聊
  3285. ConnManager.apiCall(SRV_NAME.GROUP, 'send_group_msg', msgInfo, cbOk, cbErr);
  3286. }
  3287. };
  3288. //长轮询接口
  3289. var proto_longPolling = function(options, cbOk, cbErr) {
  3290. if (!isAccessFormaEnvironment && typeof stopPolling != 'undefined' && stopPolling == true) {
  3291. return;
  3292. }
  3293. if (!checkLogin(cbErr, true)) return;
  3294. ConnManager.apiCall(SRV_NAME.OPEN_IM, 'longpolling', options, cbOk, cbErr, longPollingDefaultTimeOut, true);
  3295. };
  3296. //长轮询接口(拉取直播聊天室新消息)
  3297. var proto_bigGroupLongPolling = function(options, cbOk, cbErr, timeout) {
  3298. ConnManager.apiCall(SRV_NAME.BIG_GROUP_LONG_POLLING, 'get_msg', options, cbOk, cbErr, timeout);
  3299. };
  3300. //拉取未读c2c消息接口
  3301. var proto_getMsgs = function(cookie, syncFlag, cbOk, cbErr) {
  3302. if (!checkLogin(cbErr, true)) return;
  3303. ConnManager.apiCall(
  3304. SRV_NAME.OPEN_IM,
  3305. 'getmsg',
  3306. {
  3307. Cookie: cookie,
  3308. SyncFlag: syncFlag
  3309. },
  3310. function(resp) {
  3311. if (resp.MsgList && resp.MsgList.length) {
  3312. for (var i in resp.MsgList) {
  3313. tempC2CMsgList.push(resp.MsgList[i]);
  3314. }
  3315. }
  3316. if (resp.SyncFlag == 1) {
  3317. proto_getMsgs(resp.Cookie, resp.SyncFlag, cbOk, cbErr);
  3318. } else {
  3319. resp.MsgList = tempC2CMsgList;
  3320. tempC2CMsgList = [];
  3321. if (cbOk) cbOk(resp);
  3322. }
  3323. },
  3324. cbErr
  3325. );
  3326. };
  3327. //C2C消息已读上报接口
  3328. var proto_c2CMsgReaded = function(cookie, c2CMsgReadedItem, cbOk, cbErr) {
  3329. if (!checkLogin(cbErr, true)) return;
  3330. var tmpC2CMsgReadedItem = [];
  3331. for (var i in c2CMsgReadedItem) {
  3332. var item = {
  3333. To_Account: c2CMsgReadedItem[i].toAccount,
  3334. LastedMsgTime: c2CMsgReadedItem[i].lastedMsgTime
  3335. };
  3336. tmpC2CMsgReadedItem.push(item);
  3337. }
  3338. ConnManager.apiCall(
  3339. SRV_NAME.OPEN_IM,
  3340. 'msgreaded',
  3341. {
  3342. C2CMsgReaded: {
  3343. Cookie: cookie,
  3344. C2CMsgReadedItem: tmpC2CMsgReadedItem
  3345. }
  3346. },
  3347. cbOk,
  3348. cbErr
  3349. );
  3350. };
  3351. //删除c2c消息
  3352. var proto_deleteC2CMsg = function(options, cbOk, cbErr) {
  3353. if (!checkLogin(cbErr, true)) return;
  3354. ConnManager.apiCall(SRV_NAME.OPEN_IM, 'deletemsg', options, cbOk, cbErr);
  3355. };
  3356. //拉取c2c历史消息接口
  3357. var proto_getC2CHistoryMsgs = function(options, cbOk, cbErr) {
  3358. if (!checkLogin(cbErr, true)) return;
  3359. ConnManager.apiCall(
  3360. SRV_NAME.OPEN_IM,
  3361. 'getroammsg',
  3362. options,
  3363. function(resp) {
  3364. var reqMsgCount = options.MaxCnt;
  3365. var complete = resp.Complete;
  3366. var rspMsgCount = resp.MaxCnt;
  3367. var msgKey = resp.MsgKey;
  3368. var lastMsgTime = resp.LastMsgTime;
  3369. if (resp.MsgList && resp.MsgList.length) {
  3370. for (var i in resp.MsgList) {
  3371. tempC2CHistoryMsgList.push(resp.MsgList[i]);
  3372. }
  3373. }
  3374. var netxOptions = null;
  3375. if (complete == 0) {
  3376. //还有历史消息可拉取
  3377. if (rspMsgCount < reqMsgCount) {
  3378. netxOptions = {
  3379. Peer_Account: options.Peer_Account,
  3380. MaxCnt: reqMsgCount - rspMsgCount,
  3381. LastMsgTime: lastMsgTime,
  3382. MsgKey: msgKey
  3383. };
  3384. }
  3385. }
  3386. if (netxOptions) {
  3387. //继续拉取
  3388. proto_getC2CHistoryMsgs(netxOptions, cbOk, cbErr);
  3389. } else {
  3390. resp.MsgList = tempC2CHistoryMsgList;
  3391. tempC2CHistoryMsgList = [];
  3392. if (cbOk) cbOk(resp);
  3393. }
  3394. },
  3395. cbErr
  3396. );
  3397. };
  3398. //群组接口
  3399. //创建群组
  3400. //协议参考:https://www.qcloud.com/doc/product/269/1615
  3401. var proto_createGroup = function(options, cbOk, cbErr) {
  3402. if (!checkLogin(cbErr, true)) return;
  3403. var opt = {
  3404. //必填 群组形态,包括Public(公开群),Private(私有群),ChatRoom(聊天室),AVChatRoom(互动直播聊天室)。
  3405. Type: options.Type,
  3406. //必填 群名称,最长30字节。
  3407. Name: options.Name
  3408. };
  3409. var member_list = [];
  3410. //Array 选填 初始群成员列表,最多500个。成员信息字段详情参见:群成员资料。
  3411. for (var i = 0; i < options.MemberList.length; i++) {
  3412. member_list.push({
  3413. Member_Account: options.MemberList[i]
  3414. });
  3415. }
  3416. opt.MemberList = member_list;
  3417. //选填 为了使得群组ID更加简单,便于记忆传播,腾讯云支持APP在通过REST API创建群组时自定义群组ID。详情参见:自定义群组ID。
  3418. if (options.GroupId) {
  3419. opt.GroupId = options.GroupId;
  3420. }
  3421. //选填 群主id,自动添加到群成员中。如果不填,群没有群主。
  3422. if (options.Owner_Account) {
  3423. opt.Owner_Account = options.Owner_Account;
  3424. }
  3425. //选填 群简介,最长240字节。
  3426. if (options.Introduction) {
  3427. opt.Introduction = options.Introduction;
  3428. }
  3429. //选填 群公告,最长300字节。
  3430. if (options.Notification) {
  3431. opt.Notification = options.Notification;
  3432. }
  3433. //选填 最大群成员数量,最大为10000,不填默认为2000个。
  3434. if (options.MaxMemberCount) {
  3435. opt.MaxMemberCount = options.MaxMemberCount;
  3436. }
  3437. //选填 申请加群处理方式。包含FreeAccess(自由加入),NeedPermission(需要验证),DisableApply(禁止加群),不填默认为NeedPermission(需要验证)。
  3438. if (options.ApplyJoinOption) {
  3439. //
  3440. opt.ApplyJoinOption = options.ApplyJoinOption;
  3441. }
  3442. //Array 选填 群组维度的自定义字段,默认情况是没有的,需要开通,详情参见:自定义字段。
  3443. if (options.AppDefinedData) {
  3444. opt.AppDefinedData = options.AppDefinedData;
  3445. }
  3446. //选填 群头像URL,最长100字节。
  3447. if (options.FaceUrl) {
  3448. opt.FaceUrl = options.FaceUrl;
  3449. }
  3450. ConnManager.apiCall(SRV_NAME.GROUP, 'create_group', opt, cbOk, cbErr);
  3451. };
  3452. //创建群组-高级接口
  3453. //协议参考:https://www.qcloud.com/doc/product/269/1615
  3454. var proto_createGroupHigh = function(options, cbOk, cbErr) {
  3455. if (!checkLogin(cbErr, true)) return;
  3456. ConnManager.apiCall(SRV_NAME.GROUP, 'create_group', options, cbOk, cbErr);
  3457. };
  3458. //修改群组基本资料
  3459. //协议参考:https://www.qcloud.com/doc/product/269/1620
  3460. var proto_modifyGroupBaseInfo = function(options, cbOk, cbErr) {
  3461. if (!checkLogin(cbErr, true)) return;
  3462. ConnManager.apiCall(SRV_NAME.GROUP, 'modify_group_base_info', options, cbOk, cbErr);
  3463. };
  3464. //申请加群
  3465. var proto_applyJoinGroup = function(options, cbOk, cbErr) {
  3466. if (!checkLogin(cbErr, true)) return;
  3467. options.GroupId = String(options.GroupId);
  3468. ConnManager.apiCall(
  3469. SRV_NAME.GROUP,
  3470. 'apply_join_group',
  3471. {
  3472. GroupId: options.GroupId,
  3473. ApplyMsg: options.ApplyMsg,
  3474. UserDefinedField: options.UserDefinedField
  3475. },
  3476. cbOk,
  3477. cbErr
  3478. );
  3479. };
  3480. //申请加入大群
  3481. var BigGroupId;
  3482. var proto_applyJoinBigGroup = function(options, cbOk, cbErr) {
  3483. options.GroupId = String(options.GroupId);
  3484. BigGroupId = options.GroupId;
  3485. var srvName;
  3486. if (!checkLogin(cbErr, false)) {
  3487. //未登录
  3488. srvName = SRV_NAME.BIG_GROUP;
  3489. } else {
  3490. //已登录
  3491. srvName = SRV_NAME.GROUP;
  3492. }
  3493. ConnManager.apiCall(
  3494. srvName,
  3495. 'apply_join_group',
  3496. {
  3497. GroupId: options.GroupId,
  3498. ApplyMsg: options.ApplyMsg,
  3499. UserDefinedField: options.UserDefinedField
  3500. },
  3501. function(resp) {
  3502. if (resp.JoinedStatus && resp.JoinedStatus == 'JoinedSuccess') {
  3503. if (resp.LongPollingKey) {
  3504. MsgManager.setBigGroupLongPollingOn(true); //开启长轮询
  3505. MsgManager.setBigGroupLongPollingKey(resp.LongPollingKey); //更新大群长轮询key
  3506. MsgManager.setBigGroupLongPollingMsgMap(options.GroupId, 0); //收到的群消息置0
  3507. MsgManager.bigGroupLongPolling(); //开启长轮询
  3508. } else {
  3509. //没有返回LongPollingKey,说明申请加的群不是直播聊天室(AVChatRoom)
  3510. cbErr && cbErr(tool.getReturnError('Join Group succeed; But the type of group is not AVChatRoom: groupid=' + options.GroupId, -12));
  3511. return;
  3512. }
  3513. }
  3514. if (cbOk) cbOk(resp);
  3515. },
  3516. function(err) {
  3517. if (cbErr) cbErr(err);
  3518. }
  3519. );
  3520. };
  3521. //处理加群申请(同意或拒绝)
  3522. var proto_handleApplyJoinGroupPendency = function(options, cbOk, cbErr) {
  3523. if (!checkLogin(cbErr, true)) return;
  3524. ConnManager.apiCall(
  3525. SRV_NAME.GROUP,
  3526. 'handle_apply_join_group',
  3527. {
  3528. GroupId: options.GroupId,
  3529. Applicant_Account: options.Applicant_Account,
  3530. HandleMsg: options.HandleMsg,
  3531. Authentication: options.Authentication,
  3532. MsgKey: options.MsgKey,
  3533. ApprovalMsg: options.ApprovalMsg,
  3534. UserDefinedField: options.UserDefinedField
  3535. },
  3536. cbOk,
  3537. function(err) {
  3538. if (err.ErrorCode == 10024) {
  3539. //apply has be handled
  3540. if (cbOk) {
  3541. var resp = {
  3542. ActionStatus: ACTION_STATUS.OK,
  3543. ErrorCode: 0,
  3544. ErrorInfo: '该申请已经被处理过'
  3545. };
  3546. cbOk(resp);
  3547. }
  3548. } else {
  3549. if (cbErr) cbErr(err);
  3550. }
  3551. }
  3552. );
  3553. };
  3554. //获取群组未决列表
  3555. var proto_getPendencyGroup = function(options, cbOk, cbErr) {
  3556. if (!checkLogin(cbErr, true)) return;
  3557. ConnManager.apiCall(
  3558. SRV_NAME.GROUP,
  3559. 'get_pendency',
  3560. {
  3561. StartTime: options.StartTime,
  3562. Limit: options.Limit,
  3563. Handle_Account: ctx.identifier
  3564. },
  3565. cbOk,
  3566. function(err) {}
  3567. );
  3568. };
  3569. //群组未决已经上报
  3570. var proto_getPendencyGroupRead = function(options, cbOk, cbErr) {
  3571. if (!checkLogin(cbErr, true)) return;
  3572. ConnManager.apiCall(
  3573. SRV_NAME.GROUP,
  3574. 'report_pendency',
  3575. {
  3576. ReportTime: options.ReportTime,
  3577. From_Account: ctx.identifier
  3578. },
  3579. cbOk,
  3580. function(err) {}
  3581. );
  3582. };
  3583. //处理被邀请进群申请(同意或拒绝)
  3584. var proto_handleInviteJoinGroupRequest = function(options, cbOk, cbErr) {
  3585. if (!checkLogin(cbErr, true)) return;
  3586. ConnManager.apiCall(
  3587. SRV_NAME.GROUP,
  3588. 'handle_invite_join_group',
  3589. {
  3590. GroupId: options.GroupId,
  3591. Inviter_Account: options.Inviter_Account,
  3592. HandleMsg: options.HandleMsg,
  3593. Authentication: options.Authentication,
  3594. MsgKey: options.MsgKey,
  3595. ApprovalMsg: options.ApprovalMsg,
  3596. UserDefinedField: options.UserDefinedField
  3597. },
  3598. cbOk,
  3599. function(err) {}
  3600. );
  3601. };
  3602. //主动退群
  3603. var proto_quitGroup = function(options, cbOk, cbErr) {
  3604. if (!checkLogin(cbErr, true)) return;
  3605. ConnManager.apiCall(
  3606. SRV_NAME.GROUP,
  3607. 'quit_group',
  3608. {
  3609. GroupId: options.GroupId
  3610. },
  3611. cbOk,
  3612. cbErr
  3613. );
  3614. };
  3615. //退出大群
  3616. var proto_quitBigGroup = function(options, cbOk, cbErr) {
  3617. var srvName;
  3618. if (!checkLogin(cbErr, false)) {
  3619. //未登录
  3620. srvName = SRV_NAME.BIG_GROUP;
  3621. } else {
  3622. //已登录
  3623. srvName = SRV_NAME.GROUP;
  3624. }
  3625. MsgManager.resetBigGroupLongPollingInfo();
  3626. ConnManager.apiCall(
  3627. srvName,
  3628. 'quit_group',
  3629. {
  3630. GroupId: options.GroupId
  3631. },
  3632. function(resp) {
  3633. MsgStore.delSessByTypeId(SESSION_TYPE.GROUP, options.GroupId);
  3634. //重置当前再请求中的ajax
  3635. //clearXmlHttpObjMap();
  3636. //退出大群成功之后需要重置长轮询信息
  3637. // MsgManager.resetBigGroupLongPollingInfo();
  3638. if (cbOk) cbOk(resp);
  3639. },
  3640. cbErr
  3641. );
  3642. };
  3643. //查找群(按名称)
  3644. var proto_searchGroupByName = function(options, cbOk, cbErr) {
  3645. ConnManager.apiCall(SRV_NAME.GROUP, 'search_group', options, cbOk, cbErr);
  3646. };
  3647. //获取群组公开资料
  3648. var proto_getGroupPublicInfo = function(options, cbOk, cbErr) {
  3649. if (!checkLogin(cbErr, true)) return;
  3650. ConnManager.apiCall(
  3651. SRV_NAME.GROUP,
  3652. 'get_group_public_info',
  3653. {
  3654. GroupIdList: options.GroupIdList,
  3655. ResponseFilter: {
  3656. GroupBasePublicInfoFilter: options.GroupBasePublicInfoFilter
  3657. }
  3658. },
  3659. function(resp) {
  3660. resp.ErrorInfo = '';
  3661. if (resp.GroupInfo) {
  3662. for (var i in resp.GroupInfo) {
  3663. var errorCode = resp.GroupInfo[i].ErrorCode;
  3664. if (errorCode > 0) {
  3665. resp.ActionStatus = ACTION_STATUS.FAIL;
  3666. resp.GroupInfo[i].ErrorInfo = '[' + errorCode + ']' + resp.GroupInfo[i].ErrorInfo;
  3667. resp.ErrorInfo += resp.GroupInfo[i].ErrorInfo + '\n';
  3668. }
  3669. }
  3670. }
  3671. if (resp.ActionStatus == ACTION_STATUS.FAIL) {
  3672. if (cbErr) {
  3673. cbErr(resp);
  3674. }
  3675. } else if (cbOk) {
  3676. cbOk(resp);
  3677. }
  3678. },
  3679. cbErr
  3680. );
  3681. };
  3682. //获取群组详细资料--高级
  3683. //请求协议参考:https://www.qcloud.com/doc/product/269/1616
  3684. var proto_getGroupInfo = function(options, cbOk, cbErr) {
  3685. if (!checkLogin(cbErr, true)) return;
  3686. var opt = {
  3687. GroupIdList: options.GroupIdList,
  3688. ResponseFilter: {
  3689. GroupBaseInfoFilter: options.GroupBaseInfoFilter,
  3690. MemberInfoFilter: options.MemberInfoFilter
  3691. }
  3692. };
  3693. if (options.AppDefinedDataFilter_Group) {
  3694. opt.ResponseFilter.AppDefinedDataFilter_Group = options.AppDefinedDataFilter_Group;
  3695. }
  3696. if (options.AppDefinedDataFilter_GroupMember) {
  3697. opt.ResponseFilter.AppDefinedDataFilter_GroupMember = options.AppDefinedDataFilter_GroupMember;
  3698. }
  3699. ConnManager.apiCall(SRV_NAME.GROUP, 'get_group_info', opt, cbOk, cbErr);
  3700. };
  3701. //获取群组成员-高级接口
  3702. //协议参考:https://www.qcloud.com/doc/product/269/1617
  3703. var proto_getGroupMemberInfo = function(options, cbOk, cbErr) {
  3704. if (!checkLogin(cbErr, true)) return;
  3705. ConnManager.apiCall(
  3706. SRV_NAME.GROUP,
  3707. 'get_group_member_info',
  3708. {
  3709. GroupId: options.GroupId,
  3710. Offset: options.Offset,
  3711. Limit: options.Limit,
  3712. MemberInfoFilter: options.MemberInfoFilter,
  3713. MemberRoleFilter: options.MemberRoleFilter,
  3714. AppDefinedDataFilter_GroupMember: options.AppDefinedDataFilter_GroupMember
  3715. },
  3716. cbOk,
  3717. cbErr
  3718. );
  3719. };
  3720. //增加群组成员
  3721. //协议参考:https://www.qcloud.com/doc/product/269/1621
  3722. var proto_addGroupMember = function(options, cbOk, cbErr) {
  3723. if (!checkLogin(cbErr, true)) return;
  3724. ConnManager.apiCall(
  3725. SRV_NAME.GROUP,
  3726. 'add_group_member',
  3727. {
  3728. GroupId: options.GroupId,
  3729. Silence: options.Silence,
  3730. MemberList: options.MemberList
  3731. },
  3732. cbOk,
  3733. cbErr
  3734. );
  3735. };
  3736. //修改群组成员资料
  3737. //协议参考:https://www.qcloud.com/doc/product/269/1623
  3738. var proto_modifyGroupMember = function(options, cbOk, cbErr) {
  3739. if (!checkLogin(cbErr, true)) return;
  3740. var opt = {};
  3741. if (options.GroupId) {
  3742. opt.GroupId = options.GroupId;
  3743. }
  3744. if (options.Member_Account) {
  3745. opt.Member_Account = options.Member_Account;
  3746. }
  3747. //Admin或者Member
  3748. if (options.Role) {
  3749. opt.Role = options.Role;
  3750. }
  3751. // AcceptAndNotify代表解收并提示消息,Discard代表不接收也不提示消息,AcceptNotNotify代表接收消息但不提示
  3752. if (options.MsgFlag) {
  3753. opt.MsgFlag = options.MsgFlag;
  3754. }
  3755. if (options.ShutUpTime) {
  3756. //禁言时间
  3757. opt.ShutUpTime = options.ShutUpTime;
  3758. }
  3759. if (options.NameCard) {
  3760. //群名片,最大不超过50个字节
  3761. opt.NameCard = options.NameCard;
  3762. }
  3763. if (options.AppMemberDefinedData) {
  3764. //群成员维度的自定义字段,默认情况是没有的,需要开通
  3765. opt.AppMemberDefinedData = options.AppMemberDefinedData;
  3766. }
  3767. ConnManager.apiCall(SRV_NAME.GROUP, 'modify_group_member_info', opt, cbOk, cbErr);
  3768. };
  3769. //删除群组成员
  3770. //协议参考:https://www.qcloud.com/doc/product/269/1622
  3771. var proto_deleteGroupMember = function(options, cbOk, cbErr) {
  3772. if (!checkLogin(cbErr, true)) return;
  3773. ConnManager.apiCall(
  3774. SRV_NAME.GROUP,
  3775. 'delete_group_member',
  3776. {
  3777. GroupId: options.GroupId,
  3778. Silence: options.Silence,
  3779. MemberToDel_Account: options.MemberToDel_Account,
  3780. Reason: options.Reason
  3781. },
  3782. cbOk,
  3783. cbErr
  3784. );
  3785. };
  3786. //解散群组
  3787. //协议参考:https://www.qcloud.com/doc/product/269/1624
  3788. var proto_destroyGroup = function(options, cbOk, cbErr) {
  3789. if (!checkLogin(cbErr, true)) return;
  3790. ConnManager.apiCall(
  3791. SRV_NAME.GROUP,
  3792. 'destroy_group',
  3793. {
  3794. GroupId: options.GroupId
  3795. },
  3796. cbOk,
  3797. cbErr
  3798. );
  3799. };
  3800. //转让群组
  3801. //协议参考:https://www.qcloud.com/doc/product/269/1633
  3802. var proto_changeGroupOwner = function(options, cbOk, cbErr) {
  3803. if (!checkLogin(cbErr, true)) return;
  3804. ConnManager.apiCall(SRV_NAME.GROUP, 'change_group_owner', options, cbOk, cbErr);
  3805. };
  3806. //获取用户所加入的群组-高级接口
  3807. //协议参考:https://www.qcloud.com/doc/product/269/1625
  3808. var proto_getJoinedGroupListHigh = function(options, cbOk, cbErr) {
  3809. if (!checkLogin(cbErr, true)) return;
  3810. ConnManager.apiCall(
  3811. SRV_NAME.GROUP,
  3812. 'get_joined_group_list',
  3813. {
  3814. Member_Account: options.Member_Account,
  3815. Limit: options.Limit,
  3816. Offset: options.Offset,
  3817. GroupType: options.GroupType,
  3818. ResponseFilter: {
  3819. GroupBaseInfoFilter: options.GroupBaseInfoFilter,
  3820. SelfInfoFilter: options.SelfInfoFilter
  3821. }
  3822. },
  3823. cbOk,
  3824. cbErr
  3825. );
  3826. };
  3827. //查询一组UserId在群中的身份
  3828. //协议参考:https://www.qcloud.com/doc/product/269/1626
  3829. var proto_getRoleInGroup = function(options, cbOk, cbErr) {
  3830. if (!checkLogin(cbErr, true)) return;
  3831. ConnManager.apiCall(
  3832. SRV_NAME.GROUP,
  3833. 'get_role_in_group',
  3834. {
  3835. GroupId: options.GroupId,
  3836. User_Account: options.User_Account
  3837. },
  3838. cbOk,
  3839. cbErr
  3840. );
  3841. };
  3842. //设置取消成员禁言时间
  3843. //协议参考:https://www.qcloud.com/doc/product/269/1627
  3844. var proto_forbidSendMsg = function(options, cbOk, cbErr) {
  3845. if (!checkLogin(cbErr, true)) return;
  3846. ConnManager.apiCall(
  3847. SRV_NAME.GROUP,
  3848. 'forbid_send_msg',
  3849. {
  3850. GroupId: options.GroupId,
  3851. Members_Account: options.Members_Account,
  3852. ShutUpTime: options.ShutUpTime //单位为秒,为0时表示取消禁言
  3853. },
  3854. cbOk,
  3855. cbErr
  3856. );
  3857. };
  3858. //发送自定义群系统通知
  3859. var proto_sendCustomGroupNotify = function(options, cbOk, cbErr) {
  3860. if (!checkLogin(cbErr, true)) return;
  3861. ConnManager.apiCall(SRV_NAME.GROUP, 'send_group_system_notification', options, cbOk, cbErr);
  3862. };
  3863. //拉取群消息接口
  3864. var proto_getGroupMsgs = function(options, cbOk, cbErr) {
  3865. if (!checkLogin(cbErr, true)) return;
  3866. ConnManager.apiCall(
  3867. SRV_NAME.GROUP,
  3868. 'group_msg_get',
  3869. {
  3870. GroupId: options.GroupId,
  3871. ReqMsgSeq: options.ReqMsgSeq,
  3872. ReqMsgNumber: options.ReqMsgNumber
  3873. },
  3874. cbOk,
  3875. cbErr
  3876. );
  3877. };
  3878. //群消息已读上报接口
  3879. var proto_groupMsgReaded = function(options, cbOk, cbErr) {
  3880. if (!checkLogin(cbErr, true)) return;
  3881. ConnManager.apiCall(
  3882. SRV_NAME.GROUP,
  3883. 'msg_read_report',
  3884. {
  3885. GroupId: options.GroupId,
  3886. MsgReadedSeq: options.MsgReadedSeq
  3887. },
  3888. cbOk,
  3889. cbErr
  3890. );
  3891. };
  3892. //end
  3893. //好友接口
  3894. //处理好友接口返回的错误码
  3895. var convertErrorEn2ZhFriend = function(resp) {
  3896. var errorAccount = [];
  3897. if (resp.Fail_Account && resp.Fail_Account.length) {
  3898. errorAccount = resp.Fail_Account;
  3899. }
  3900. if (resp.Invalid_Account && resp.Invalid_Account.length) {
  3901. for (var k in resp.Invalid_Account) {
  3902. errorAccount.push(resp.Invalid_Account[k]);
  3903. }
  3904. }
  3905. if (errorAccount.length) {
  3906. resp.ActionStatus = ACTION_STATUS.FAIL;
  3907. resp.ErrorCode = ERROR_CODE_CUSTOM;
  3908. resp.ErrorInfo = '';
  3909. for (var i in errorAccount) {
  3910. var failCount = errorAccount[i];
  3911. for (var j in resp.ResultItem) {
  3912. if (resp.ResultItem[j].To_Account == failCount) {
  3913. var resultCode = resp.ResultItem[j].ResultCode;
  3914. resp.ResultItem[j].ResultInfo = '[' + resultCode + ']' + resp.ResultItem[j].ResultInfo;
  3915. resp.ErrorInfo += resp.ResultItem[j].ResultInfo + '\n';
  3916. break;
  3917. }
  3918. }
  3919. }
  3920. }
  3921. return resp;
  3922. };
  3923. //添加好友
  3924. var proto_applyAddFriend = function(options, cbOk, cbErr) {
  3925. if (!checkLogin(cbErr, true)) return;
  3926. ConnManager.apiCall(
  3927. SRV_NAME.FRIEND,
  3928. 'friend_add',
  3929. {
  3930. From_Account: ctx.identifier,
  3931. AddFriendItem: options.AddFriendItem
  3932. },
  3933. function(resp) {
  3934. var newResp = convertErrorEn2ZhFriend(resp);
  3935. if (newResp.ActionStatus == ACTION_STATUS.FAIL) {
  3936. if (cbErr) cbErr(newResp);
  3937. } else if (cbOk) {
  3938. cbOk(newResp);
  3939. }
  3940. },
  3941. cbErr
  3942. );
  3943. };
  3944. //删除好友
  3945. var proto_deleteFriend = function(options, cbOk, cbErr) {
  3946. if (!checkLogin(cbErr, true)) return;
  3947. ConnManager.apiCall(
  3948. SRV_NAME.FRIEND,
  3949. 'friend_delete',
  3950. {
  3951. From_Account: ctx.identifier,
  3952. To_Account: options.To_Account,
  3953. DeleteType: options.DeleteType
  3954. },
  3955. function(resp) {
  3956. var newResp = convertErrorEn2ZhFriend(resp);
  3957. if (newResp.ActionStatus == ACTION_STATUS.FAIL) {
  3958. if (cbErr) cbErr(newResp);
  3959. } else if (cbOk) {
  3960. cbOk(newResp);
  3961. }
  3962. },
  3963. cbErr
  3964. );
  3965. };
  3966. //删除会话
  3967. var proto_deleteChat = function(options, cbOk, cbErr) {
  3968. if (!checkLogin(cbErr, true)) return;
  3969. if (options.chatType == 1) {
  3970. ConnManager.apiCall(
  3971. SRV_NAME.DEL_CHAT,
  3972. 'delete',
  3973. {
  3974. From_Account: ctx.identifier,
  3975. Type: options.chatType,
  3976. To_Account: options.To_Account
  3977. },
  3978. cbOk,
  3979. cbErr
  3980. );
  3981. } else {
  3982. ConnManager.apiCall(
  3983. SRV_NAME.DEL_CHAT,
  3984. 'delete',
  3985. {
  3986. From_Account: ctx.identifier,
  3987. Type: options.chatType,
  3988. ToGroupid: options.To_Account
  3989. },
  3990. cbOk,
  3991. cbErr
  3992. );
  3993. }
  3994. };
  3995. //获取好友申请
  3996. var proto_getPendency = function(options, cbOk, cbErr) {
  3997. if (!checkLogin(cbErr, true)) return;
  3998. ConnManager.apiCall(
  3999. SRV_NAME.FRIEND,
  4000. 'pendency_get',
  4001. {
  4002. From_Account: ctx.identifier,
  4003. PendencyType: options.PendencyType,
  4004. StartTime: options.StartTime,
  4005. MaxLimited: options.MaxLimited,
  4006. LastSequence: options.LastSequence
  4007. },
  4008. cbOk,
  4009. cbErr
  4010. );
  4011. };
  4012. //好友申请已读上报
  4013. var proto_getPendencyReport = function(options, cbOk, cbErr) {
  4014. if (!checkLogin(cbErr, true)) return;
  4015. ConnManager.apiCall(
  4016. SRV_NAME.FRIEND,
  4017. 'PendencyReport',
  4018. {
  4019. From_Account: ctx.identifier,
  4020. LatestPendencyTimeStamp: options.LatestPendencyTimeStamp
  4021. },
  4022. cbOk,
  4023. cbErr
  4024. );
  4025. };
  4026. //删除好友申请
  4027. var proto_deletePendency = function(options, cbOk, cbErr) {
  4028. if (!checkLogin(cbErr, true)) return;
  4029. ConnManager.apiCall(
  4030. SRV_NAME.FRIEND,
  4031. 'pendency_delete',
  4032. {
  4033. From_Account: ctx.identifier,
  4034. PendencyType: options.PendencyType,
  4035. To_Account: options.To_Account
  4036. },
  4037. function(resp) {
  4038. var newResp = convertErrorEn2ZhFriend(resp);
  4039. if (newResp.ActionStatus == ACTION_STATUS.FAIL) {
  4040. if (cbErr) cbErr(newResp);
  4041. } else if (cbOk) {
  4042. cbOk(newResp);
  4043. }
  4044. },
  4045. cbErr
  4046. );
  4047. };
  4048. //处理好友申请
  4049. var proto_responseFriend = function(options, cbOk, cbErr) {
  4050. if (!checkLogin(cbErr, true)) return;
  4051. ConnManager.apiCall(
  4052. SRV_NAME.FRIEND,
  4053. 'friend_response',
  4054. {
  4055. From_Account: ctx.identifier,
  4056. ResponseFriendItem: options.ResponseFriendItem
  4057. },
  4058. function(resp) {
  4059. var newResp = convertErrorEn2ZhFriend(resp);
  4060. if (newResp.ActionStatus == ACTION_STATUS.FAIL) {
  4061. if (cbErr) cbErr(newResp);
  4062. } else if (cbOk) {
  4063. cbOk(newResp);
  4064. }
  4065. },
  4066. cbErr
  4067. );
  4068. };
  4069. //我的好友
  4070. var proto_getAllFriend = function(options, cbOk, cbErr) {
  4071. if (!checkLogin(cbErr, true)) return;
  4072. ConnManager.apiCall(
  4073. SRV_NAME.FRIEND,
  4074. 'friend_get_all',
  4075. {
  4076. From_Account: ctx.identifier,
  4077. TimeStamp: options.TimeStamp,
  4078. StartIndex: options.StartIndex,
  4079. GetCount: options.GetCount,
  4080. LastStandardSequence: options.LastStandardSequence,
  4081. TagList: options.TagList
  4082. },
  4083. cbOk,
  4084. cbErr
  4085. );
  4086. };
  4087. //资料接口
  4088. //查看个人资料
  4089. var proto_getProfilePortrait = function(options, cbOk, cbErr) {
  4090. if (options.To_Account.length > 100) {
  4091. options.To_Account.length = 100;
  4092. log.error('获取用户资料人数不能超过100人');
  4093. }
  4094. if (!checkLogin(cbErr, true)) return;
  4095. ConnManager.apiCall(
  4096. SRV_NAME.PROFILE,
  4097. 'portrait_get',
  4098. {
  4099. From_Account: ctx.identifier,
  4100. To_Account: options.To_Account,
  4101. //'LastStandardSequence':options.LastStandardSequence,
  4102. TagList: options.TagList
  4103. },
  4104. function(resp) {
  4105. var errorAccount = [];
  4106. if (resp.Fail_Account && resp.Fail_Account.length) {
  4107. errorAccount = resp.Fail_Account;
  4108. }
  4109. if (resp.Invalid_Account && resp.Invalid_Account.length) {
  4110. for (var k in resp.Invalid_Account) {
  4111. errorAccount.push(resp.Invalid_Account[k]);
  4112. }
  4113. }
  4114. if (errorAccount.length) {
  4115. resp.ActionStatus = ACTION_STATUS.FAIL;
  4116. resp.ErrorCode = ERROR_CODE_CUSTOM;
  4117. resp.ErrorInfo = '';
  4118. for (var i in errorAccount) {
  4119. var failCount = errorAccount[i];
  4120. for (var j in resp.UserProfileItem) {
  4121. if (resp.UserProfileItem[j].To_Account == failCount) {
  4122. var resultCode = resp.UserProfileItem[j].ResultCode;
  4123. resp.UserProfileItem[j].ResultInfo = '[' + resultCode + ']' + resp.UserProfileItem[j].ResultInfo;
  4124. resp.ErrorInfo += '账号:' + failCount + ',' + resp.UserProfileItem[j].ResultInfo + '\n';
  4125. break;
  4126. }
  4127. }
  4128. }
  4129. }
  4130. if (resp.ActionStatus == ACTION_STATUS.FAIL) {
  4131. if (cbErr) cbErr(resp);
  4132. } else if (cbOk) {
  4133. cbOk(resp);
  4134. }
  4135. },
  4136. cbErr
  4137. );
  4138. };
  4139. //设置个人资料
  4140. var proto_setProfilePortrait = function(options, cbOk, cbErr) {
  4141. if (!checkLogin(cbErr, true)) return;
  4142. ConnManager.apiCall(
  4143. SRV_NAME.PROFILE,
  4144. 'portrait_set',
  4145. {
  4146. From_Account: ctx.identifier,
  4147. ProfileItem: options.ProfileItem
  4148. },
  4149. function(resp) {
  4150. for (var i in options.ProfileItem) {
  4151. var profile = options.ProfileItem[i];
  4152. if (profile.Tag == 'Tag_Profile_IM_Nick') {
  4153. ctx.identifierNick = profile.Value; //更新昵称
  4154. break;
  4155. }
  4156. }
  4157. if (cbOk) cbOk(resp);
  4158. },
  4159. cbErr
  4160. );
  4161. };
  4162. //增加黑名单
  4163. var proto_addBlackList = function(options, cbOk, cbErr) {
  4164. if (!checkLogin(cbErr, true)) return;
  4165. ConnManager.apiCall(
  4166. SRV_NAME.FRIEND,
  4167. 'black_list_add',
  4168. {
  4169. From_Account: ctx.identifier,
  4170. To_Account: options.To_Account
  4171. },
  4172. function(resp) {
  4173. var newResp = convertErrorEn2ZhFriend(resp);
  4174. if (newResp.ActionStatus == ACTION_STATUS.FAIL) {
  4175. if (cbErr) cbErr(newResp);
  4176. } else if (cbOk) {
  4177. cbOk(newResp);
  4178. }
  4179. },
  4180. cbErr
  4181. );
  4182. };
  4183. //删除黑名单
  4184. var proto_deleteBlackList = function(options, cbOk, cbErr) {
  4185. if (!checkLogin(cbErr, true)) return;
  4186. ConnManager.apiCall(
  4187. SRV_NAME.FRIEND,
  4188. 'black_list_delete',
  4189. {
  4190. From_Account: ctx.identifier,
  4191. To_Account: options.To_Account
  4192. },
  4193. function(resp) {
  4194. var newResp = convertErrorEn2ZhFriend(resp);
  4195. if (newResp.ActionStatus == ACTION_STATUS.FAIL) {
  4196. if (cbErr) cbErr(newResp);
  4197. } else if (cbOk) {
  4198. cbOk(newResp);
  4199. }
  4200. },
  4201. cbErr
  4202. );
  4203. };
  4204. //我的黑名单
  4205. var proto_getBlackList = function(options, cbOk, cbErr) {
  4206. if (!checkLogin(cbErr, true)) return;
  4207. ConnManager.apiCall(
  4208. SRV_NAME.FRIEND,
  4209. 'black_list_get',
  4210. {
  4211. From_Account: ctx.identifier,
  4212. StartIndex: options.StartIndex,
  4213. MaxLimited: options.MaxLimited,
  4214. LastSequence: options.LastSequence
  4215. },
  4216. cbOk,
  4217. cbErr
  4218. );
  4219. };
  4220. //获取最近联系人
  4221. var proto_getRecentContactList = function(options, cbOk, cbErr) {
  4222. if (!checkLogin(cbErr, true)) return;
  4223. ConnManager.apiCall(
  4224. SRV_NAME.RECENT_CONTACT,
  4225. 'get',
  4226. {
  4227. From_Account: ctx.identifier,
  4228. Count: options.Count
  4229. },
  4230. cbOk,
  4231. cbErr
  4232. );
  4233. };
  4234. //上传图片或文件
  4235. var proto_uploadPic = function(options, cbOk, cbErr) {
  4236. if (!checkLogin(cbErr, true)) return;
  4237. var cmdName;
  4238. if (isAccessFormalEnv()) {
  4239. cmdName = 'pic_up';
  4240. } else {
  4241. cmdName = 'pic_up_test';
  4242. }
  4243. ConnManager.apiCall(
  4244. SRV_NAME.PIC,
  4245. cmdName,
  4246. {
  4247. App_Version: VERSION_INFO.APP_VERSION,
  4248. From_Account: ctx.identifier,
  4249. To_Account: options.To_Account,
  4250. Seq: options.Seq,
  4251. Timestamp: options.Timestamp,
  4252. Random: options.Random,
  4253. File_Str_Md5: options.File_Str_Md5,
  4254. File_Size: options.File_Size,
  4255. File_Type: options.File_Type,
  4256. Server_Ver: VERSION_INFO.SERVER_VERSION,
  4257. Auth_Key: authkey,
  4258. Busi_Id: options.Busi_Id,
  4259. PkgFlag: options.PkgFlag,
  4260. Slice_Offset: options.Slice_Offset,
  4261. Slice_Size: options.Slice_Size,
  4262. Slice_Data: options.Slice_Data,
  4263. content_type: 'application/x-www-form-urlencoded'
  4264. },
  4265. cbOk,
  4266. cbErr
  4267. );
  4268. };
  4269. //获取语音和文件下载IP和authkey
  4270. var proto_getIpAndAuthkey = function(cbOk, cbErr) {
  4271. if (!checkLogin(cbErr, true)) return;
  4272. ConnManager.apiCall(SRV_NAME.OPEN_IM, 'authkey', {}, cbOk, cbErr);
  4273. };
  4274. //接口质量上报
  4275. var proto_reportApiQuality = function(options, cbOk, cbErr) {
  4276. if (!checkLogin(cbErr, true)) return;
  4277. ConnManager.apiCall(SRV_NAME.IM_OPEN_STAT, 'web_report', options, cbOk, cbErr);
  4278. };
  4279. var proto_getLongPollingId = function(options, cbOk, cbErr) {
  4280. if (!checkLogin(cbErr, true)) return;
  4281. ConnManager.apiCall(
  4282. SRV_NAME.OPEN_IM,
  4283. 'getlongpollingid',
  4284. {},
  4285. function(resp) {
  4286. cbOk && cbOk(resp);
  4287. },
  4288. cbErr
  4289. );
  4290. };
  4291. var proto_applyDownload = function(options, cbOk, cbErr) {
  4292. //把下载地址push到map中
  4293. ConnManager.apiCall(SRV_NAME.PIC, 'apply_download', options, cbOk, cbErr);
  4294. };
  4295. //end
  4296. initBrowserInfo();
  4297. // singleton object ConnManager
  4298. var ConnManager =
  4299. lowerBR == false
  4300. ? new function() {
  4301. var onConnCallback = null; //回调函数
  4302. this.init = function(onConnNotify, cbOk, cbErr) {
  4303. if (onConnNotify) onConnCallback = onConnNotify;
  4304. };
  4305. this.callBack = function(info) {
  4306. if (onConnCallback) onConnCallback(info);
  4307. };
  4308. this.clear = function() {
  4309. onConnCallback = null;
  4310. };
  4311. //请求后台服务接口
  4312. this.apiCall = function(type, cmd, data, cbOk, cbErr, timeout, isLongPolling) {
  4313. //封装后台服务接口地址
  4314. var url = getApiUrl(type, cmd, cbOk, cbErr);
  4315. if (url == false) return;
  4316. //发起ajax请求
  4317. var content_type = data.content_type ? data.content_type : 'application/x-www-form-urlencoded';
  4318. ajaxRequestJson(
  4319. 'POST',
  4320. url,
  4321. data,
  4322. timeout,
  4323. content_type,
  4324. isLongPolling,
  4325. function(resp) {
  4326. var errorCode = null,
  4327. tempErrorInfo = '';
  4328. if (cmd == 'pic_up') {
  4329. data.Slice_Data = '';
  4330. }
  4331. var info = '\n request url: \n' + url + '\n request body: \n' + JSON.stringify(data) + '\n response: \n' + JSON.stringify(resp);
  4332. //成功
  4333. if (resp.ActionStatus == ACTION_STATUS.OK) {
  4334. log.info('[' + type + '][' + cmd + ']success: ' + info);
  4335. if (cbOk) cbOk(resp); //回调
  4336. errorCode = 0;
  4337. tempErrorInfo = '';
  4338. } else {
  4339. errorCode = resp.ErrorCode;
  4340. tempErrorInfo = resp.ErrorInfo;
  4341. //报错
  4342. if (cbErr) {
  4343. resp.SrcErrorInfo = resp.ErrorInfo;
  4344. resp.ErrorInfo = '[' + type + '][' + cmd + ']failed: ' + info;
  4345. if (cmd != 'longpolling' || resp.ErrorCode != longPollingTimeOutErrorCode) {
  4346. log.error(resp.ErrorInfo);
  4347. }
  4348. cbErr(resp);
  4349. }
  4350. }
  4351. reportApiQuality(cmd, errorCode, tempErrorInfo); //接口质量上报
  4352. },
  4353. function(err) {
  4354. cbErr && cbErr(err);
  4355. reportApiQuality(cmd, err.ErrorCode, err.ErrorInfo); //接口质量上报
  4356. }
  4357. );
  4358. };
  4359. }()
  4360. : new function() {
  4361. var onConnCallback = null; //回调函数
  4362. this.init = function(onConnNotify, cbOk, cbErr) {
  4363. if (onConnNotify) onConnCallback = onConnNotify;
  4364. };
  4365. this.callBack = function(info) {
  4366. if (onConnCallback) onConnCallback(info);
  4367. };
  4368. this.clear = function() {
  4369. onConnCallback = null;
  4370. };
  4371. //请求后台服务接口
  4372. this.apiCall = function(type, cmd, data, cbOk, cbErr, timeout, isLongPolling) {
  4373. //封装后台服务接口地址
  4374. var url = getApiUrl(type, cmd, cbOk, cbErr);
  4375. if (url == false) return;
  4376. //发起jsonp请求
  4377. var reqId = jsonpRequestId++,
  4378. cbkey = 'jsonpcallback', // the 'callback' key
  4379. cbval = 'jsonpRequest' + reqId, // the 'callback' value
  4380. script = document.createElement('script'),
  4381. loaded = 0;
  4382. window[cbval] = jsonpCallback;
  4383. script.type = 'text/javascript';
  4384. url = url + '&' + cbkey + '=' + cbval + '&jsonpbody=' + encodeURIComponent(JSON.stringify(data));
  4385. script.src = url;
  4386. script.async = true;
  4387. if (typeof script.onreadystatechange !== 'undefined') {
  4388. // need this for IE due to out-of-order onreadystatechange(), binding script
  4389. // execution to an event listener gives us control over when the script
  4390. // is executed. See http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html
  4391. script.event = 'onclick';
  4392. script.htmlFor = script.id = '_jsonpRequest_' + reqId;
  4393. }
  4394. script.onload = script.onreadystatechange = function() {
  4395. if ((this.readyState && this.readyState !== 'complete' && this.readyState !== 'loaded') || loaded) {
  4396. return false;
  4397. }
  4398. script.onload = script.onreadystatechange = null;
  4399. script.onclick && script.onclick();
  4400. // Call the user callback with the last value stored and clean up values and scripts.
  4401. var resp = jsonpLastRspData;
  4402. var info = '\n request url: \n' + url + '\n request body: \n' + JSON.stringify(data) + '\n response: \n' + JSON.stringify(resp);
  4403. if (resp.ActionStatus == ACTION_STATUS.OK) {
  4404. log.info('[' + type + '][' + cmd + ']success: ' + info);
  4405. cbOk && cbOk(resp);
  4406. } else {
  4407. resp.ErrorInfo = '[' + type + '][' + cmd + ']failed ' + info;
  4408. if (cmd != 'longpolling' || resp.ErrorCode != longPollingTimeOutErrorCode) {
  4409. log.error(resp.ErrorInfo);
  4410. } else {
  4411. log.warn('[' + type + '][' + cmd + ']success: ' + info);
  4412. }
  4413. cbErr && cbErr(resp);
  4414. }
  4415. jsonpLastRspData = undefined;
  4416. document.body.removeChild(script);
  4417. loaded = 1;
  4418. };
  4419. // Add the script to the DOM head
  4420. document.body.appendChild(script);
  4421. };
  4422. }();
  4423. // class Session
  4424. var Session = function(type, id, name, icon, time, seq) {
  4425. this._impl = {
  4426. skey: Session.skey(type, id),
  4427. type: type,
  4428. id: id,
  4429. name: name,
  4430. icon: icon,
  4431. unread: 0, //未读消息数
  4432. isAutoRead: false,
  4433. time: time >= 0 ? time : 0,
  4434. curMaxMsgSeq: seq >= 0 ? seq : 0,
  4435. msgs: [],
  4436. isFinished: 1
  4437. };
  4438. };
  4439. Session.skey = function(type, id) {
  4440. return type + id;
  4441. };
  4442. Session.prototype.type = function() {
  4443. return this._impl.type;
  4444. };
  4445. Session.prototype.id = function() {
  4446. return this._impl.id;
  4447. };
  4448. Session.prototype.name = function() {
  4449. return this._impl.name;
  4450. };
  4451. Session.prototype.icon = function() {
  4452. return this._impl.icon;
  4453. };
  4454. Session.prototype.unread = function(val) {
  4455. if (typeof val !== 'undefined') {
  4456. this._impl.unread = val;
  4457. } else {
  4458. return this._impl.unread;
  4459. }
  4460. };
  4461. Session.prototype.isFinished = function(val) {
  4462. if (typeof val !== 'undefined') {
  4463. this._impl.isFinished = val;
  4464. } else {
  4465. return this._impl.isFinished;
  4466. }
  4467. };
  4468. Session.prototype.time = function() {
  4469. return this._impl.time;
  4470. };
  4471. Session.prototype.curMaxMsgSeq = function(seq) {
  4472. if (typeof seq !== 'undefined') {
  4473. this._impl.curMaxMsgSeq = seq;
  4474. } else {
  4475. return this._impl.curMaxMsgSeq;
  4476. }
  4477. };
  4478. Session.prototype.msgCount = function() {
  4479. return this._impl.msgs.length;
  4480. };
  4481. Session.prototype.msg = function(index) {
  4482. return this._impl.msgs[index];
  4483. };
  4484. Session.prototype.msgs = function() {
  4485. return this._impl.msgs;
  4486. };
  4487. Session.prototype._impl_addMsg = function(msg, unread) {
  4488. this._impl.msgs.push(msg);
  4489. //if (!msg.isSend && msg.time > this._impl.time)
  4490. if (msg.time > this._impl.time) this._impl.time = msg.time;
  4491. //if (!msg.isSend && msg.seq > this._impl.curMaxMsgSeq)
  4492. if (msg.seq > this._impl.curMaxMsgSeq) this._impl.curMaxMsgSeq = msg.seq;
  4493. //自己发送的消息不计入未读数
  4494. if (!msg.isSend && !this._impl.isAutoRead && unread) {
  4495. this._impl.unread++;
  4496. }
  4497. };
  4498. //class C2CMsgReadedItem
  4499. var C2CMsgReadedItem = function(toAccount, lastedMsgTime) {
  4500. this.toAccount = toAccount;
  4501. this.lastedMsgTime = lastedMsgTime;
  4502. };
  4503. var calcUniqId = function(num1, num2) {
  4504. var str1 = parseInt(num1).toString(2) + '00000000000000000000000000000000';
  4505. var str2 = parseInt(num2).toString(2);
  4506. var arr1 = str1.split('').reverse();
  4507. var arr2 = str2.split('').reverse();
  4508. var sig = null,
  4509. res = [];
  4510. var length = arr1.length > arr2.length ? arr1.length : arr2.length;
  4511. for (var a = 0; a < length; a++) {
  4512. sig = Number(arr1[a] || 0) || Number(arr2[a] || 0);
  4513. res.push(sig);
  4514. }
  4515. var numstr = res.reverse().join('');
  4516. var long = {
  4517. high: '0x' + parseInt(numstr.substr(0, numstr.length - 32), 2).toString(16),
  4518. low: '0x' + parseInt(numstr.substr(numstr.length - 32 - 1), 2).toString(16)
  4519. };
  4520. var longVal = new Long(long.low, long.high, true);
  4521. return longVal.toString();
  4522. };
  4523. // class Msg
  4524. var Msg = function(sess, isSend, seq, random, time, fromAccount, subType, fromAccountNick, fromAccountHeadurl) {
  4525. this.sess = sess;
  4526. this.subType = subType >= 0 ? subType : 0; //消息类型,c2c消息时,type取值为0;group消息时,type取值0和1,0-普通群消息,1-群提示消息
  4527. this.fromAccount = fromAccount;
  4528. this.fromAccountNick = fromAccountNick ? fromAccountNick : fromAccount;
  4529. this.fromAccountHeadurl = fromAccountHeadurl || null;
  4530. this.isSend = Boolean(isSend);
  4531. this.seq = seq >= 0 ? seq : nextSeq();
  4532. this.random = random >= 0 ? random : createRandom();
  4533. this.time = time >= 0 ? time : unixtime();
  4534. this.elems = [];
  4535. var type = sess.type();
  4536. switch (type) {
  4537. case SESSION_TYPE.GROUP:
  4538. this.uniqueId = calcUniqId(this.seq, this.random);
  4539. break;
  4540. case SESSION_TYPE.C2C:
  4541. default:
  4542. this.uniqueId = calcUniqId(this.time, this.random);
  4543. break;
  4544. }
  4545. };
  4546. Msg.prototype.getSession = function() {
  4547. return this.sess;
  4548. };
  4549. Msg.prototype.getType = function() {
  4550. return this.subType;
  4551. };
  4552. Msg.prototype.getSubType = function() {
  4553. return this.subType;
  4554. };
  4555. Msg.prototype.getFromAccount = function() {
  4556. return this.fromAccount;
  4557. };
  4558. Msg.prototype.getFromAccountNick = function() {
  4559. return this.fromAccountNick;
  4560. };
  4561. Msg.prototype.getIsSend = function() {
  4562. return this.isSend;
  4563. };
  4564. Msg.prototype.getSeq = function() {
  4565. return this.seq;
  4566. };
  4567. Msg.prototype.getTime = function() {
  4568. return this.time;
  4569. };
  4570. Msg.prototype.getRandom = function() {
  4571. return this.random;
  4572. };
  4573. Msg.prototype.getElems = function() {
  4574. return this.elems;
  4575. };
  4576. Msg.prototype.getMsgUniqueId = function() {
  4577. return this.uniqueId;
  4578. };
  4579. //文本
  4580. Msg.prototype.addText = function(text) {
  4581. this.addElem(new webim.Msg.Elem(MSG_ELEMENT_TYPE.TEXT, text));
  4582. };
  4583. //表情
  4584. Msg.prototype.addFace = function(face) {
  4585. this.addElem(new webim.Msg.Elem(MSG_ELEMENT_TYPE.FACE, face));
  4586. };
  4587. //图片
  4588. Msg.prototype.addImage = function(image) {
  4589. this.addElem(new webim.Msg.Elem(MSG_ELEMENT_TYPE.IMAGE, image));
  4590. };
  4591. //地理位置
  4592. Msg.prototype.addLocation = function(location) {
  4593. this.addElem(new webim.Msg.Elem(MSG_ELEMENT_TYPE.LOCATION, location));
  4594. };
  4595. //文件
  4596. Msg.prototype.addFile = function(file) {
  4597. this.addElem(new webim.Msg.Elem(MSG_ELEMENT_TYPE.FILE, file));
  4598. };
  4599. //自定义
  4600. Msg.prototype.addCustom = function(custom) {
  4601. this.addElem(new webim.Msg.Elem(MSG_ELEMENT_TYPE.CUSTOM, custom));
  4602. };
  4603. Msg.prototype.addElem = function(elem) {
  4604. this.elems.push(elem);
  4605. };
  4606. Msg.prototype.toHtml = function() {
  4607. var html = '';
  4608. for (var i in this.elems) {
  4609. var elem = this.elems[i];
  4610. html += elem.toHtml();
  4611. }
  4612. return html;
  4613. };
  4614. // 暴力点 直接添加,内部的配置不细写
  4615. Msg.prototype.setOfflinePushInfo = function(offlinePushInfo) {
  4616. this.offlinePushInfo = offlinePushInfo;
  4617. };
  4618. // class Msg.Elem
  4619. Msg.Elem = function(type, value) {
  4620. this.type = type;
  4621. this.content = value;
  4622. };
  4623. Msg.Elem.prototype.getType = function() {
  4624. return this.type;
  4625. };
  4626. Msg.Elem.prototype.getContent = function() {
  4627. return this.content;
  4628. };
  4629. Msg.Elem.prototype.toHtml = function() {
  4630. var html;
  4631. html = this.content.toHtml();
  4632. return html;
  4633. };
  4634. // class Msg.Elem.Text
  4635. Msg.Elem.Text = function(text) {
  4636. this.text = tool.xssFilter(text);
  4637. };
  4638. Msg.Elem.Text.prototype.getText = function() {
  4639. return this.text;
  4640. };
  4641. Msg.Elem.Text.prototype.toHtml = function() {
  4642. return this.text;
  4643. };
  4644. // class Msg.Elem.Face
  4645. Msg.Elem.Face = function(index, data) {
  4646. this.index = index;
  4647. this.data = data;
  4648. };
  4649. Msg.Elem.Face.prototype.getIndex = function() {
  4650. return this.index;
  4651. };
  4652. Msg.Elem.Face.prototype.getData = function() {
  4653. return this.data;
  4654. };
  4655. Msg.Elem.Face.prototype.toHtml = function() {
  4656. var faceUrl = null;
  4657. var index = emotionDataIndexs[this.data];
  4658. var emotion = emotions[index];
  4659. if (emotion && emotion[1]) {
  4660. faceUrl = emotion[1];
  4661. }
  4662. if (faceUrl) {
  4663. return "<img src='" + faceUrl + "'/>";
  4664. } else {
  4665. return this.data;
  4666. }
  4667. };
  4668. // 地理位置消息 class Msg.Elem.Location
  4669. Msg.Elem.Location = function(longitude, latitude, desc) {
  4670. this.latitude = latitude; //纬度
  4671. this.longitude = longitude; //经度
  4672. this.desc = desc; //描述
  4673. };
  4674. Msg.Elem.Location.prototype.getLatitude = function() {
  4675. return this.latitude;
  4676. };
  4677. Msg.Elem.Location.prototype.getLongitude = function() {
  4678. return this.longitude;
  4679. };
  4680. Msg.Elem.Location.prototype.getDesc = function() {
  4681. return this.desc;
  4682. };
  4683. Msg.Elem.Location.prototype.toHtml = function() {
  4684. return '经度=' + this.longitude + ',纬度=' + this.latitude + ',描述=' + this.desc;
  4685. };
  4686. //图片消息
  4687. // class Msg.Elem.Images
  4688. Msg.Elem.Images = function(imageId, format) {
  4689. this.UUID = imageId;
  4690. if (typeof format !== 'number') {
  4691. format = parseInt(IMAGE_FORMAT[format] || IMAGE_FORMAT['UNKNOWN'], 10);
  4692. }
  4693. this.ImageFormat = format;
  4694. this.ImageInfoArray = [];
  4695. };
  4696. Msg.Elem.Images.prototype.addImage = function(image) {
  4697. this.ImageInfoArray.push(image);
  4698. };
  4699. Msg.Elem.Images.prototype.toHtml = function() {
  4700. var smallImage = this.getImage(IMAGE_TYPE.SMALL);
  4701. var bigImage = this.getImage(IMAGE_TYPE.LARGE);
  4702. var oriImage = this.getImage(IMAGE_TYPE.ORIGIN);
  4703. if (!bigImage) {
  4704. bigImage = smallImage;
  4705. }
  4706. if (!oriImage) {
  4707. oriImage = smallImage;
  4708. }
  4709. return (
  4710. "<img src='" +
  4711. smallImage.getUrl() +
  4712. '#' +
  4713. bigImage.getUrl() +
  4714. '#' +
  4715. oriImage.getUrl() +
  4716. "' style='CURSOR: hand' id='" +
  4717. this.getImageId() +
  4718. "' bigImgUrl='" +
  4719. bigImage.getUrl() +
  4720. "' onclick='imageClick(this)' />"
  4721. );
  4722. };
  4723. Msg.Elem.Images.prototype.getImageId = function() {
  4724. return this.UUID;
  4725. };
  4726. Msg.Elem.Images.prototype.getImageFormat = function() {
  4727. return this.ImageFormat;
  4728. };
  4729. Msg.Elem.Images.prototype.getImage = function(type) {
  4730. for (var i in this.ImageInfoArray) {
  4731. if (this.ImageInfoArray[i].getType() == type) {
  4732. return this.ImageInfoArray[i];
  4733. }
  4734. }
  4735. var img = null;
  4736. this.ImageInfoArray.forEach(function(image) {
  4737. if (image.getType() == type) {
  4738. img = image;
  4739. }
  4740. });
  4741. return img;
  4742. };
  4743. // class Msg.Elem.Images.Image
  4744. Msg.Elem.Images.Image = function(type, size, width, height, url) {
  4745. this.type = type;
  4746. this.size = size;
  4747. this.width = width;
  4748. this.height = height;
  4749. this.url = url;
  4750. };
  4751. Msg.Elem.Images.Image.prototype.getType = function() {
  4752. return this.type;
  4753. };
  4754. Msg.Elem.Images.Image.prototype.getSize = function() {
  4755. return this.size;
  4756. };
  4757. Msg.Elem.Images.Image.prototype.getWidth = function() {
  4758. return this.width;
  4759. };
  4760. Msg.Elem.Images.Image.prototype.getHeight = function() {
  4761. return this.height;
  4762. };
  4763. Msg.Elem.Images.Image.prototype.getUrl = function() {
  4764. return this.url;
  4765. };
  4766. // class Msg.Elem.Sound
  4767. Msg.Elem.Sound = function(uuid, second, size, senderId, receiverId, downFlag, chatType) {
  4768. this.uuid = uuid; //文件id
  4769. this.second = second; //时长,单位:秒
  4770. this.size = size; //大小,单位:字节
  4771. this.senderId = senderId; //发送者
  4772. this.receiverId = receiverId; //接收方id
  4773. this.downFlag = downFlag; //下载标志位
  4774. this.busiId = chatType == SESSION_TYPE.C2C ? 2 : 1; //busi_id ( 1:群 2:C2C)
  4775. //根据不同情况拉取数据
  4776. //是否需要申请下载地址 0:到架平申请 1:到cos申请 2:不需要申请, 直接拿url下载
  4777. if (this.downFlag !== undefined && this.busiId !== undefined) {
  4778. getFileDownUrlV2(uuid, senderId, second, downFlag, receiverId, this.busiId, UPLOAD_RES_TYPE.SOUND);
  4779. } else {
  4780. this.downUrl = getSoundDownUrl(uuid, senderId, second); //下载地址
  4781. }
  4782. };
  4783. Msg.Elem.Sound.prototype.getUUID = function() {
  4784. return this.uuid;
  4785. };
  4786. Msg.Elem.Sound.prototype.getSecond = function() {
  4787. return this.second;
  4788. };
  4789. Msg.Elem.Sound.prototype.getSize = function() {
  4790. return this.size;
  4791. };
  4792. Msg.Elem.Sound.prototype.getSenderId = function() {
  4793. return this.senderId;
  4794. };
  4795. Msg.Elem.Sound.prototype.getDownUrl = function() {
  4796. return this.downUrl;
  4797. };
  4798. Msg.Elem.Sound.prototype.toHtml = function() {
  4799. if (BROWSER_INFO.type == 'ie' && parseInt(BROWSER_INFO.ver) <= 8) {
  4800. return '[这是一条语音消息]demo暂不支持ie8(含)以下浏览器播放语音,语音URL:' + this.downUrl;
  4801. }
  4802. return '<audio id="uuid_' + this.uuid + '" src="' + this.downUrl + '" controls="controls" onplay="onChangePlayAudio(this)" preload="none"></audio>';
  4803. };
  4804. // class Msg.Elem.File
  4805. Msg.Elem.File = function(uuid, name, size, senderId, receiverId, downFlag, chatType) {
  4806. this.uuid = uuid; //文件id
  4807. this.name = name; //文件名
  4808. this.size = size; //大小,单位:字节
  4809. this.senderId = senderId; //发送者
  4810. this.receiverId = receiverId; //接收方id
  4811. this.downFlag = downFlag; //下载标志位
  4812. this.busiId = chatType == SESSION_TYPE.C2C ? 2 : 1; //busi_id ( 1:群 2:C2C)
  4813. //根据不同情况拉取数据
  4814. //是否需要申请下载地址 0:到架平申请 1:到cos申请 2:不需要申请, 直接拿url下载
  4815. if (downFlag !== undefined && busiId !== undefined) {
  4816. getFileDownUrlV2(uuid, senderId, name, downFlag, receiverId, this.busiId, UPLOAD_RES_TYPE.FILE);
  4817. } else {
  4818. this.downUrl = getFileDownUrl(uuid, senderId, name); //下载地址
  4819. }
  4820. };
  4821. Msg.Elem.File.prototype.getUUID = function() {
  4822. return this.uuid;
  4823. };
  4824. Msg.Elem.File.prototype.getName = function() {
  4825. return this.name;
  4826. };
  4827. Msg.Elem.File.prototype.getSize = function() {
  4828. return this.size;
  4829. };
  4830. Msg.Elem.File.prototype.getSenderId = function() {
  4831. return this.senderId;
  4832. };
  4833. Msg.Elem.File.prototype.getDownUrl = function() {
  4834. return this.downUrl;
  4835. };
  4836. Msg.Elem.File.prototype.getDownFlag = function() {
  4837. return this.downFlag;
  4838. };
  4839. Msg.Elem.File.prototype.toHtml = function() {
  4840. var fileSize, unitStr;
  4841. fileSize = this.size;
  4842. unitStr = 'Byte';
  4843. if (this.size >= 1024) {
  4844. fileSize = Math.round(this.size / 1024);
  4845. unitStr = 'KB';
  4846. }
  4847. return (
  4848. '<a href="javascript" onclick="webim.onDownFile("' +
  4849. this.uuid +
  4850. '")" title="点击下载文件" ><i class="glyphicon glyphicon-file">&nbsp;' +
  4851. this.name +
  4852. '(' +
  4853. fileSize +
  4854. unitStr +
  4855. ')</i></a>'
  4856. );
  4857. };
  4858. // class Msg.Elem.GroupTip 群提示消息对象
  4859. Msg.Elem.GroupTip = function(opType, opUserId, groupId, groupName, userIdList, userinfo) {
  4860. this.opType = opType; //操作类型
  4861. this.opUserId = opUserId; //操作者id
  4862. this.groupId = groupId; //群id
  4863. this.groupName = groupName; //群名称
  4864. this.userIdList = userIdList ? userIdList : []; //被操作的用户id列表
  4865. this.groupInfoList = []; //新的群资料信息,群资料变更时才有值
  4866. this.memberInfoList = []; //新的群成员资料信息,群成员资料变更时才有值
  4867. this.groupMemberNum = null; //群成员数,操作类型为加群或者退群时才有值
  4868. this.userinfo = userinfo ? userinfo : []; //被操作的用户信息列表列表
  4869. };
  4870. Msg.Elem.GroupTip.prototype.addGroupInfo = function(groupInfo) {
  4871. this.groupInfoList.push(groupInfo);
  4872. };
  4873. Msg.Elem.GroupTip.prototype.addMemberInfo = function(memberInfo) {
  4874. this.memberInfoList.push(memberInfo);
  4875. };
  4876. Msg.Elem.GroupTip.prototype.getOpType = function() {
  4877. return this.opType;
  4878. };
  4879. Msg.Elem.GroupTip.prototype.getOpUserId = function() {
  4880. return this.opUserId;
  4881. };
  4882. Msg.Elem.GroupTip.prototype.getGroupId = function() {
  4883. return this.groupId;
  4884. };
  4885. Msg.Elem.GroupTip.prototype.getGroupName = function() {
  4886. return this.groupName;
  4887. };
  4888. Msg.Elem.GroupTip.prototype.getUserIdList = function() {
  4889. return this.userIdList;
  4890. };
  4891. Msg.Elem.GroupTip.prototype.getUserInfo = function() {
  4892. return this.userinfo;
  4893. };
  4894. Msg.Elem.GroupTip.prototype.getGroupInfoList = function() {
  4895. return this.groupInfoList;
  4896. };
  4897. Msg.Elem.GroupTip.prototype.getMemberInfoList = function() {
  4898. return this.memberInfoList;
  4899. };
  4900. Msg.Elem.GroupTip.prototype.getGroupMemberNum = function() {
  4901. return this.groupMemberNum;
  4902. };
  4903. Msg.Elem.GroupTip.prototype.setGroupMemberNum = function(groupMemberNum) {
  4904. return (this.groupMemberNum = groupMemberNum);
  4905. };
  4906. Msg.Elem.GroupTip.prototype.toHtml = function() {
  4907. var text = '[群提示消息]';
  4908. var maxIndex = GROUP_TIP_MAX_USER_COUNT - 1;
  4909. switch (this.opType) {
  4910. case GROUP_TIP_TYPE.JOIN: //加入群
  4911. text += this.opUserId + '邀请了';
  4912. for (var m in this.userIdList) {
  4913. text += this.userIdList[m] + ',';
  4914. if (this.userIdList.length > GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
  4915. text += '等' + this.userIdList.length + '人';
  4916. break;
  4917. }
  4918. }
  4919. text += '加入该群';
  4920. break;
  4921. case GROUP_TIP_TYPE.QUIT: //退出群
  4922. text += this.opUserId + '主动退出该群';
  4923. break;
  4924. case GROUP_TIP_TYPE.KICK: //踢出群
  4925. text += this.opUserId + '将';
  4926. for (var m in this.userIdList) {
  4927. text += this.userIdList[m] + ',';
  4928. if (this.userIdList.length > GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
  4929. text += '等' + this.userIdList.length + '人';
  4930. break;
  4931. }
  4932. }
  4933. text += '踢出该群';
  4934. break;
  4935. case GROUP_TIP_TYPE.SET_ADMIN: //设置管理员
  4936. text += this.opUserId + '将';
  4937. for (var m in this.userIdList) {
  4938. text += this.userIdList[m] + ',';
  4939. if (this.userIdList.length > GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
  4940. text += '等' + this.userIdList.length + '人';
  4941. break;
  4942. }
  4943. }
  4944. text += '设为管理员';
  4945. break;
  4946. case GROUP_TIP_TYPE.CANCEL_ADMIN: //取消管理员
  4947. text += this.opUserId + '取消';
  4948. for (var m in this.userIdList) {
  4949. text += this.userIdList[m] + ',';
  4950. if (this.userIdList.length > GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
  4951. text += '等' + this.userIdList.length + '人';
  4952. break;
  4953. }
  4954. }
  4955. text += '的管理员资格';
  4956. break;
  4957. case GROUP_TIP_TYPE.MODIFY_GROUP_INFO: //群资料变更
  4958. text += this.opUserId + '修改了群资料:';
  4959. for (var m in this.groupInfoList) {
  4960. var type = this.groupInfoList[m].getType();
  4961. var value = this.groupInfoList[m].getValue();
  4962. switch (type) {
  4963. case GROUP_TIP_MODIFY_GROUP_INFO_TYPE.FACE_URL:
  4964. text += '群头像为' + value + '; ';
  4965. break;
  4966. case GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NAME:
  4967. text += '群名称为' + value + '; ';
  4968. break;
  4969. case GROUP_TIP_MODIFY_GROUP_INFO_TYPE.OWNER:
  4970. text += '群主为' + value + '; ';
  4971. break;
  4972. case GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NOTIFICATION:
  4973. text += '群公告为' + value + '; ';
  4974. break;
  4975. case GROUP_TIP_MODIFY_GROUP_INFO_TYPE.INTRODUCTION:
  4976. text += '群简介为' + value + '; ';
  4977. break;
  4978. default:
  4979. text += '未知信息为:type=' + type + ',value=' + value + '; ';
  4980. break;
  4981. }
  4982. }
  4983. break;
  4984. case GROUP_TIP_TYPE.MODIFY_MEMBER_INFO: //群成员资料变更(禁言时间)
  4985. text += this.opUserId + '修改了群成员资料:';
  4986. for (var m in this.memberInfoList) {
  4987. var userId = this.memberInfoList[m].getUserId();
  4988. var shutupTime = this.memberInfoList[m].getShutupTime();
  4989. text += userId + ': ';
  4990. if (shutupTime != null && shutupTime !== undefined) {
  4991. if (shutupTime == 0) {
  4992. text += '取消禁言; ';
  4993. } else {
  4994. text += '禁言' + shutupTime + '秒; ';
  4995. }
  4996. } else {
  4997. text += ' shutupTime为空';
  4998. }
  4999. if (this.memberInfoList.length > GROUP_TIP_MAX_USER_COUNT && m == maxIndex) {
  5000. text += '等' + this.memberInfoList.length + '人';
  5001. break;
  5002. }
  5003. }
  5004. break;
  5005. case GROUP_TIP_TYPE.READED: //消息已读
  5006. /**/
  5007. Log.info('消息已读同步');
  5008. break;
  5009. default:
  5010. text += '未知群提示消息类型:type=' + this.opType;
  5011. break;
  5012. }
  5013. return text;
  5014. };
  5015. // class Msg.Elem.GroupTip.GroupInfo,变更的群资料信息对象
  5016. Msg.Elem.GroupTip.GroupInfo = function(type, value) {
  5017. this.type = type; //群资料信息类型
  5018. this.value = value; //对应的值
  5019. };
  5020. Msg.Elem.GroupTip.GroupInfo.prototype.getType = function() {
  5021. return this.type;
  5022. };
  5023. Msg.Elem.GroupTip.GroupInfo.prototype.getValue = function() {
  5024. return this.value;
  5025. };
  5026. // class Msg.Elem.GroupTip.MemberInfo,变更的群成员资料信息对象
  5027. Msg.Elem.GroupTip.MemberInfo = function(userId, shutupTime) {
  5028. this.userId = userId; //群成员id
  5029. this.shutupTime = shutupTime; //群成员被禁言时间,0表示取消禁言,大于0表示被禁言时长,单位:秒
  5030. };
  5031. Msg.Elem.GroupTip.MemberInfo.prototype.getUserId = function() {
  5032. return this.userId;
  5033. };
  5034. Msg.Elem.GroupTip.MemberInfo.prototype.getShutupTime = function() {
  5035. return this.shutupTime;
  5036. };
  5037. // 自定义消息类型 class Msg.Elem.Custom
  5038. Msg.Elem.Custom = function(data, desc, ext) {
  5039. this.data = data; //数据
  5040. this.desc = desc; //描述
  5041. this.ext = ext; //扩展字段
  5042. };
  5043. Msg.Elem.Custom.prototype.getData = function() {
  5044. return this.data;
  5045. };
  5046. Msg.Elem.Custom.prototype.getDesc = function() {
  5047. return this.desc;
  5048. };
  5049. Msg.Elem.Custom.prototype.getExt = function() {
  5050. return this.ext;
  5051. };
  5052. Msg.Elem.Custom.prototype.toHtml = function() {
  5053. return this.data;
  5054. };
  5055. // singleton object MsgStore
  5056. var MsgStore = new function() {
  5057. var sessMap = {}; //跟所有用户或群的聊天记录MAP
  5058. var sessTimeline = []; //按时间降序排列的会话列表
  5059. msgCache = {}; //消息缓存,用于判重
  5060. //C2C
  5061. this.cookie = ''; //上一次拉取新c2c消息的cookie
  5062. this.syncFlag = 0; //上一次拉取新c2c消息的是否继续拉取标记
  5063. var visitSess = function(visitor) {
  5064. for (var i in sessMap) {
  5065. visitor(sessMap[i]);
  5066. }
  5067. };
  5068. //消息查重
  5069. var checkDupMsg = function(msg) {
  5070. var dup = false;
  5071. var first_key = msg.sess._impl.skey;
  5072. var second_key = msg.isSend + msg.seq + msg.random;
  5073. var tempMsg = msgCache[first_key] && msgCache[first_key][second_key];
  5074. if (tempMsg) {
  5075. dup = true;
  5076. }
  5077. if (msgCache[first_key]) {
  5078. msgCache[first_key][second_key] = {
  5079. time: msg.time
  5080. };
  5081. } else {
  5082. msgCache[first_key] = {};
  5083. msgCache[first_key][second_key] = {
  5084. time: msg.time
  5085. };
  5086. }
  5087. return dup;
  5088. };
  5089. this.sessMap = function() {
  5090. return sessMap;
  5091. };
  5092. this.sessCount = function() {
  5093. return sessTimeline.length;
  5094. };
  5095. this.sessByTypeId = function(type, id) {
  5096. var skey = Session.skey(type, id);
  5097. if (skey === undefined || skey == null) return null;
  5098. return sessMap[skey];
  5099. };
  5100. this.delSessByTypeId = function(type, id) {
  5101. var skey = Session.skey(type, id);
  5102. if (skey === undefined || skey == null) return false;
  5103. if (sessMap[skey]) {
  5104. delete sessMap[skey];
  5105. delete msgCache[skey];
  5106. }
  5107. return true;
  5108. };
  5109. this.resetCookieAndSyncFlag = function() {
  5110. this.cookie = '';
  5111. this.syncFlag = 0;
  5112. };
  5113. //切换将当前会话的自动读取消息标志为isOn,重置其他会话的自动读取消息标志为false
  5114. this.setAutoRead = function(selSess, isOn, isResetAll) {
  5115. if (isResetAll)
  5116. visitSess(function(s) {
  5117. s._impl.isAutoRead = false;
  5118. });
  5119. if (selSess) {
  5120. selSess._impl.isAutoRead = isOn; //
  5121. if (isOn) {
  5122. //是否调用已读上报接口
  5123. selSess._impl.unread = 0;
  5124. if (selSess._impl.type == SESSION_TYPE.C2C) {
  5125. //私聊消息已读上报
  5126. var tmpC2CMsgReadedItem = [];
  5127. tmpC2CMsgReadedItem.push(new C2CMsgReadedItem(selSess._impl.id, selSess._impl.time));
  5128. //调用C2C消息已读上报接口
  5129. proto_c2CMsgReaded(
  5130. MsgStore.cookie,
  5131. tmpC2CMsgReadedItem,
  5132. function(resp) {
  5133. log.info('[setAutoRead]: c2CMsgReaded success');
  5134. },
  5135. function(err) {
  5136. log.error('[setAutoRead}: c2CMsgReaded failed:' + err.ErrorInfo);
  5137. }
  5138. );
  5139. } else if (selSess._impl.type == SESSION_TYPE.GROUP) {
  5140. //群聊消息已读上报
  5141. var tmpOpt = {
  5142. GroupId: selSess._impl.id,
  5143. MsgReadedSeq: selSess._impl.curMaxMsgSeq
  5144. };
  5145. //调用group消息已读上报接口
  5146. proto_groupMsgReaded(
  5147. tmpOpt,
  5148. function(resp) {
  5149. log.info('groupMsgReaded success');
  5150. },
  5151. function(err) {
  5152. log.error('groupMsgReaded failed:' + err.ErrorInfo);
  5153. }
  5154. );
  5155. }
  5156. }
  5157. }
  5158. };
  5159. this.c2CMsgReaded = function(opts, cbOk, cbErr) {
  5160. var tmpC2CMsgReadedItem = [];
  5161. tmpC2CMsgReadedItem.push(new C2CMsgReadedItem(opts.To_Account, opts.LastedMsgTime));
  5162. //调用C2C消息已读上报接口
  5163. proto_c2CMsgReaded(
  5164. MsgStore.cookie,
  5165. tmpC2CMsgReadedItem,
  5166. function(resp) {
  5167. if (cbOk) {
  5168. log.info('c2CMsgReaded success');
  5169. cbOk(resp);
  5170. }
  5171. },
  5172. function(err) {
  5173. if (cbErr) {
  5174. log.error('c2CMsgReaded failed:' + err.ErrorInfo);
  5175. cbErr(err);
  5176. }
  5177. }
  5178. );
  5179. };
  5180. this.addSession = function(sess) {
  5181. sessMap[sess._impl.skey] = sess;
  5182. };
  5183. this.delSession = function(sess) {
  5184. delete sessMap[sess._impl.skey];
  5185. };
  5186. this.clear = function() {
  5187. sessMap = {}; //跟所有用户或群的聊天记录MAP
  5188. sessTimeline = []; //按时间降序排列的会话列表
  5189. msgCache = {}; //消息缓存,用于判重
  5190. this.cookie = ''; //上一次拉取新c2c消息的cookie
  5191. this.syncFlag = 0; //上一次拉取新c2c消息的是否继续拉取标记
  5192. };
  5193. this.addMsg = function(msg, unread) {
  5194. if (checkDupMsg(msg)) return false;
  5195. var sess = msg.sess;
  5196. if (!sessMap[sess._impl.skey]) this.addSession(sess);
  5197. sess._impl_addMsg(msg, unread);
  5198. return true;
  5199. };
  5200. this.updateTimeline = function() {
  5201. var arr = new Array();
  5202. visitSess(function(sess) {
  5203. arr.push(sess);
  5204. });
  5205. arr.sort(function(a, b) {
  5206. return b.time - a.time;
  5207. });
  5208. sessTimeline = arr;
  5209. };
  5210. }();
  5211. // singleton object MsgManager
  5212. var MsgManager = new function() {
  5213. var onMsgCallback = null; //新消息(c2c和group)回调
  5214. var onGroupInfoChangeCallback = null; //群资料变化回调
  5215. //收到新群系统消息回调列表
  5216. var onGroupSystemNotifyCallbacks = {
  5217. '1': null,
  5218. '2': null,
  5219. '3': null,
  5220. '4': null,
  5221. '5': null,
  5222. '6': null,
  5223. '7': null,
  5224. '8': null,
  5225. '9': null,
  5226. '10': null,
  5227. '11': null,
  5228. '15': null,
  5229. '255': null,
  5230. '12': null
  5231. };
  5232. //监听好友系统通知函数
  5233. var onFriendSystemNotifyCallbacks = {
  5234. '1': null,
  5235. '2': null,
  5236. '3': null,
  5237. '4': null,
  5238. '5': null,
  5239. '6': null,
  5240. '7': null,
  5241. '8': null
  5242. };
  5243. var onProfileSystemNotifyCallbacks = {
  5244. '1': null
  5245. };
  5246. var onKickedEventCall = null;
  5247. var onMsgReadCallback = null;
  5248. //普通长轮询
  5249. var longPollingOn = false; //是否开启普通长轮询
  5250. var isLongPollingRequesting = false; //是否在长轮询ing
  5251. var notifySeq = 0; //c2c通知seq
  5252. var noticeSeq = 0; //群消息seq
  5253. //大群长轮询
  5254. var onBigGroupMsgCallback = null; //大群消息回调
  5255. var bigGroupLongPollingOn = false; //是否开启长轮询
  5256. var bigGroupLongPollingStartSeq = 0; //请求拉消息的起始seq(大群长轮询)
  5257. var bigGroupLongPollingHoldTime = 90; //客户端长轮询的超时时间,单位是秒(大群长轮询)
  5258. var bigGroupLongPollingKey = null; //客户端加入群组后收到的的Key(大群长轮询)
  5259. var bigGroupLongPollingMsgMap = {}; //记录收到的群消息数
  5260. var onC2cEventCallbacks = {
  5261. '92': null, //消息已读通知,
  5262. '96': null
  5263. };
  5264. var onAppliedDownloadUrl = null;
  5265. var getLostGroupMsgCount = 0; //补拉丢失的群消息次数
  5266. //我的群当前最大的seq
  5267. var myGroupMaxSeqs = {}; //用于补拉丢失的群消息
  5268. var groupSystemMsgsCache = {}; //群组系统消息缓存,用于判重
  5269. //设置长轮询开关
  5270. //isOn=true 开启
  5271. //isOn=false 停止
  5272. this.setLongPollingOn = function(isOn) {
  5273. longPollingOn = isOn;
  5274. };
  5275. this.getLongPollingOn = function() {
  5276. return longPollingOn;
  5277. };
  5278. //重置长轮询变量
  5279. this.resetLongPollingInfo = function() {
  5280. longPollingOn = false;
  5281. notifySeq = 0;
  5282. noticeSeq = 0;
  5283. };
  5284. //设置大群长轮询开关
  5285. //isOn=true 开启
  5286. //isOn=false 停止
  5287. this.setBigGroupLongPollingOn = function(isOn) {
  5288. bigGroupLongPollingOn = isOn;
  5289. };
  5290. //设置大群长轮询key
  5291. this.setBigGroupLongPollingKey = function(key) {
  5292. bigGroupLongPollingKey = key;
  5293. };
  5294. //重置大群长轮询变量
  5295. this.resetBigGroupLongPollingInfo = function() {
  5296. bigGroupLongPollingOn = false;
  5297. bigGroupLongPollingStartSeq = 0;
  5298. bigGroupLongPollingKey = null;
  5299. bigGroupLongPollingMsgMap = {};
  5300. };
  5301. //设置群消息数据条数
  5302. this.setBigGroupLongPollingMsgMap = function(groupId, count) {
  5303. var bigGroupLongPollingMsgCount = bigGroupLongPollingMsgMap[groupId];
  5304. if (bigGroupLongPollingMsgCount) {
  5305. bigGroupLongPollingMsgCount = parseInt(bigGroupLongPollingMsgCount) + count;
  5306. bigGroupLongPollingMsgMap[groupId] = bigGroupLongPollingMsgCount;
  5307. } else {
  5308. bigGroupLongPollingMsgMap[groupId] = count;
  5309. }
  5310. };
  5311. //重置
  5312. this.clear = function() {
  5313. onGroupInfoChangeCallback = null;
  5314. onGroupSystemNotifyCallbacks = {
  5315. '1': null, //申请加群请求(只有管理员会收到)
  5316. '2': null, //申请加群被同意(只有申请人能够收到)
  5317. '3': null, //申请加群被拒绝(只有申请人能够收到)
  5318. '4': null, //被管理员踢出群(只有被踢者接收到)
  5319. '5': null, //群被解散(全员接收)
  5320. '6': null, //创建群(创建者接收)
  5321. '7': null, //邀请加群(被邀请者接收)
  5322. '8': null, //主动退群(主动退出者接收)
  5323. '9': null, //设置管理员(被设置者接收)
  5324. '10': null, //取消管理员(被取消者接收)
  5325. '11': null, //群已被回收(全员接收)
  5326. '15': null, //群已被回收(全员接收)
  5327. '255': null, //用户自定义通知(默认全员接收)
  5328. '12': null //邀请加群(被邀请者需要同意)
  5329. };
  5330. onFriendSystemNotifyCallbacks = {
  5331. '1': null, //好友表增加
  5332. '2': null, //好友表删除
  5333. '3': null, //未决增加
  5334. '4': null, //未决删除
  5335. '5': null, //黑名单增加
  5336. '6': null, //黑名单删除
  5337. '7': null, //未决已读上报
  5338. '8': null //好友信息(备注,分组)变更
  5339. };
  5340. onProfileSystemNotifyCallbacks = {
  5341. '1': null //资料修改
  5342. };
  5343. //重置普通长轮询参数
  5344. onMsgCallback = null;
  5345. longPollingOn = false;
  5346. notifySeq = 0; //c2c新消息通知seq
  5347. noticeSeq = 0; //group新消息seq
  5348. //重置大群长轮询参数
  5349. onBigGroupMsgCallback = null;
  5350. bigGroupLongPollingOn = false;
  5351. bigGroupLongPollingStartSeq = 0;
  5352. bigGroupLongPollingKey = null;
  5353. bigGroupLongPollingMsgMap = {};
  5354. groupSystemMsgsCache = {};
  5355. ipList = []; //文件下载地址
  5356. authkey = null; //文件下载票据
  5357. expireTime = null; //票据超时时间
  5358. };
  5359. //初始化文件下载ip和票据
  5360. var initIpAndAuthkey = function(cbOk, cbErr) {
  5361. proto_getIpAndAuthkey(
  5362. function(resp) {
  5363. ipList = resp.IpList;
  5364. authkey = resp.AuthKey;
  5365. expireTime = resp.ExpireTime;
  5366. if (cbOk) cbOk(resp);
  5367. },
  5368. function(err) {
  5369. log.error('initIpAndAuthkey failed:' + err.ErrorInfo);
  5370. if (cbErr) cbErr(err);
  5371. }
  5372. );
  5373. };
  5374. //初始化我的群当前最大的seq,用于补拉丢失的群消息
  5375. var initMyGroupMaxSeqs = function(cbOk, cbErr) {
  5376. var opts = {
  5377. Member_Account: ctx.identifier,
  5378. Limit: 1000,
  5379. Offset: 0,
  5380. GroupBaseInfoFilter: ['NextMsgSeq']
  5381. };
  5382. proto_getJoinedGroupListHigh(
  5383. opts,
  5384. function(resp) {
  5385. if (!resp.GroupIdList || resp.GroupIdList.length == 0) {
  5386. log.info('initMyGroupMaxSeqs: 目前还没有加入任何群组');
  5387. if (cbOk) cbOk(resp);
  5388. return;
  5389. }
  5390. for (var i = 0; i < resp.GroupIdList.length; i++) {
  5391. var group_id = resp.GroupIdList[i].GroupId;
  5392. var curMaxSeq = resp.GroupIdList[i].NextMsgSeq - 1;
  5393. myGroupMaxSeqs[group_id] = curMaxSeq;
  5394. }
  5395. if (cbOk) cbOk(resp);
  5396. },
  5397. function(err) {
  5398. log.error('initMyGroupMaxSeqs failed:' + err.ErrorInfo);
  5399. if (cbErr) cbErr(err);
  5400. }
  5401. );
  5402. };
  5403. //补拉群消息
  5404. var getLostGroupMsgs = function(groupId, reqMsgSeq, reqMsgNumber) {
  5405. getLostGroupMsgCount++;
  5406. //发起一个拉群群消息请求
  5407. var tempOpts = {
  5408. GroupId: groupId,
  5409. ReqMsgSeq: reqMsgSeq,
  5410. ReqMsgNumber: reqMsgNumber
  5411. };
  5412. //发起一个拉群群消息请求
  5413. log.warn('第' + getLostGroupMsgCount + '次补齐群消息,参数=' + JSON.stringify(tempOpts));
  5414. MsgManager.syncGroupMsgs(tempOpts);
  5415. };
  5416. //更新群当前最大消息seq
  5417. var updateMyGroupCurMaxSeq = function(groupId, msgSeq) {
  5418. //更新myGroupMaxSeqs中的群最大seq
  5419. var curMsgSeq = myGroupMaxSeqs[groupId];
  5420. if (curMsgSeq) {
  5421. //如果存在,比较大小
  5422. if (msgSeq > curMsgSeq) {
  5423. myGroupMaxSeqs[groupId] = msgSeq;
  5424. }
  5425. } else {
  5426. //不存在,新增
  5427. myGroupMaxSeqs[groupId] = msgSeq;
  5428. }
  5429. };
  5430. //添加群消息列表
  5431. var addGroupMsgList = function(msgs, new_group_msgs) {
  5432. for (var p in msgs) {
  5433. var newGroupMsg = msgs[p];
  5434. //发群消息时,长轮询接口会返回用户自己发的群消息
  5435. //if(newGroupMsg.From_Account && newGroupMsg.From_Account!=ctx.identifier ){
  5436. if (newGroupMsg.From_Account) {
  5437. //false-不是主动拉取的历史消息
  5438. //true-需要保存到sdk本地session,并且需要判重
  5439. var msg = handlerGroupMsg(newGroupMsg, false, true);
  5440. if (msg) {
  5441. //不为空,加到新消息里
  5442. new_group_msgs.push(msg);
  5443. }
  5444. //更新myGroupMaxSeqs中的群最大seq
  5445. updateMyGroupCurMaxSeq(newGroupMsg.ToGroupId, newGroupMsg.MsgSeq);
  5446. }
  5447. }
  5448. return new_group_msgs;
  5449. };
  5450. //处理收到的群普通和提示消息
  5451. var handlerOrdinaryAndTipC2cMsgs = function(eventType, groupMsgArray) {
  5452. var groupMsgMap = {}; //保存收到的C2c消息信息(群号,最小,最大消息seq,消息列表)
  5453. var new_group_msgs = [];
  5454. var minGroupMsgSeq = 99999999;
  5455. var maxGroupMsgSeq = -1;
  5456. for (var j in groupMsgArray) {
  5457. var groupMsgs = groupMsgMap[groupMsgArray[j].ToGroupId];
  5458. if (!groupMsgs) {
  5459. groupMsgs = groupMsgMap[groupMsgArray[j].ToGroupId] = {
  5460. min: minGroupMsgSeq, //收到新消息最小seq
  5461. max: maxGroupMsgSeq, //收到新消息最大seq
  5462. msgs: [] //收到的新消息
  5463. };
  5464. }
  5465. //更新长轮询的群NoticeSeq
  5466. if (groupMsgArray[j].NoticeSeq > noticeSeq) {
  5467. log.warn('noticeSeq=' + noticeSeq + ',msgNoticeSeq=' + groupMsgArray[j].NoticeSeq);
  5468. noticeSeq = groupMsgArray[j].NoticeSeq;
  5469. }
  5470. groupMsgArray[j].Event = eventType;
  5471. groupMsgMap[groupMsgArray[j].ToGroupId].msgs.push(groupMsgArray[j]); //新增一条消息
  5472. if (groupMsgArray[j].MsgSeq < groupMsgs.min) {
  5473. //记录最小的消息seq
  5474. groupMsgMap[groupMsgArray[j].ToGroupId].min = groupMsgArray[j].MsgSeq;
  5475. }
  5476. if (groupMsgArray[j].MsgSeq > groupMsgs.max) {
  5477. //记录最大的消息seq
  5478. groupMsgMap[groupMsgArray[j].ToGroupId].max = groupMsgArray[j].MsgSeq;
  5479. }
  5480. }
  5481. for (var groupId in groupMsgMap) {
  5482. var tempCount = groupMsgMap[groupId].max - groupMsgMap[groupId].min + 1; //收到的新的群消息数
  5483. var curMaxMsgSeq = myGroupMaxSeqs[groupId]; //获取本地保存的群最大消息seq
  5484. if (curMaxMsgSeq) {
  5485. //存在这个群的最大消息seq
  5486. //高并发情况下,长轮询可能存在丢消息,这时需要客户端通过拉取群消息接口补齐下
  5487. //1、如果收到的新消息最小seq比当前最大群消息seq大于1,则表示收到的群消息发生跳跃,需要补齐
  5488. //2、收到的新群消息seq存在不连续情况,也需要补齐
  5489. if (groupMsgMap[groupId].min - curMaxMsgSeq > 1 || groupMsgMap[groupId].msgs.length < tempCount) {
  5490. //发起一个拉群群消息请求
  5491. log.warn(
  5492. '发起一次补齐群消息请求,curMaxMsgSeq=' +
  5493. curMaxMsgSeq +
  5494. ', minMsgSeq=' +
  5495. groupMsgMap[groupId].min +
  5496. ', maxMsgSeq=' +
  5497. groupMsgMap[groupId].max +
  5498. ', msgs.length=' +
  5499. groupMsgMap[groupId].msgs.length +
  5500. ', tempCount=' +
  5501. tempCount
  5502. );
  5503. getLostGroupMsgs(groupId, groupMsgMap[groupId].max, groupMsgMap[groupId].max - curMaxMsgSeq);
  5504. //更新myGroupMaxSeqs中的群最大seq
  5505. updateMyGroupCurMaxSeq(groupId, groupMsgMap[groupId].max);
  5506. } else {
  5507. new_group_msgs = addGroupMsgList(groupMsgMap[groupId].msgs, new_group_msgs);
  5508. }
  5509. } else {
  5510. //不存在该群的最大消息seq
  5511. log.warn('不存在该群的最大消息seq,群id=' + groupId);
  5512. //高并发情况下,长轮询可能存在丢消息,这时需要客户端通过拉取群消息接口补齐下
  5513. //1、收到的新群消息seq存在不连续情况,也需要补齐
  5514. if (groupMsgMap[groupId].msgs.length < tempCount) {
  5515. //发起一个拉群群消息请求
  5516. log.warn(
  5517. '发起一次补齐群消息请求,minMsgSeq=' +
  5518. groupMsgMap[groupId].min +
  5519. ', maxMsgSeq=' +
  5520. groupMsgMap[groupId].max +
  5521. ', msgs.length=' +
  5522. groupMsgMap[groupId].msgs.length +
  5523. ', tempCount=' +
  5524. tempCount
  5525. );
  5526. getLostGroupMsgs(groupId, groupMsgMap[groupId].max, tempCount);
  5527. //更新myGroupMaxSeqs中的群最大seq
  5528. updateMyGroupCurMaxSeq(groupId, groupMsgMap[groupId].max);
  5529. } else {
  5530. new_group_msgs = addGroupMsgList(groupMsgMap[groupId].msgs, new_group_msgs);
  5531. }
  5532. }
  5533. }
  5534. if (new_group_msgs.length) {
  5535. MsgStore.updateTimeline();
  5536. }
  5537. if (onMsgCallback && new_group_msgs.length) onMsgCallback(new_group_msgs);
  5538. };
  5539. //处理收到的群普通和提示消息
  5540. var handlerOrdinaryAndTipGroupMsgs = function(eventType, groupMsgArray) {
  5541. var groupMsgMap = {}; //保存收到的群消息信息(群号,最小,最大消息seq,消息列表)
  5542. var new_group_msgs = [];
  5543. var minGroupMsgSeq = 99999999;
  5544. var maxGroupMsgSeq = -1;
  5545. for (var j in groupMsgArray) {
  5546. var groupMsgs = groupMsgMap[groupMsgArray[j].ToGroupId];
  5547. if (!groupMsgs) {
  5548. groupMsgs = groupMsgMap[groupMsgArray[j].ToGroupId] = {
  5549. min: minGroupMsgSeq, //收到新消息最小seq
  5550. max: maxGroupMsgSeq, //收到新消息最大seq
  5551. msgs: [] //收到的新消息
  5552. };
  5553. }
  5554. //更新长轮询的群NoticeSeq
  5555. if (groupMsgArray[j].NoticeSeq > noticeSeq) {
  5556. log.warn('noticeSeq=' + noticeSeq + ',msgNoticeSeq=' + groupMsgArray[j].NoticeSeq);
  5557. noticeSeq = groupMsgArray[j].NoticeSeq;
  5558. }
  5559. groupMsgArray[j].Event = eventType;
  5560. groupMsgMap[groupMsgArray[j].ToGroupId].msgs.push(groupMsgArray[j]); //新增一条消息
  5561. if (groupMsgArray[j].MsgSeq < groupMsgs.min) {
  5562. //记录最小的消息seq
  5563. groupMsgMap[groupMsgArray[j].ToGroupId].min = groupMsgArray[j].MsgSeq;
  5564. }
  5565. if (groupMsgArray[j].MsgSeq > groupMsgs.max) {
  5566. //记录最大的消息seq
  5567. groupMsgMap[groupMsgArray[j].ToGroupId].max = groupMsgArray[j].MsgSeq;
  5568. }
  5569. }
  5570. for (var groupId in groupMsgMap) {
  5571. var tempCount = groupMsgMap[groupId].max - groupMsgMap[groupId].min + 1; //收到的新的群消息数
  5572. var curMaxMsgSeq = myGroupMaxSeqs[groupId]; //获取本地保存的群最大消息seq
  5573. if (curMaxMsgSeq) {
  5574. //存在这个群的最大消息seq
  5575. //高并发情况下,长轮询可能存在丢消息,这时需要客户端通过拉取群消息接口补齐下
  5576. //1、如果收到的新消息最小seq比当前最大群消息seq大于1,则表示收到的群消息发生跳跃,需要补齐
  5577. //2、收到的新群消息seq存在不连续情况,也需要补齐
  5578. if (groupMsgMap[groupId].min - curMaxMsgSeq > 1 || groupMsgMap[groupId].msgs.length < tempCount) {
  5579. //发起一个拉群群消息请求
  5580. log.warn(
  5581. '发起一次补齐群消息请求,curMaxMsgSeq=' +
  5582. curMaxMsgSeq +
  5583. ', minMsgSeq=' +
  5584. groupMsgMap[groupId].min +
  5585. ', maxMsgSeq=' +
  5586. groupMsgMap[groupId].max +
  5587. ', msgs.length=' +
  5588. groupMsgMap[groupId].msgs.length +
  5589. ', tempCount=' +
  5590. tempCount
  5591. );
  5592. getLostGroupMsgs(groupId, groupMsgMap[groupId].max, groupMsgMap[groupId].max - curMaxMsgSeq);
  5593. //更新myGroupMaxSeqs中的群最大seq
  5594. updateMyGroupCurMaxSeq(groupId, groupMsgMap[groupId].max);
  5595. } else {
  5596. new_group_msgs = addGroupMsgList(groupMsgMap[groupId].msgs, new_group_msgs);
  5597. }
  5598. } else {
  5599. //不存在该群的最大消息seq
  5600. log.warn('不存在该群的最大消息seq,群id=' + groupId);
  5601. //高并发情况下,长轮询可能存在丢消息,这时需要客户端通过拉取群消息接口补齐下
  5602. //1、收到的新群消息seq存在不连续情况,也需要补齐
  5603. if (groupMsgMap[groupId].msgs.length < tempCount) {
  5604. //发起一个拉群群消息请求
  5605. log.warn(
  5606. '发起一次补齐群消息请求,minMsgSeq=' +
  5607. groupMsgMap[groupId].min +
  5608. ', maxMsgSeq=' +
  5609. groupMsgMap[groupId].max +
  5610. ', msgs.length=' +
  5611. groupMsgMap[groupId].msgs.length +
  5612. ', tempCount=' +
  5613. tempCount
  5614. );
  5615. getLostGroupMsgs(groupId, groupMsgMap[groupId].max, tempCount);
  5616. //更新myGroupMaxSeqs中的群最大seq
  5617. updateMyGroupCurMaxSeq(groupId, groupMsgMap[groupId].max);
  5618. } else {
  5619. new_group_msgs = addGroupMsgList(groupMsgMap[groupId].msgs, new_group_msgs);
  5620. }
  5621. }
  5622. }
  5623. if (new_group_msgs.length) {
  5624. MsgStore.updateTimeline();
  5625. }
  5626. if (onMsgCallback && new_group_msgs.length) onMsgCallback(new_group_msgs);
  5627. };
  5628. //处理新的群提示消息
  5629. var handlerGroupTips = function(groupTips) {
  5630. var new_group_msgs = [];
  5631. for (var o in groupTips) {
  5632. var groupTip = groupTips[o];
  5633. //添加event字段
  5634. groupTip.Event = LONG_POLLINNG_EVENT_TYPE.GROUP_TIP;
  5635. //更新群消息通知seq
  5636. if (groupTip.NoticeSeq > noticeSeq) {
  5637. noticeSeq = groupTip.NoticeSeq;
  5638. }
  5639. var msg = handlerGroupMsg(groupTip, false, true);
  5640. if (msg) {
  5641. new_group_msgs.push(msg);
  5642. }
  5643. }
  5644. if (new_group_msgs.length) {
  5645. MsgStore.updateTimeline();
  5646. }
  5647. if (onMsgCallback && new_group_msgs.length) onMsgCallback(new_group_msgs);
  5648. };
  5649. //处理新的群系统消息
  5650. //isNeedValidRepeatMsg 是否需要判重
  5651. var handlerGroupSystemMsgs = function(groupSystemMsgs, isNeedValidRepeatMsg) {
  5652. for (var k in groupSystemMsgs) {
  5653. var groupTip = groupSystemMsgs[k];
  5654. var groupReportTypeMsg = groupTip.MsgBody;
  5655. var reportType = groupReportTypeMsg.ReportType;
  5656. //当长轮询返回的群系统消息,才需要更新群消息通知seq
  5657. if (isNeedValidRepeatMsg == false && groupTip.NoticeSeq && groupTip.NoticeSeq > noticeSeq) {
  5658. noticeSeq = groupTip.NoticeSeq;
  5659. }
  5660. var toAccount = groupTip.GroupInfo.To_Account;
  5661. //过滤本不应该给自己的系统消息
  5662. /*if (!toAccount || toAccount != ctx.identifier) {
  5663. log.error("收到本不应该给自己的系统消息: To_Account=" + toAccount);
  5664. continue;
  5665. }*/
  5666. if (isNeedValidRepeatMsg) {
  5667. //var key=groupTip.ToGroupId+"_"+reportType+"_"+groupTip.MsgTimeStamp+"_"+groupReportTypeMsg.Operator_Account;
  5668. var key = groupTip.ToGroupId + '_' + reportType + '_' + groupReportTypeMsg.Operator_Account;
  5669. var isExist = groupSystemMsgsCache[key];
  5670. if (isExist) {
  5671. log.warn('收到重复的群系统消息:key=' + key);
  5672. continue;
  5673. }
  5674. groupSystemMsgsCache[key] = true;
  5675. }
  5676. var notify = {
  5677. SrcFlag: 0,
  5678. ReportType: reportType,
  5679. GroupId: groupTip.ToGroupId,
  5680. GroupName: groupTip.GroupInfo.GroupName,
  5681. Operator_Account: groupReportTypeMsg.Operator_Account,
  5682. MsgTime: groupTip.MsgTimeStamp,
  5683. groupReportTypeMsg: groupReportTypeMsg
  5684. };
  5685. switch (reportType) {
  5686. case GROUP_SYSTEM_TYPE.JOIN_GROUP_REQUEST: //申请加群(只有管理员会接收到)
  5687. notify['RemarkInfo'] = groupReportTypeMsg.RemarkInfo;
  5688. notify['MsgKey'] = groupReportTypeMsg.MsgKey;
  5689. notify['Authentication'] = groupReportTypeMsg.Authentication;
  5690. notify['UserDefinedField'] = groupTip.UserDefinedField;
  5691. notify['From_Account'] = groupTip.From_Account;
  5692. notify['MsgSeq'] = groupTip.ClientSeq;
  5693. notify['MsgRandom'] = groupTip.MsgRandom;
  5694. break;
  5695. case GROUP_SYSTEM_TYPE.JOIN_GROUP_ACCEPT: //申请加群被同意(只有申请人自己接收到)
  5696. case GROUP_SYSTEM_TYPE.JOIN_GROUP_REFUSE: //申请加群被拒绝(只有申请人自己接收到)
  5697. notify['RemarkInfo'] = groupReportTypeMsg.RemarkInfo;
  5698. break;
  5699. case GROUP_SYSTEM_TYPE.KICK: //被管理员踢出群(只有被踢者接收到)
  5700. case GROUP_SYSTEM_TYPE.DESTORY: //群被解散(全员接收)
  5701. case GROUP_SYSTEM_TYPE.CREATE: //创建群(创建者接收, 不展示)
  5702. case GROUP_SYSTEM_TYPE.INVITED_JOIN_GROUP_REQUEST: //邀请加群(被邀请者接收)
  5703. case GROUP_SYSTEM_TYPE.INVITED_JOIN_GROUP_REQUEST_AGREE: //邀请加群(被邀请者需同意)
  5704. case GROUP_SYSTEM_TYPE.QUIT: //主动退群(主动退出者接收, 不展示)
  5705. case GROUP_SYSTEM_TYPE.SET_ADMIN: //群设置管理员(被设置者接收)
  5706. case GROUP_SYSTEM_TYPE.CANCEL_ADMIN: //取消管理员(被取消者接收)
  5707. case GROUP_SYSTEM_TYPE.REVOKE: //群已被回收(全员接收, 不展示)
  5708. break;
  5709. case GROUP_SYSTEM_TYPE.READED: //群消息已读同步
  5710. break;
  5711. case GROUP_SYSTEM_TYPE.CUSTOM: //用户自定义通知(默认全员接收)
  5712. notify['MsgSeq'] = groupTip.MsgSeq;
  5713. notify['UserDefinedField'] = groupReportTypeMsg.UserDefinedField;
  5714. break;
  5715. default:
  5716. log.error('未知群系统消息类型:reportType=' + reportType);
  5717. break;
  5718. }
  5719. if (isNeedValidRepeatMsg) {
  5720. //注释只收取一种通知
  5721. // if (reportType == GROUP_SYSTEM_TYPE.JOIN_GROUP_REQUEST) {
  5722. //回调
  5723. if (onGroupSystemNotifyCallbacks[reportType]) {
  5724. onGroupSystemNotifyCallbacks[reportType](notify);
  5725. } else {
  5726. log.error('未知群系统消息类型:reportType=' + reportType);
  5727. }
  5728. //}
  5729. } else {
  5730. //回调
  5731. if (onGroupSystemNotifyCallbacks[reportType]) {
  5732. if (reportType == GROUP_SYSTEM_TYPE.READED) {
  5733. var arr = notify.groupReportTypeMsg.GroupReadInfoArray;
  5734. for (var i = 0, l = arr.length; i < l; i++) {
  5735. var item = arr[i];
  5736. onGroupSystemNotifyCallbacks[reportType](item);
  5737. }
  5738. } else {
  5739. onGroupSystemNotifyCallbacks[reportType](notify);
  5740. }
  5741. }
  5742. }
  5743. } //loop
  5744. };
  5745. //处理新的好友系统通知
  5746. //isNeedValidRepeatMsg 是否需要判重
  5747. var handlerFriendSystemNotices = function(friendSystemNotices, isNeedValidRepeatMsg) {
  5748. var friendNotice, type, notify;
  5749. for (var k in friendSystemNotices) {
  5750. friendNotice = friendSystemNotices[k];
  5751. type = friendNotice.PushType;
  5752. //当长轮询返回的群系统消息,才需要更新通知seq
  5753. if (isNeedValidRepeatMsg == false && friendNotice.NoticeSeq && friendNotice.NoticeSeq > noticeSeq) {
  5754. noticeSeq = friendNotice.NoticeSeq;
  5755. }
  5756. notify = {
  5757. Type: type
  5758. };
  5759. switch (type) {
  5760. case FRIEND_NOTICE_TYPE.FRIEND_ADD: //好友表增加
  5761. notify['Accounts'] = friendNotice.FriendAdd_Account;
  5762. break;
  5763. case FRIEND_NOTICE_TYPE.FRIEND_DELETE: //好友表删除
  5764. notify['Accounts'] = friendNotice.FriendDel_Account;
  5765. break;
  5766. case FRIEND_NOTICE_TYPE.PENDENCY_ADD: //未决增加
  5767. notify['PendencyList'] = friendNotice.PendencyAdd;
  5768. break;
  5769. case FRIEND_NOTICE_TYPE.PENDENCY_DELETE: //未决删除
  5770. notify['Accounts'] = friendNotice.FrienPencydDel_Account;
  5771. break;
  5772. case FRIEND_NOTICE_TYPE.BLACK_LIST_ADD: //黑名单增加
  5773. notify['Accounts'] = friendNotice.BlackListAdd_Account;
  5774. break;
  5775. case FRIEND_NOTICE_TYPE.BLACK_LIST_DELETE: //黑名单删除
  5776. notify['Accounts'] = friendNotice.BlackListDel_Account;
  5777. break;
  5778. /*case FRIEND_NOTICE_TYPE.PENDENCY_REPORT://未决已读上报
  5779. break;
  5780. case FRIEND_NOTICE_TYPE.FRIEND_UPDATE://好友数据更新
  5781. break;
  5782. */
  5783. default:
  5784. log.error('未知好友系统通知类型:friendNotice=' + JSON.stringify(friendNotice));
  5785. break;
  5786. }
  5787. if (isNeedValidRepeatMsg) {
  5788. if (type == FRIEND_NOTICE_TYPE.PENDENCY_ADD) {
  5789. //回调
  5790. if (onFriendSystemNotifyCallbacks[type]) onFriendSystemNotifyCallbacks[type](notify);
  5791. }
  5792. } else {
  5793. //回调
  5794. if (onFriendSystemNotifyCallbacks[type]) onFriendSystemNotifyCallbacks[type](notify);
  5795. }
  5796. } //loop
  5797. };
  5798. //处理新的资料系统通知
  5799. //isNeedValidRepeatMsg 是否需要判重
  5800. var handlerProfileSystemNotices = function(profileSystemNotices, isNeedValidRepeatMsg) {
  5801. var profileNotice, type, notify;
  5802. for (var k in profileSystemNotices) {
  5803. profileNotice = profileSystemNotices[k];
  5804. type = profileNotice.PushType;
  5805. //当长轮询返回的群系统消息,才需要更新通知seq
  5806. if (isNeedValidRepeatMsg == false && profileNotice.NoticeSeq && profileNotice.NoticeSeq > noticeSeq) {
  5807. noticeSeq = profileNotice.NoticeSeq;
  5808. }
  5809. notify = {
  5810. Type: type
  5811. };
  5812. switch (type) {
  5813. case PROFILE_NOTICE_TYPE.PROFILE_MODIFY: //资料修改
  5814. notify['Profile_Account'] = profileNotice.Profile_Account;
  5815. notify['ProfileList'] = profileNotice.ProfileList;
  5816. break;
  5817. default:
  5818. log.error('未知资料系统通知类型:profileNotice=' + JSON.stringify(profileNotice));
  5819. break;
  5820. }
  5821. if (isNeedValidRepeatMsg) {
  5822. if (type == PROFILE_NOTICE_TYPE.PROFILE_MODIFY) {
  5823. //回调
  5824. if (onProfileSystemNotifyCallbacks[type]) onProfileSystemNotifyCallbacks[type](notify);
  5825. }
  5826. } else {
  5827. //回调
  5828. if (onProfileSystemNotifyCallbacks[type]) onProfileSystemNotifyCallbacks[type](notify);
  5829. }
  5830. } //loop
  5831. };
  5832. //处理新的群系统消息(用于直播大群长轮询)
  5833. var handlerGroupSystemMsg = function(groupTip) {
  5834. var groupReportTypeMsg = groupTip.MsgBody;
  5835. var reportType = groupReportTypeMsg.ReportType;
  5836. var toAccount = groupTip.GroupInfo.To_Account;
  5837. //过滤本不应该给自己的系统消息
  5838. //if(!toAccount || toAccount!=ctx.identifier){
  5839. // log.error("收到本不应该给自己的系统消息: To_Account="+toAccount);
  5840. // continue;
  5841. //}
  5842. var notify = {
  5843. SrcFlag: 1,
  5844. ReportType: reportType,
  5845. GroupId: groupTip.ToGroupId,
  5846. GroupName: groupTip.GroupInfo.GroupName,
  5847. Operator_Account: groupReportTypeMsg.Operator_Account,
  5848. MsgTime: groupTip.MsgTimeStamp
  5849. };
  5850. switch (reportType) {
  5851. case GROUP_SYSTEM_TYPE.JOIN_GROUP_REQUEST: //申请加群(只有管理员会接收到)
  5852. notify['RemarkInfo'] = groupReportTypeMsg.RemarkInfo;
  5853. notify['MsgKey'] = groupReportTypeMsg.MsgKey;
  5854. notify['Authentication'] = groupReportTypeMsg.Authentication;
  5855. notify['UserDefinedField'] = groupTip.UserDefinedField;
  5856. notify['From_Account'] = groupTip.From_Account;
  5857. notify['MsgSeq'] = groupTip.ClientSeq;
  5858. notify['MsgRandom'] = groupTip.MsgRandom;
  5859. break;
  5860. case GROUP_SYSTEM_TYPE.JOIN_GROUP_ACCEPT: //申请加群被同意(只有申请人自己接收到)
  5861. case GROUP_SYSTEM_TYPE.JOIN_GROUP_REFUSE: //申请加群被拒绝(只有申请人自己接收到)
  5862. notify['RemarkInfo'] = groupReportTypeMsg.RemarkInfo;
  5863. break;
  5864. case GROUP_SYSTEM_TYPE.KICK: //被管理员踢出群(只有被踢者接收到)
  5865. case GROUP_SYSTEM_TYPE.DESTORY: //群被解散(全员接收)
  5866. case GROUP_SYSTEM_TYPE.CREATE: //创建群(创建者接收, 不展示)
  5867. case GROUP_SYSTEM_TYPE.INVITED_JOIN_GROUP_REQUEST: //邀请加群(被邀请者接收)
  5868. case GROUP_SYSTEM_TYPE.INVITED_JOIN_GROUP_REQUEST_AGREE: //邀请加群(被邀请者需要同意)
  5869. case GROUP_SYSTEM_TYPE.QUIT: //主动退群(主动退出者接收, 不展示)
  5870. case GROUP_SYSTEM_TYPE.SET_ADMIN: //群设置管理员(被设置者接收)
  5871. case GROUP_SYSTEM_TYPE.CANCEL_ADMIN: //取消管理员(被取消者接收)
  5872. case GROUP_SYSTEM_TYPE.REVOKE: //群已被回收(全员接收, 不展示)
  5873. break;
  5874. case GROUP_SYSTEM_TYPE.CUSTOM: //用户自定义通知(默认全员接收)
  5875. notify['MsgSeq'] = groupTip.MsgSeq;
  5876. notify['UserDefinedField'] = groupReportTypeMsg.UserDefinedField;
  5877. break;
  5878. default:
  5879. log.error('未知群系统消息类型:reportType=' + reportType);
  5880. break;
  5881. }
  5882. //回调
  5883. if (onGroupSystemNotifyCallbacks[reportType]) onGroupSystemNotifyCallbacks[reportType](notify);
  5884. };
  5885. //处理C2C EVENT 消息通道Array
  5886. var handlerC2cNotifyMsgArray = function(arr) {
  5887. for (var i = 0, l = arr.length; i < l; i++) {
  5888. handlerC2cEventMsg(arr[i]);
  5889. }
  5890. };
  5891. //处理C2C EVENT 消息通道Item
  5892. /*
  5893. {
  5894. "ActionStatus": "OK",
  5895. "ErrorInfo": "",
  5896. "ErrorCode": 0,
  5897. "EventArray": [{
  5898. "Event": 10,
  5899. "C2cNotifyMsgArray": [{
  5900. "SubMsgType": 96,
  5901. "NoticeSeq": 2,
  5902. "KickoutMsgNotify": {
  5903. "To_Account": "22",
  5904. "SdkAppid": 1400111560,
  5905. "Instid": 537042377
  5906. }
  5907. }]
  5908. }],
  5909. "NextTimeOut": 5
  5910. }
  5911. */
  5912. var handlerC2cEventMsg = function(notify) {
  5913. console.error(notify);
  5914. var subType = notify.SubMsgType;
  5915. switch (subType) {
  5916. case C2C_EVENT_SUB_TYPE.READED:
  5917. log.warn('C2C已读消息通知');
  5918. if (notify.ReadC2cMsgNotify && notify.ReadC2cMsgNotify.UinPairReadArray && onC2cEventCallbacks[subType]) {
  5919. for (var i = 0, l = notify.ReadC2cMsgNotify.UinPairReadArray.length; i < l; i++) {
  5920. var item = notify.ReadC2cMsgNotify.UinPairReadArray[i];
  5921. onC2cEventCallbacks[subType](item);
  5922. }
  5923. }
  5924. break;
  5925. case C2C_EVENT_SUB_TYPE.KICKEDOUT:
  5926. log.warn('多终端互踢通知');
  5927. proto_logout('instance');
  5928. if (onC2cEventCallbacks[subType]) {
  5929. onC2cEventCallbacks[subType]();
  5930. }
  5931. break;
  5932. default:
  5933. log.error('未知C2c系统消息:subType=' + subType);
  5934. break;
  5935. }
  5936. };
  5937. //长轮询
  5938. this.longPolling = function(cbOk, cbErr) {
  5939. var opts = {
  5940. Timeout: longPollingDefaultTimeOut / 1000,
  5941. Cookie: {
  5942. NotifySeq: notifySeq,
  5943. NoticeSeq: noticeSeq
  5944. }
  5945. };
  5946. if (LongPollingId) {
  5947. opts.Cookie.LongPollingId = LongPollingId;
  5948. doPolling();
  5949. } else {
  5950. proto_getLongPollingId({}, function(resp) {
  5951. LongPollingId = opts.Cookie.LongPollingId = resp.LongPollingId;
  5952. //根据回包设置超时时间,超时时长不能>60秒,因为webkit手机端的最长超时时间不能大于60s
  5953. longPollingDefaultTimeOut = resp.Timeout > 60 ? longPollingDefaultTimeOut : resp.Timeout * 1000;
  5954. doPolling();
  5955. });
  5956. }
  5957. function doPolling() {
  5958. proto_longPolling(
  5959. opts,
  5960. function(resp) {
  5961. for (var i in resp.EventArray) {
  5962. var e = resp.EventArray[i];
  5963. switch (e.Event) {
  5964. case LONG_POLLINNG_EVENT_TYPE.C2C: //c2c消息通知
  5965. //更新C2C消息通知seq
  5966. notifySeq = e.NotifySeq;
  5967. log.warn('longpolling: received new c2c msg');
  5968. //获取新消息
  5969. MsgManager.syncMsgs();
  5970. break;
  5971. case LONG_POLLINNG_EVENT_TYPE.GROUP_COMMON: //普通群消息通知
  5972. log.warn('longpolling: received new group msgs');
  5973. handlerOrdinaryAndTipGroupMsgs(e.Event, e.GroupMsgArray);
  5974. break;
  5975. case LONG_POLLINNG_EVENT_TYPE.GROUP_TIP: //(全员广播)群提示消息
  5976. log.warn('longpolling: received new group tips');
  5977. handlerOrdinaryAndTipGroupMsgs(e.Event, e.GroupTips);
  5978. break;
  5979. case LONG_POLLINNG_EVENT_TYPE.GROUP_TIP2: //群提示消息
  5980. log.warn('longpolling: received new group tips');
  5981. handlerOrdinaryAndTipGroupMsgs(e.Event, e.GroupTips);
  5982. break;
  5983. case LONG_POLLINNG_EVENT_TYPE.GROUP_SYSTEM: //(多终端同步)群系统消息
  5984. log.warn('longpolling: received new group system msgs');
  5985. //false 表示 通过长轮询收到的群系统消息,可以不判重
  5986. handlerGroupSystemMsgs(e.GroupTips, false);
  5987. break;
  5988. case LONG_POLLINNG_EVENT_TYPE.FRIEND_NOTICE: //好友系统通知
  5989. log.warn('longpolling: received new friend system notice');
  5990. //false 表示 通过长轮询收到的好友系统通知,可以不判重
  5991. handlerFriendSystemNotices(e.FriendListMod, false);
  5992. break;
  5993. case LONG_POLLINNG_EVENT_TYPE.PROFILE_NOTICE: //资料系统通知
  5994. log.warn('longpolling: received new profile system notice');
  5995. //false 表示 通过长轮询收到的资料系统通知,可以不判重
  5996. handlerProfileSystemNotices(e.ProfileDataMod, false);
  5997. break;
  5998. case LONG_POLLINNG_EVENT_TYPE.C2C_COMMON: //c2c消息通知
  5999. noticeSeq = e.C2cMsgArray[0].NoticeSeq;
  6000. //更新C2C消息通知seq
  6001. log.warn('longpolling: received new c2c_common msg', noticeSeq);
  6002. handlerOrdinaryAndTipC2cMsgs(e.Event, e.C2cMsgArray);
  6003. break;
  6004. case LONG_POLLINNG_EVENT_TYPE.C2C_EVENT: //c2c已读消息通知
  6005. noticeSeq = e.C2cNotifyMsgArray[0].NoticeSeq;
  6006. log.warn('longpolling: received new c2c_event msg');
  6007. handlerC2cNotifyMsgArray(e.C2cNotifyMsgArray);
  6008. break;
  6009. default:
  6010. log.error('longpolling收到未知新消息类型: Event=' + e.Event);
  6011. break;
  6012. }
  6013. }
  6014. var successInfo = {
  6015. ActionStatus: ACTION_STATUS.OK,
  6016. ErrorCode: 0
  6017. };
  6018. updatecLongPollingStatus(successInfo);
  6019. },
  6020. function(err) {
  6021. //log.error(err);
  6022. updatecLongPollingStatus(err);
  6023. if (cbErr) cbErr(err);
  6024. }
  6025. );
  6026. }
  6027. };
  6028. //大群 长轮询
  6029. this.bigGroupLongPolling = function(cbOk, cbErr) {
  6030. var GroupId = BigGroupId;
  6031. var opts = {
  6032. USP: 1,
  6033. StartSeq: bigGroupLongPollingStartSeq, //请求拉消息的起始seq
  6034. HoldTime: bigGroupLongPollingHoldTime, //客户端长轮询的超时时间,单位是秒
  6035. Key: bigGroupLongPollingKey //客户端加入群组后收到的的Key
  6036. };
  6037. proto_bigGroupLongPolling(
  6038. opts,
  6039. function(resp) {
  6040. if (GroupId != BigGroupId) return;
  6041. var msgObjList = [];
  6042. bigGroupLongPollingStartSeq = resp.NextSeq;
  6043. bigGroupLongPollingHoldTime = resp.HoldTime;
  6044. bigGroupLongPollingKey = resp.Key;
  6045. if (resp.RspMsgList && resp.RspMsgList.length > 0) {
  6046. var msgCount = 0,
  6047. msgInfo,
  6048. event,
  6049. msg;
  6050. for (var i = resp.RspMsgList.length - 1; i >= 0; i--) {
  6051. msgInfo = resp.RspMsgList[i];
  6052. //后台这里做了调整,缩短字段名,以下是兼容代码
  6053. var keyMap = {
  6054. F_Account: 'From_Account',
  6055. T_Account: 'To_Account',
  6056. FAType: 'EnumFrom_AccountType',
  6057. TAType: 'EnumTo_AccountType',
  6058. GCode: 'GroupCode',
  6059. GName: 'GroupName',
  6060. GId: 'GroupId',
  6061. MFlg: 'MsgFlag',
  6062. FAEInfo: 'MsgFrom_AccountExtraInfo',
  6063. Evt: 'Event',
  6064. GInfo: 'GroupInfo',
  6065. BPlc: 'IsPlaceMsg',
  6066. MBody: 'MsgBody',
  6067. Pri: 'MsgPriority',
  6068. Rdm: 'MsgRandom',
  6069. MSeq: 'MsgSeq',
  6070. TStp: 'MsgTimeStamp',
  6071. TGId: 'ToGroupId',
  6072. UEInfo: 'UinExtInfo',
  6073. UId: 'UserId',
  6074. BSys: 'IsSystemMsg',
  6075. FAHUrl: 'From_AccountHeadurl',
  6076. FANick: 'From_AccountNick'
  6077. };
  6078. msgInfo = tool.replaceObject(keyMap, msgInfo);
  6079. //如果是已经删除的消息或者发送者帐号为空或者消息内容为空
  6080. //IsPlaceMsg=1
  6081. if (msgInfo.IsPlaceMsg || !msgInfo.From_Account || !msgInfo.MsgBody || msgInfo.MsgBody.length == 0) {
  6082. continue;
  6083. }
  6084. event = msgInfo.Event; //群消息类型
  6085. switch (event) {
  6086. case LONG_POLLINNG_EVENT_TYPE.GROUP_COMMON: //群普通消息
  6087. log.info('bigGroupLongPolling: return new group msg');
  6088. msg = handlerGroupMsg(msgInfo, false, false);
  6089. msg && msgObjList.push(msg);
  6090. msgCount = msgCount + 1;
  6091. break;
  6092. case LONG_POLLINNG_EVENT_TYPE.GROUP_TIP: //群提示消息
  6093. case LONG_POLLINNG_EVENT_TYPE.GROUP_TIP2: //群提示消息
  6094. log.info('bigGroupLongPolling: return new group tip');
  6095. msg = handlerGroupMsg(msgInfo, false, false);
  6096. msg && msgObjList.push(msg);
  6097. //msgCount=msgCount+1;
  6098. break;
  6099. case LONG_POLLINNG_EVENT_TYPE.GROUP_SYSTEM: //群系统消息
  6100. log.info('bigGroupLongPolling: new group system msg');
  6101. handlerGroupSystemMsg(msgInfo);
  6102. break;
  6103. default:
  6104. log.error('bigGroupLongPolling收到未知新消息类型: Event=' + event);
  6105. break;
  6106. }
  6107. } // for loop
  6108. if (msgCount > 0) {
  6109. MsgManager.setBigGroupLongPollingMsgMap(msgInfo.ToGroupId, msgCount); //
  6110. log.warn('current bigGroupLongPollingMsgMap: ' + JSON.stringify(bigGroupLongPollingMsgMap));
  6111. }
  6112. }
  6113. curBigGroupLongPollingRetErrorCount = 0;
  6114. //返回连接状态
  6115. var successInfo = {
  6116. ActionStatus: ACTION_STATUS.OK,
  6117. ErrorCode: CONNECTION_STATUS.ON,
  6118. ErrorInfo: 'connection is ok...'
  6119. };
  6120. ConnManager.callBack(successInfo);
  6121. if (cbOk) cbOk(msgObjList);
  6122. else if (onBigGroupMsgCallback) onBigGroupMsgCallback(msgObjList); //返回新消息
  6123. //重新启动长轮询
  6124. bigGroupLongPollingOn && MsgManager.bigGroupLongPolling();
  6125. },
  6126. function(err) {
  6127. if (err.ErrorCode == longPollingPackageTooLargeErrorCode) {
  6128. bigGroupLongPollingStartSeq = 0;
  6129. } else if (err.ErrorCode != longPollingTimeOutErrorCode) {
  6130. log.error(err.ErrorInfo);
  6131. //记录长轮询返回错误次数
  6132. curBigGroupLongPollingRetErrorCount++;
  6133. }
  6134. if (err.ErrorCode == longPollingKickedErrorCode) {
  6135. //登出
  6136. log.error('多实例登录,被kick');
  6137. if (onKickedEventCall) {
  6138. onKickedEventCall();
  6139. }
  6140. }
  6141. //累计超过一定次数,不再发起长轮询请求
  6142. if (curBigGroupLongPollingRetErrorCount < LONG_POLLING_MAX_RET_ERROR_COUNT) {
  6143. bigGroupLongPollingOn && MsgManager.bigGroupLongPolling();
  6144. } else {
  6145. var errInfo = {
  6146. ActionStatus: ACTION_STATUS.FAIL,
  6147. ErrorCode: CONNECTION_STATUS.OFF,
  6148. ErrorInfo: 'connection is off'
  6149. };
  6150. ConnManager.callBack(errInfo);
  6151. }
  6152. if (cbErr) cbErr(err);
  6153. },
  6154. bigGroupLongPollingHoldTime * 1000
  6155. );
  6156. };
  6157. //更新连接状态
  6158. var updatecLongPollingStatus = function(errObj) {
  6159. if (errObj.ErrorCode == 0 || errObj.ErrorCode == longPollingTimeOutErrorCode) {
  6160. curLongPollingRetErrorCount = 0;
  6161. longPollingOffCallbackFlag = false;
  6162. var errorInfo;
  6163. var isNeedCallback = false;
  6164. switch (curLongPollingStatus) {
  6165. case CONNECTION_STATUS.INIT:
  6166. isNeedCallback = true;
  6167. curLongPollingStatus = CONNECTION_STATUS.ON;
  6168. errorInfo = 'create connection successfully(INIT->ON)';
  6169. break;
  6170. case CONNECTION_STATUS.ON:
  6171. errorInfo = 'connection is on...(ON->ON)';
  6172. break;
  6173. case CONNECTION_STATUS.RECONNECT:
  6174. curLongPollingStatus = CONNECTION_STATUS.ON;
  6175. errorInfo = 'connection is on...(RECONNECT->ON)';
  6176. break;
  6177. case CONNECTION_STATUS.OFF:
  6178. isNeedCallback = true;
  6179. curLongPollingStatus = CONNECTION_STATUS.RECONNECT;
  6180. errorInfo = 'reconnect successfully(OFF->RECONNECT)';
  6181. break;
  6182. }
  6183. var successInfo = {
  6184. ActionStatus: ACTION_STATUS.OK,
  6185. ErrorCode: curLongPollingStatus,
  6186. ErrorInfo: errorInfo
  6187. };
  6188. isNeedCallback && ConnManager.callBack(successInfo);
  6189. longPollingOn && MsgManager.longPolling();
  6190. } else if (errObj.ErrorCode == longPollingKickedErrorCode) {
  6191. //登出
  6192. log.error('多实例登录,被kick');
  6193. if (onKickedEventCall) {
  6194. onKickedEventCall();
  6195. }
  6196. } else {
  6197. //记录长轮询返回解析json错误次数
  6198. curLongPollingRetErrorCount++;
  6199. log.warn('longPolling接口第' + curLongPollingRetErrorCount + '次报错: ' + errObj.ErrorInfo);
  6200. //累计超过一定次数
  6201. if (curLongPollingRetErrorCount <= LONG_POLLING_MAX_RET_ERROR_COUNT) {
  6202. setTimeout(startNextLongPolling, 100); //
  6203. } else {
  6204. curLongPollingStatus = CONNECTION_STATUS.OFF;
  6205. var errInfo = {
  6206. ActionStatus: ACTION_STATUS.FAIL,
  6207. ErrorCode: CONNECTION_STATUS.OFF,
  6208. ErrorInfo: 'connection is off'
  6209. };
  6210. longPollingOffCallbackFlag == false && ConnManager.callBack(errInfo);
  6211. longPollingOffCallbackFlag = true;
  6212. log.warn(longPollingIntervalTime + '毫秒之后,SDK会发起新的longPolling请求...');
  6213. setTimeout(startNextLongPolling, longPollingIntervalTime); //长轮询接口报错次数达到一定值,每间隔5s发起新的长轮询
  6214. }
  6215. }
  6216. };
  6217. //处理收到的普通C2C消息
  6218. var handlerOrdinaryAndTipC2cMsgs = function(eventType, C2cMsgArray) {
  6219. //处理c2c消息
  6220. var notifyInfo = [];
  6221. var msgInfos = [];
  6222. msgInfos = C2cMsgArray; //返回的消息列表
  6223. // MsgStore.cookie = resp.Cookie;//cookies,记录当前读到的最新消息位置
  6224. for (var i in msgInfos) {
  6225. var msgInfo = msgInfos[i];
  6226. var isSendMsg, id;
  6227. var headUrl = msgInfo.From_AccountHeadurl || '';
  6228. if (msgInfo.From_Account == ctx.identifier) {
  6229. //当前用户发送的消息
  6230. isSendMsg = true;
  6231. id = msgInfo.To_Account; //读取接收者信息
  6232. } else {
  6233. //当前用户收到的消息
  6234. isSendMsg = false;
  6235. id = msgInfo.From_Account; //读取发送者信息
  6236. }
  6237. var sess = MsgStore.sessByTypeId(SESSION_TYPE.C2C, id);
  6238. if (!sess) {
  6239. sess = new Session(SESSION_TYPE.C2C, id, id, headUrl, 0, 0);
  6240. }
  6241. var msg = new Msg(
  6242. sess,
  6243. isSendMsg,
  6244. msgInfo.MsgSeq,
  6245. msgInfo.MsgRandom,
  6246. msgInfo.MsgTimeStamp,
  6247. msgInfo.From_Account,
  6248. C2C_MSG_SUB_TYPE.COMMON,
  6249. msgInfo.From_AccountNick,
  6250. headUrl
  6251. );
  6252. var msgBody = null;
  6253. var msgContent = null;
  6254. var msgType = null;
  6255. for (var mi in msgInfo.MsgBody) {
  6256. msgBody = msgInfo.MsgBody[mi];
  6257. msgType = msgBody.MsgType;
  6258. switch (msgType) {
  6259. case MSG_ELEMENT_TYPE.TEXT:
  6260. msgContent = new Msg.Elem.Text(msgBody.MsgContent.Text);
  6261. break;
  6262. case MSG_ELEMENT_TYPE.FACE:
  6263. msgContent = new Msg.Elem.Face(msgBody.MsgContent.Index, msgBody.MsgContent.Data);
  6264. break;
  6265. case MSG_ELEMENT_TYPE.IMAGE:
  6266. msgContent = new Msg.Elem.Images(msgBody.MsgContent.UUID, msgBody.MsgContent.ImageFormat || '');
  6267. for (var j in msgBody.MsgContent.ImageInfoArray) {
  6268. var tempImg = msgBody.MsgContent.ImageInfoArray[j];
  6269. msgContent.addImage(new Msg.Elem.Images.Image(tempImg.Type, tempImg.Size, tempImg.Width, tempImg.Height, tempImg.URL));
  6270. }
  6271. break;
  6272. case MSG_ELEMENT_TYPE.SOUND:
  6273. if (msgBody.MsgContent) {
  6274. msgContent = new Msg.Elem.Sound(
  6275. msgBody.MsgContent.UUID,
  6276. msgBody.MsgContent.Second,
  6277. msgBody.MsgContent.Size,
  6278. msgInfo.From_Account,
  6279. msgInfo.To_Account,
  6280. msgBody.MsgContent.Download_Flag,
  6281. SESSION_TYPE.C2C
  6282. );
  6283. } else {
  6284. msgType = MSG_ELEMENT_TYPE.TEXT;
  6285. msgContent = new Msg.Elem.Text('[语音消息]下载地址解析出错');
  6286. }
  6287. break;
  6288. case MSG_ELEMENT_TYPE.LOCATION:
  6289. msgContent = new Msg.Elem.Location(msgBody.MsgContent.Longitude, msgBody.MsgContent.Latitude, msgBody.MsgContent.Desc);
  6290. break;
  6291. case MSG_ELEMENT_TYPE.FILE:
  6292. case MSG_ELEMENT_TYPE.FILE + ' ':
  6293. msgType = MSG_ELEMENT_TYPE.FILE;
  6294. if (msgBody.MsgContent) {
  6295. msgContent = new Msg.Elem.File(
  6296. msgBody.MsgContent.UUID,
  6297. msgBody.MsgContent.FileName,
  6298. msgBody.MsgContent.FileSize,
  6299. msgInfo.From_Account,
  6300. msgInfo.To_Account,
  6301. msgBody.MsgContent.Download_Flag,
  6302. SESSION_TYPE.C2C
  6303. );
  6304. } else {
  6305. msgType = MSG_ELEMENT_TYPE.TEXT;
  6306. msgContent = new Msg.Elem.Text('[文件消息下载地址解析出错]');
  6307. }
  6308. break;
  6309. case MSG_ELEMENT_TYPE.CUSTOM:
  6310. try {
  6311. var data = JSON.parse(msgBody.MsgContent.Data);
  6312. if (data && data.userAction && data.userAction == FRIEND_WRITE_MSG_ACTION.ING) {
  6313. //过滤安卓或ios的正在输入自定义消息
  6314. continue;
  6315. }
  6316. } catch (e) {}
  6317. msgType = MSG_ELEMENT_TYPE.CUSTOM;
  6318. msgContent = new Msg.Elem.Custom(msgBody.MsgContent.Data, msgBody.MsgContent.Desc, msgBody.MsgContent.Ext);
  6319. break;
  6320. default:
  6321. msgType = MSG_ELEMENT_TYPE.TEXT;
  6322. msgContent = new Msg.Elem.Text('web端暂不支持' + msgBody.MsgType + '消息');
  6323. break;
  6324. }
  6325. msg.elems.push(new Msg.Elem(msgType, msgContent));
  6326. }
  6327. if (msg.elems.length > 0 && MsgStore.addMsg(msg, true)) {
  6328. notifyInfo.push(msg);
  6329. }
  6330. } // for loop
  6331. if (notifyInfo.length > 0) MsgStore.updateTimeline();
  6332. if (notifyInfo.length > 0) {
  6333. if (onMsgCallback) onMsgCallback(notifyInfo);
  6334. }
  6335. };
  6336. //发起新的长轮询请求
  6337. var startNextLongPolling = function() {
  6338. longPollingOn && MsgManager.longPolling();
  6339. };
  6340. //处理未决的加群申请消息列表
  6341. var handlerApplyJoinGroupSystemMsgs = function(eventArray) {
  6342. for (var i in eventArray) {
  6343. var e = eventArray[i];
  6344. handlerGroupSystemMsgs(e.GroupTips, true);
  6345. switch (e.Event) {
  6346. case LONG_POLLINNG_EVENT_TYPE.GROUP_SYSTEM: //(多终端同步)群系统消息
  6347. log.warn('handlerApplyJoinGroupSystemMsgs: handler new group system msg');
  6348. //true 表示 解决加群申请通知存在重复的问题(已处理的通知,下次登录还会拉到),需要判重
  6349. handlerGroupSystemMsgs(e.GroupTips, true);
  6350. break;
  6351. default:
  6352. log.error('syncMsgs收到未知的群系统消息类型: Event=' + e.Event);
  6353. break;
  6354. }
  6355. }
  6356. };
  6357. //拉取c2c消息(包含加群未决消息,需要处理)
  6358. this.syncMsgs = function(cbOk, cbErr) {
  6359. var notifyInfo = [];
  6360. var msgInfos = [];
  6361. //读取C2C消息
  6362. proto_getMsgs(
  6363. MsgStore.cookie,
  6364. MsgStore.syncFlag,
  6365. function(resp) {
  6366. //拉取完毕
  6367. if (resp.SyncFlag == 2) {
  6368. MsgStore.syncFlag = 0;
  6369. }
  6370. //处理c2c消息
  6371. msgInfos = resp.MsgList; //返回的消息列表
  6372. MsgStore.cookie = resp.Cookie; //cookies,记录当前读到的最新消息位置
  6373. for (var i in msgInfos) {
  6374. var msgInfo = msgInfos[i];
  6375. var isSendMsg, id, headUrl;
  6376. if (msgInfo.From_Account == ctx.identifier) {
  6377. //当前用户发送的消息
  6378. isSendMsg = true;
  6379. id = msgInfo.To_Account; //读取接收者信息
  6380. headUrl = '';
  6381. } else {
  6382. //当前用户收到的消息
  6383. isSendMsg = false;
  6384. id = msgInfo.From_Account; //读取发送者信息
  6385. headUrl = '';
  6386. }
  6387. var sess = MsgStore.sessByTypeId(SESSION_TYPE.C2C, id);
  6388. if (!sess) {
  6389. sess = new Session(SESSION_TYPE.C2C, id, id, headUrl, 0, 0);
  6390. }
  6391. var msg = new Msg(
  6392. sess,
  6393. isSendMsg,
  6394. msgInfo.MsgSeq,
  6395. msgInfo.MsgRandom,
  6396. msgInfo.MsgTimeStamp,
  6397. msgInfo.From_Account,
  6398. C2C_MSG_SUB_TYPE.COMMON,
  6399. msgInfo.From_AccountNick,
  6400. msgInfo.From_AccountHeadurl
  6401. );
  6402. var msgBody = null;
  6403. var msgContent = null;
  6404. var msgType = null;
  6405. for (var mi in msgInfo.MsgBody) {
  6406. msgBody = msgInfo.MsgBody[mi];
  6407. msgType = msgBody.MsgType;
  6408. switch (msgType) {
  6409. case MSG_ELEMENT_TYPE.TEXT:
  6410. msgContent = new Msg.Elem.Text(msgBody.MsgContent.Text);
  6411. break;
  6412. case MSG_ELEMENT_TYPE.FACE:
  6413. msgContent = new Msg.Elem.Face(msgBody.MsgContent.Index, msgBody.MsgContent.Data);
  6414. break;
  6415. case MSG_ELEMENT_TYPE.IMAGE:
  6416. msgContent = new Msg.Elem.Images(msgBody.MsgContent.UUID, msgBody.MsgContent.ImageFormat);
  6417. for (var j in msgBody.MsgContent.ImageInfoArray) {
  6418. var tempImg = msgBody.MsgContent.ImageInfoArray[j];
  6419. msgContent.addImage(new Msg.Elem.Images.Image(tempImg.Type, tempImg.Size, tempImg.Width, tempImg.Height, tempImg.URL));
  6420. }
  6421. break;
  6422. case MSG_ELEMENT_TYPE.SOUND:
  6423. // var soundUrl = getSoundDownUrl(msgBody.MsgContent.UUID, msgInfo.From_Account);
  6424. if (msgBody.MsgContent) {
  6425. msgContent = new Msg.Elem.Sound(
  6426. msgBody.MsgContent.UUID,
  6427. msgBody.MsgContent.Second,
  6428. msgBody.MsgContent.Size,
  6429. msgInfo.From_Account,
  6430. msgInfo.To_Account,
  6431. msgBody.MsgContent.Download_Flag,
  6432. SESSION_TYPE.C2C
  6433. );
  6434. } else {
  6435. msgType = MSG_ELEMENT_TYPE.TEXT;
  6436. msgContent = new Msg.Elem.Text('[语音消息]下载地址解析出错');
  6437. }
  6438. break;
  6439. case MSG_ELEMENT_TYPE.LOCATION:
  6440. msgContent = new Msg.Elem.Location(msgBody.MsgContent.Longitude, msgBody.MsgContent.Latitude, msgBody.MsgContent.Desc);
  6441. break;
  6442. case MSG_ELEMENT_TYPE.FILE:
  6443. case MSG_ELEMENT_TYPE.FILE + ' ':
  6444. msgType = MSG_ELEMENT_TYPE.FILE;
  6445. // var fileUrl = getFileDownUrl(msgBody.MsgContent.UUID, msgInfo.From_Account, msgBody.MsgContent.FileName);
  6446. if (msgBody.MsgContent) {
  6447. msgContent = new Msg.Elem.File(
  6448. msgBody.MsgContent.UUID,
  6449. msgBody.MsgContent.FileName,
  6450. msgBody.MsgContent.FileSize,
  6451. msgInfo.From_Account,
  6452. msgInfo.To_Account,
  6453. msgBody.MsgContent.Download_Flag,
  6454. SESSION_TYPE.C2C
  6455. );
  6456. } else {
  6457. msgType = MSG_ELEMENT_TYPE.TEXT;
  6458. msgContent = new Msg.Elem.Text('[文件消息下载地址解析出错]');
  6459. }
  6460. break;
  6461. case MSG_ELEMENT_TYPE.CUSTOM:
  6462. try {
  6463. var data = JSON.parse(msgBody.MsgContent.Data);
  6464. if (data && data.userAction && data.userAction == FRIEND_WRITE_MSG_ACTION.ING) {
  6465. //过滤安卓或ios的正在输入自定义消息
  6466. continue;
  6467. }
  6468. } catch (e) {}
  6469. msgType = MSG_ELEMENT_TYPE.CUSTOM;
  6470. msgContent = new Msg.Elem.Custom(msgBody.MsgContent.Data, msgBody.MsgContent.Desc, msgBody.MsgContent.Ext);
  6471. break;
  6472. default:
  6473. msgType = MSG_ELEMENT_TYPE.TEXT;
  6474. msgContent = new Msg.Elem.Text('web端暂不支持' + msgBody.MsgType + '消息');
  6475. break;
  6476. }
  6477. msg.elems.push(new Msg.Elem(msgType, msgContent));
  6478. }
  6479. if (msg.elems.length > 0 && MsgStore.addMsg(msg, true)) {
  6480. notifyInfo.push(msg);
  6481. }
  6482. } // for loop
  6483. //处理加群未决申请消息
  6484. handlerApplyJoinGroupSystemMsgs(resp.EventArray);
  6485. if (notifyInfo.length > 0) MsgStore.updateTimeline();
  6486. if (cbOk) cbOk(notifyInfo);
  6487. else if (notifyInfo.length > 0) {
  6488. if (onMsgCallback) onMsgCallback(notifyInfo);
  6489. }
  6490. },
  6491. function(err) {
  6492. log.error('getMsgs failed:' + err.ErrorInfo);
  6493. if (cbErr) cbErr(err);
  6494. }
  6495. );
  6496. };
  6497. //拉取C2C漫游消息
  6498. this.getC2CHistoryMsgs = function(options, cbOk, cbErr) {
  6499. if (!options.Peer_Account) {
  6500. if (cbErr) {
  6501. cbErr(tool.getReturnError('Peer_Account is empty', -13));
  6502. return;
  6503. }
  6504. }
  6505. if (!options.MaxCnt) {
  6506. options.MaxCnt = 15;
  6507. }
  6508. if (options.MaxCnt <= 0) {
  6509. if (cbErr) {
  6510. cbErr(tool.getReturnError('MaxCnt should be greater than 0', -14));
  6511. return;
  6512. }
  6513. }
  6514. if (options.MaxCnt > 15) {
  6515. if (cbErr) {
  6516. cbErr(tool.getReturnError('MaxCnt can not be greater than 15', -15));
  6517. return;
  6518. }
  6519. return;
  6520. }
  6521. if (options.MsgKey == null || options.MsgKey === undefined) {
  6522. options.MsgKey = '';
  6523. }
  6524. var opts = {
  6525. Peer_Account: options.Peer_Account,
  6526. MaxCnt: options.MaxCnt,
  6527. LastMsgTime: options.LastMsgTime,
  6528. MsgKey: options.MsgKey
  6529. };
  6530. //读取c2c漫游消息
  6531. proto_getC2CHistoryMsgs(
  6532. opts,
  6533. function(resp) {
  6534. var msgObjList = [];
  6535. var msgInfos = [];
  6536. //处理c2c消息
  6537. msgInfos = resp.MsgList; //返回的消息列表
  6538. var sess = MsgStore.sessByTypeId(SESSION_TYPE.C2C, options.Peer_Account);
  6539. if (!sess) {
  6540. sess = new Session(SESSION_TYPE.C2C, options.Peer_Account, options.Peer_Account, '', 0, 0);
  6541. }
  6542. for (var i in msgInfos) {
  6543. var msgInfo = msgInfos[i];
  6544. var isSendMsg, id;
  6545. var headUrl = msgInfo.From_AccountHeadurl || '';
  6546. if (msgInfo.From_Account == ctx.identifier) {
  6547. //当前用户发送的消息
  6548. isSendMsg = true;
  6549. id = msgInfo.To_Account; //读取接收者信息
  6550. } else {
  6551. //当前用户收到的消息
  6552. isSendMsg = false;
  6553. id = msgInfo.From_Account; //读取发送者信息
  6554. }
  6555. var msg = new Msg(
  6556. sess,
  6557. isSendMsg,
  6558. msgInfo.MsgSeq,
  6559. msgInfo.MsgRandom,
  6560. msgInfo.MsgTimeStamp,
  6561. msgInfo.From_Account,
  6562. C2C_MSG_SUB_TYPE.COMMON,
  6563. msgInfo.From_AccountNick,
  6564. headUrl
  6565. );
  6566. var msgBody = null;
  6567. var msgContent = null;
  6568. var msgType = null;
  6569. for (var mi in msgInfo.MsgBody) {
  6570. msgBody = msgInfo.MsgBody[mi];
  6571. msgType = msgBody.MsgType;
  6572. switch (msgType) {
  6573. case MSG_ELEMENT_TYPE.TEXT:
  6574. msgContent = new Msg.Elem.Text(msgBody.MsgContent.Text);
  6575. break;
  6576. case MSG_ELEMENT_TYPE.FACE:
  6577. msgContent = new Msg.Elem.Face(msgBody.MsgContent.Index, msgBody.MsgContent.Data);
  6578. break;
  6579. case MSG_ELEMENT_TYPE.IMAGE:
  6580. msgContent = new Msg.Elem.Images(msgBody.MsgContent.UUID, msgBody.MsgContent.ImageFormat);
  6581. for (var j in msgBody.MsgContent.ImageInfoArray) {
  6582. var tempImg = msgBody.MsgContent.ImageInfoArray[j];
  6583. msgContent.addImage(new Msg.Elem.Images.Image(tempImg.Type, tempImg.Size, tempImg.Width, tempImg.Height, tempImg.URL));
  6584. }
  6585. break;
  6586. case MSG_ELEMENT_TYPE.SOUND:
  6587. // var soundUrl = getSoundDownUrl(msgBody.MsgContent.UUID, msgInfo.From_Account);
  6588. if (msgBody.MsgContent) {
  6589. msgContent = new Msg.Elem.Sound(
  6590. msgBody.MsgContent.UUID,
  6591. msgBody.MsgContent.Second,
  6592. msgBody.MsgContent.Size,
  6593. msgInfo.From_Account,
  6594. msgInfo.To_Account,
  6595. msgBody.MsgContent.Download_Flag,
  6596. SESSION_TYPE.C2C
  6597. );
  6598. } else {
  6599. msgType = MSG_ELEMENT_TYPE.TEXT;
  6600. msgContent = new Msg.Elem.Text('[语音消息]下载地址解析出错');
  6601. }
  6602. break;
  6603. case MSG_ELEMENT_TYPE.LOCATION:
  6604. msgContent = new Msg.Elem.Location(msgBody.MsgContent.Longitude, msgBody.MsgContent.Latitude, msgBody.MsgContent.Desc);
  6605. break;
  6606. case MSG_ELEMENT_TYPE.FILE:
  6607. case MSG_ELEMENT_TYPE.FILE + ' ':
  6608. msgType = MSG_ELEMENT_TYPE.FILE;
  6609. // var fileUrl = getFileDownUrl(msgBody.MsgContent.UUID, msgInfo.From_Account, msgBody.MsgContent.FileName);
  6610. if (msgBody.MsgContent) {
  6611. msgContent = new Msg.Elem.File(
  6612. msgBody.MsgContent.UUID,
  6613. msgBody.MsgContent.FileName,
  6614. msgBody.MsgContent.FileSize,
  6615. msgInfo.From_Account,
  6616. msgInfo.To_Account,
  6617. msgBody.MsgContent.Download_Flag,
  6618. SESSION_TYPE.C2C
  6619. );
  6620. } else {
  6621. msgType = MSG_ELEMENT_TYPE.TEXT;
  6622. msgContent = new Msg.Elem.Text('[文件消息下载地址解析出错]');
  6623. }
  6624. break;
  6625. case MSG_ELEMENT_TYPE.CUSTOM:
  6626. msgType = MSG_ELEMENT_TYPE.CUSTOM;
  6627. msgContent = new Msg.Elem.Custom(msgBody.MsgContent.Data, msgBody.MsgContent.Desc, msgBody.MsgContent.Ext);
  6628. break;
  6629. default:
  6630. msgType = MSG_ELEMENT_TYPE.TEXT;
  6631. msgContent = new Msg.Elem.Text('web端暂不支持' + msgBody.MsgType + '消息');
  6632. break;
  6633. }
  6634. msg.elems.push(new Msg.Elem(msgType, msgContent));
  6635. }
  6636. MsgStore.addMsg(msg);
  6637. msgObjList.push(msg);
  6638. } // for loop
  6639. MsgStore.updateTimeline();
  6640. if (cbOk) {
  6641. var newResp = {
  6642. Complete: resp.Complete,
  6643. MsgCount: msgObjList.length,
  6644. LastMsgTime: resp.LastMsgTime,
  6645. MsgKey: resp.MsgKey,
  6646. MsgList: msgObjList
  6647. };
  6648. sess.isFinished(resp.Complete);
  6649. cbOk(newResp);
  6650. }
  6651. },
  6652. function(err) {
  6653. log.error('getC2CHistoryMsgs failed:' + err.ErrorInfo);
  6654. if (cbErr) cbErr(err);
  6655. }
  6656. );
  6657. };
  6658. //拉群历史消息
  6659. //不传cbOk 和 cbErr,则会调用新消息回调函数
  6660. this.syncGroupMsgs = function(options, cbOk, cbErr) {
  6661. if (options.ReqMsgSeq <= 0) {
  6662. if (cbErr) {
  6663. var errInfo = 'ReqMsgSeq must be greater than 0';
  6664. var error = tool.getReturnError(errInfo, -16);
  6665. cbErr(error);
  6666. }
  6667. return;
  6668. }
  6669. var opts = {
  6670. GroupId: options.GroupId,
  6671. ReqMsgSeq: options.ReqMsgSeq,
  6672. ReqMsgNumber: options.ReqMsgNumber
  6673. };
  6674. //读群漫游消息
  6675. proto_getGroupMsgs(
  6676. opts,
  6677. function(resp) {
  6678. var notifyInfo = [];
  6679. var group_id = resp.GroupId; //返回的群id
  6680. var msgInfos = resp.RspMsgList; //返回的消息列表
  6681. var isFinished = resp.IsFinished;
  6682. if (msgInfos == null || msgInfos === undefined) {
  6683. if (cbOk) {
  6684. cbOk([]);
  6685. }
  6686. return;
  6687. }
  6688. for (var i = msgInfos.length - 1; i >= 0; i--) {
  6689. var msgInfo = msgInfos[i];
  6690. //如果是已经删除的消息或者发送者帐号为空或者消息内容为空
  6691. //IsPlaceMsg=1
  6692. if (msgInfo.IsPlaceMsg || !msgInfo.From_Account || !msgInfo.MsgBody || msgInfo.MsgBody.length == 0) {
  6693. continue;
  6694. }
  6695. var msg = handlerGroupMsg(msgInfo, true, true, isFinished);
  6696. if (msg) {
  6697. notifyInfo.push(msg);
  6698. }
  6699. } // for loop
  6700. if (notifyInfo.length > 0) MsgStore.updateTimeline();
  6701. if (cbOk) cbOk(notifyInfo);
  6702. else if (notifyInfo.length > 0) {
  6703. if (onMsgCallback) onMsgCallback(notifyInfo);
  6704. }
  6705. },
  6706. function(err) {
  6707. log.error('getGroupMsgs failed:' + err.ErrorInfo);
  6708. if (cbErr) cbErr(err);
  6709. }
  6710. );
  6711. };
  6712. //处理群消息(普通消息+提示消息)
  6713. //isSyncGroupMsgs 是否主动拉取群消息标志
  6714. //isAddMsgFlag 是否需要保存到MsgStore,如果需要,这里会存在判重逻辑
  6715. var handlerGroupMsg = function(msgInfo, isSyncGroupMsgs, isAddMsgFlag, isFinished) {
  6716. if (msgInfo.IsPlaceMsg || !msgInfo.From_Account || !msgInfo.MsgBody || msgInfo.MsgBody.length == 0) {
  6717. return null;
  6718. }
  6719. var isSendMsg, id, headUrl, fromAccountNick, fromAccountHeadurl;
  6720. var group_id = msgInfo.ToGroupId;
  6721. var group_name = group_id;
  6722. if (msgInfo.GroupInfo) {
  6723. //取出群名称
  6724. if (msgInfo.GroupInfo.GroupName) {
  6725. group_name = msgInfo.GroupInfo.GroupName;
  6726. }
  6727. }
  6728. //取出成员昵称
  6729. fromAccountNick = msgInfo.From_Account;
  6730. //fromAccountHeadurl = msgInfo.GroupInfo.From_AccountHeadurl;
  6731. if (msgInfo.GroupInfo) {
  6732. if (msgInfo.GroupInfo.From_AccountNick) {
  6733. fromAccountNick = msgInfo.GroupInfo.From_AccountNick;
  6734. }
  6735. if (msgInfo.GroupInfo.From_AccountHeadurl) {
  6736. fromAccountHeadurl = msgInfo.GroupInfo.From_AccountHeadurl;
  6737. } else {
  6738. fromAccountHeadurl = null;
  6739. }
  6740. }
  6741. if (msgInfo.From_Account == ctx.identifier) {
  6742. //当前用户发送的消息
  6743. isSendMsg = true;
  6744. id = msgInfo.From_Account; //读取接收者信息
  6745. headUrl = '';
  6746. } else {
  6747. //当前用户收到的消息
  6748. isSendMsg = false;
  6749. id = msgInfo.From_Account; //读取发送者信息
  6750. headUrl = '';
  6751. }
  6752. var sess = MsgStore.sessByTypeId(SESSION_TYPE.GROUP, group_id);
  6753. if (!sess) {
  6754. sess = new Session(SESSION_TYPE.GROUP, group_id, group_name, headUrl, 0, 0);
  6755. }
  6756. if (typeof isFinished !== 'undefined') {
  6757. sess.isFinished(isFinished || 0);
  6758. }
  6759. var subType = GROUP_MSG_SUB_TYPE.COMMON; //消息类型
  6760. //群提示消息,重新封装下
  6761. if (LONG_POLLINNG_EVENT_TYPE.GROUP_TIP == msgInfo.Event || LONG_POLLINNG_EVENT_TYPE.GROUP_TIP2 == msgInfo.Event) {
  6762. subType = GROUP_MSG_SUB_TYPE.TIP;
  6763. var groupTip = msgInfo.MsgBody;
  6764. msgInfo.MsgBody = [];
  6765. msgInfo.MsgBody.push({
  6766. MsgType: MSG_ELEMENT_TYPE.GROUP_TIP,
  6767. MsgContent: groupTip
  6768. });
  6769. } else if (msgInfo.MsgPriority) {
  6770. //群点赞消息
  6771. if (msgInfo.MsgPriority == GROUP_MSG_PRIORITY_TYPE.REDPACKET) {
  6772. subType = GROUP_MSG_SUB_TYPE.REDPACKET;
  6773. } else if (msgInfo.MsgPriority == GROUP_MSG_PRIORITY_TYPE.LOVEMSG) {
  6774. subType = GROUP_MSG_SUB_TYPE.LOVEMSG;
  6775. }
  6776. }
  6777. var msg = new Msg(
  6778. sess,
  6779. isSendMsg,
  6780. msgInfo.MsgSeq,
  6781. msgInfo.MsgRandom,
  6782. msgInfo.MsgTimeStamp,
  6783. msgInfo.From_Account,
  6784. subType,
  6785. fromAccountNick,
  6786. fromAccountHeadurl
  6787. );
  6788. var msgBody = null;
  6789. var msgContent = null;
  6790. var msgType = null;
  6791. for (var mi in msgInfo.MsgBody) {
  6792. msgBody = msgInfo.MsgBody[mi];
  6793. msgType = msgBody.MsgType;
  6794. switch (msgType) {
  6795. case MSG_ELEMENT_TYPE.TEXT:
  6796. msgContent = new Msg.Elem.Text(msgBody.MsgContent.Text);
  6797. break;
  6798. case MSG_ELEMENT_TYPE.FACE:
  6799. msgContent = new Msg.Elem.Face(msgBody.MsgContent.Index, msgBody.MsgContent.Data);
  6800. break;
  6801. case MSG_ELEMENT_TYPE.IMAGE:
  6802. msgContent = new Msg.Elem.Images(msgBody.MsgContent.UUID, msgBody.MsgContent.ImageFormat || '');
  6803. for (var j in msgBody.MsgContent.ImageInfoArray) {
  6804. msgContent.addImage(
  6805. new Msg.Elem.Images.Image(
  6806. msgBody.MsgContent.ImageInfoArray[j].Type,
  6807. msgBody.MsgContent.ImageInfoArray[j].Size,
  6808. msgBody.MsgContent.ImageInfoArray[j].Width,
  6809. msgBody.MsgContent.ImageInfoArray[j].Height,
  6810. msgBody.MsgContent.ImageInfoArray[j].URL
  6811. )
  6812. );
  6813. }
  6814. break;
  6815. case MSG_ELEMENT_TYPE.SOUND:
  6816. if (msgBody.MsgContent) {
  6817. msgContent = new Msg.Elem.Sound(
  6818. msgBody.MsgContent.UUID,
  6819. msgBody.MsgContent.Second,
  6820. msgBody.MsgContent.Size,
  6821. msgInfo.From_Account,
  6822. msgInfo.To_Account,
  6823. msgBody.MsgContent.Download_Flag,
  6824. SESSION_TYPE.GROUP
  6825. );
  6826. } else {
  6827. msgType = MSG_ELEMENT_TYPE.TEXT;
  6828. msgContent = new Msg.Elem.Text('[语音消息]下载地址解析出错');
  6829. }
  6830. break;
  6831. case MSG_ELEMENT_TYPE.LOCATION:
  6832. msgContent = new Msg.Elem.Location(msgBody.MsgContent.Longitude, msgBody.MsgContent.Latitude, msgBody.MsgContent.Desc);
  6833. break;
  6834. case MSG_ELEMENT_TYPE.FILE:
  6835. case MSG_ELEMENT_TYPE.FILE + ' ':
  6836. msgType = MSG_ELEMENT_TYPE.FILE;
  6837. var fileUrl = getFileDownUrl(msgBody.MsgContent.UUID, msgInfo.From_Account, msgBody.MsgContent.FileName);
  6838. if (msgBody.MsgContent) {
  6839. msgContent = new Msg.Elem.File(
  6840. msgBody.MsgContent.UUID,
  6841. msgBody.MsgContent.FileName,
  6842. msgBody.MsgContent.FileSize,
  6843. msgInfo.From_Account,
  6844. msgInfo.To_Account,
  6845. msgBody.MsgContent.Download_Flag,
  6846. SESSION_TYPE.GROUP
  6847. );
  6848. } else {
  6849. msgType = MSG_ELEMENT_TYPE.TEXT;
  6850. msgContent = new Msg.Elem.Text('[文件消息]地址解析出错');
  6851. }
  6852. break;
  6853. case MSG_ELEMENT_TYPE.GROUP_TIP:
  6854. var opType = msgBody.MsgContent.OpType;
  6855. msgContent = new Msg.Elem.GroupTip(
  6856. opType,
  6857. msgBody.MsgContent.Operator_Account,
  6858. group_id,
  6859. msgInfo.GroupInfo.GroupName,
  6860. msgBody.MsgContent.List_Account,
  6861. msgBody.MsgContent.MsgMemberExtraInfo
  6862. );
  6863. if (GROUP_TIP_TYPE.JOIN == opType || GROUP_TIP_TYPE.QUIT == opType) {
  6864. //加群或退群时,设置最新群成员数
  6865. msgContent.setGroupMemberNum(msgBody.MsgContent.MemberNum);
  6866. } else if (GROUP_TIP_TYPE.MODIFY_GROUP_INFO == opType) {
  6867. //群资料变更
  6868. var tempIsCallbackFlag = false;
  6869. var tempNewGroupInfo = {
  6870. GroupId: group_id,
  6871. GroupFaceUrl: null,
  6872. GroupName: null,
  6873. OwnerAccount: null,
  6874. GroupNotification: null,
  6875. GroupIntroduction: null
  6876. };
  6877. var msgGroupNewInfo = msgBody.MsgContent.MsgGroupNewInfo;
  6878. if (msgGroupNewInfo.GroupFaceUrl) {
  6879. var tmpNGIFaceUrl = new Msg.Elem.GroupTip.GroupInfo(GROUP_TIP_MODIFY_GROUP_INFO_TYPE.FACE_URL, msgGroupNewInfo.GroupFaceUrl);
  6880. msgContent.addGroupInfo(tmpNGIFaceUrl);
  6881. tempIsCallbackFlag = true;
  6882. tempNewGroupInfo.GroupFaceUrl = msgGroupNewInfo.GroupFaceUrl;
  6883. }
  6884. if (msgGroupNewInfo.GroupName) {
  6885. var tmpNGIName = new Msg.Elem.GroupTip.GroupInfo(GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NAME, msgGroupNewInfo.GroupName);
  6886. msgContent.addGroupInfo(tmpNGIName);
  6887. tempIsCallbackFlag = true;
  6888. tempNewGroupInfo.GroupName = msgGroupNewInfo.GroupName;
  6889. }
  6890. if (msgGroupNewInfo.Owner_Account) {
  6891. var tmpNGIOwner = new Msg.Elem.GroupTip.GroupInfo(GROUP_TIP_MODIFY_GROUP_INFO_TYPE.OWNER, msgGroupNewInfo.Owner_Account);
  6892. msgContent.addGroupInfo(tmpNGIOwner);
  6893. tempIsCallbackFlag = true;
  6894. tempNewGroupInfo.OwnerAccount = msgGroupNewInfo.Owner_Account;
  6895. }
  6896. if (msgGroupNewInfo.GroupNotification) {
  6897. var tmpNGINotification = new Msg.Elem.GroupTip.GroupInfo(
  6898. GROUP_TIP_MODIFY_GROUP_INFO_TYPE.NOTIFICATION,
  6899. msgGroupNewInfo.GroupNotification
  6900. );
  6901. msgContent.addGroupInfo(tmpNGINotification);
  6902. tempIsCallbackFlag = true;
  6903. tempNewGroupInfo.GroupNotification = msgGroupNewInfo.GroupNotification;
  6904. }
  6905. if (msgGroupNewInfo.GroupIntroduction) {
  6906. var tmpNGIIntroduction = new Msg.Elem.GroupTip.GroupInfo(
  6907. GROUP_TIP_MODIFY_GROUP_INFO_TYPE.INTRODUCTION,
  6908. msgGroupNewInfo.GroupIntroduction
  6909. );
  6910. msgContent.addGroupInfo(tmpNGIIntroduction);
  6911. tempIsCallbackFlag = true;
  6912. tempNewGroupInfo.GroupIntroduction = msgGroupNewInfo.GroupIntroduction;
  6913. }
  6914. //回调群资料变化通知方法
  6915. if (isSyncGroupMsgs == false && tempIsCallbackFlag && onGroupInfoChangeCallback) {
  6916. onGroupInfoChangeCallback(tempNewGroupInfo);
  6917. }
  6918. } else if (GROUP_TIP_TYPE.MODIFY_MEMBER_INFO == opType) {
  6919. //群成员变更
  6920. var memberInfos = msgBody.MsgContent.MsgMemberInfo;
  6921. for (var n in memberInfos) {
  6922. var memberInfo = memberInfos[n];
  6923. msgContent.addMemberInfo(new Msg.Elem.GroupTip.MemberInfo(memberInfo.User_Account, memberInfo.ShutupTime));
  6924. }
  6925. }
  6926. break;
  6927. case MSG_ELEMENT_TYPE.CUSTOM:
  6928. msgType = MSG_ELEMENT_TYPE.CUSTOM;
  6929. msgContent = new Msg.Elem.Custom(msgBody.MsgContent.Data, msgBody.MsgContent.Desc, msgBody.MsgContent.Ext);
  6930. break;
  6931. default:
  6932. msgType = MSG_ELEMENT_TYPE.TEXT;
  6933. msgContent = new Msg.Elem.Text('web端暂不支持' + msgBody.MsgType + '消息');
  6934. break;
  6935. }
  6936. msg.elems.push(new Msg.Elem(msgType, msgContent));
  6937. }
  6938. if (isAddMsgFlag == false) {
  6939. //不需要保存消息
  6940. return msg;
  6941. }
  6942. if (MsgStore.addMsg(msg, true)) {
  6943. msg.extraInfo = msgInfo.GroupInfo.MsgFrom_AccountExtraInfo;
  6944. return msg;
  6945. } else {
  6946. return null;
  6947. }
  6948. };
  6949. //初始化
  6950. this.init = function(listeners, cbOk, cbErr) {
  6951. if (!listeners.onMsgNotify) {
  6952. log.warn('listeners.onMsgNotify is empty');
  6953. }
  6954. onMsgCallback = listeners.onMsgNotify;
  6955. if (listeners.onBigGroupMsgNotify) {
  6956. onBigGroupMsgCallback = listeners.onBigGroupMsgNotify;
  6957. } else {
  6958. log.warn('listeners.onBigGroupMsgNotify is empty');
  6959. }
  6960. if (listeners.onC2cEventNotifys) {
  6961. onC2cEventCallbacks = listeners.onC2cEventNotifys;
  6962. } else {
  6963. log.warn('listeners.onC2cEventNotifys is empty');
  6964. }
  6965. if (listeners.onGroupSystemNotifys) {
  6966. onGroupSystemNotifyCallbacks = listeners.onGroupSystemNotifys;
  6967. } else {
  6968. log.warn('listeners.onGroupSystemNotifys is empty');
  6969. }
  6970. if (listeners.onGroupInfoChangeNotify) {
  6971. onGroupInfoChangeCallback = listeners.onGroupInfoChangeNotify;
  6972. } else {
  6973. log.warn('listeners.onGroupInfoChangeNotify is empty');
  6974. }
  6975. if (listeners.onFriendSystemNotifys) {
  6976. onFriendSystemNotifyCallbacks = listeners.onFriendSystemNotifys;
  6977. } else {
  6978. log.warn('listeners.onFriendSystemNotifys is empty');
  6979. }
  6980. if (listeners.onProfileSystemNotifys) {
  6981. onProfileSystemNotifyCallbacks = listeners.onProfileSystemNotifys;
  6982. } else {
  6983. log.warn('listeners.onProfileSystemNotifys is empty');
  6984. }
  6985. if (listeners.onKickedEventCall) {
  6986. onKickedEventCall = listeners.onKickedEventCall;
  6987. } else {
  6988. log.warn('listeners.onKickedEventCall is empty');
  6989. }
  6990. if (listeners.onLongPullingNotify) {
  6991. onLongPullingNotify = listeners.onLongPullingNotify;
  6992. } else {
  6993. log.warn('listeners.onKickedEventCall is empty');
  6994. }
  6995. if (listeners.onAppliedDownloadUrl) {
  6996. onAppliedDownloadUrl = listeners.onAppliedDownloadUrl;
  6997. } else {
  6998. log.warn('listeners.onAppliedDownloadUrl is empty');
  6999. }
  7000. if (!ctx.identifier || !ctx.userSig) {
  7001. if (cbOk) {
  7002. var success = {
  7003. ActionStatus: ACTION_STATUS.OK,
  7004. ErrorCode: 0,
  7005. ErrorInfo: 'login success(no login state)'
  7006. };
  7007. cbOk(success);
  7008. }
  7009. return;
  7010. }
  7011. //初始化
  7012. initMyGroupMaxSeqs(function(resp) {
  7013. log.info('initMyGroupMaxSeqs success');
  7014. //初始化文件
  7015. initIpAndAuthkey(function(initIpAndAuthkeyResp) {
  7016. log.info('initIpAndAuthkey success');
  7017. if (cbOk) {
  7018. log.info('login success(have login state))');
  7019. var success = {
  7020. ActionStatus: ACTION_STATUS.OK,
  7021. ErrorCode: 0,
  7022. ErrorInfo: 'login success'
  7023. };
  7024. cbOk(success);
  7025. }
  7026. MsgManager.setLongPollingOn(true); //开启长轮询
  7027. longPollingOn && MsgManager.longPolling(cbOk);
  7028. }, cbErr);
  7029. }, cbErr);
  7030. };
  7031. //发消息(私聊或群聊)
  7032. this.sendMsg = function(msg, cbOk, cbErr) {
  7033. proto_sendMsg(
  7034. msg,
  7035. function(resp) {
  7036. //私聊时,加入自己的发的消息,群聊时,由于seq和服务器的seq不一样,所以不作处理
  7037. if (msg.sess.type() == SESSION_TYPE.C2C) {
  7038. if (!MsgStore.addMsg(msg)) {
  7039. var errInfo = 'sendMsg: addMsg failed!';
  7040. var error = tool.getReturnError(errInfo, -17);
  7041. log.error(errInfo);
  7042. if (cbErr) cbErr(error);
  7043. return;
  7044. }
  7045. //更新信息流时间
  7046. MsgStore.updateTimeline();
  7047. }
  7048. if (cbOk) cbOk(resp);
  7049. },
  7050. function(err) {
  7051. if (cbErr) cbErr(err);
  7052. }
  7053. );
  7054. };
  7055. }();
  7056. //上传文件
  7057. var FileUploader = new function() {
  7058. this.fileMd5 = null;
  7059. //获取文件MD5
  7060. var getFileMD5 = function(file, cbOk, cbErr) {
  7061. //FileReader pc浏览器兼容性
  7062. //Feature Firefox (Gecko) Chrome Internet Explorer Opera Safari
  7063. //Basic support 3.6 7 10 12.02 6.0.2
  7064. var fileReader = null;
  7065. try {
  7066. fileReader = new FileReader(); //分块读取文件对象
  7067. } catch (e) {
  7068. if (cbErr) {
  7069. cbErr(tool.getReturnError('当前浏览器不支持FileReader', -18));
  7070. return;
  7071. }
  7072. }
  7073. //file的slice方法,注意它的兼容性,在不同浏览器的写法不同
  7074. var blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice;
  7075. if (!blobSlice) {
  7076. if (cbErr) {
  7077. cbErr(tool.getReturnError('当前浏览器不支持FileAPI', -19));
  7078. return;
  7079. }
  7080. }
  7081. var chunkSize = 2 * 1024 * 1024; //分块大小,2M
  7082. var chunks = Math.ceil(file.size / chunkSize); //总块数
  7083. var currentChunk = 0; //当前块数
  7084. var spark = new SparkMD5(); //获取MD5对象
  7085. fileReader.onload = function(e) {
  7086. //数据加载完毕事件
  7087. var binaryStr = '';
  7088. var bytes = new Uint8Array(e.target.result);
  7089. var length = bytes.byteLength;
  7090. for (var i = 0; i < length; i++) {
  7091. binaryStr += String.fromCharCode(bytes[i]); //二进制转换字符串
  7092. }
  7093. spark.appendBinary(binaryStr);
  7094. currentChunk++;
  7095. if (currentChunk < chunks) {
  7096. loadNext(); //读取下一块数据
  7097. } else {
  7098. this.fileMd5 = spark.end(); //得到文件MD5值
  7099. if (cbOk) {
  7100. cbOk(this.fileMd5);
  7101. }
  7102. }
  7103. };
  7104. //分片读取文件
  7105. function loadNext() {
  7106. var start = currentChunk * chunkSize,
  7107. end = start + chunkSize >= file.size ? file.size : start + chunkSize;
  7108. //根据开始和结束位置,切割文件
  7109. var b = blobSlice.call(file, start, end);
  7110. //readAsBinaryString ie浏览器不兼容此方法
  7111. //fileReader.readAsBinaryString(blobSlice.call(file, start, end));
  7112. fileReader.readAsArrayBuffer(b); //ie,chrome,firefox等主流浏览器兼容此方法
  7113. }
  7114. loadNext(); //开始读取
  7115. };
  7116. //提交上传图片表单(用于低版本IE9以下)
  7117. this.submitUploadFileForm = function(options, cbOk, cbErr) {
  7118. var errInfo;
  7119. var error;
  7120. var formId = options.formId;
  7121. var fileId = options.fileId;
  7122. var iframeNum = uploadResultIframeId++;
  7123. var iframeName = 'uploadResultIframe_' + iframeNum;
  7124. var toAccount = options.To_Account;
  7125. var businessType = options.businessType;
  7126. var form = document.getElementById(formId);
  7127. if (!form) {
  7128. errInfo = '获取表单对象为空: formId=' + formId + '(formId非法)';
  7129. error = tool.getReturnError(errInfo, -20);
  7130. if (cbErr) cbErr(error);
  7131. return;
  7132. }
  7133. var fileObj = document.getElementById(fileId);
  7134. if (!fileObj) {
  7135. errInfo = '获取文件对象为空: fileId=' + fileId + '(没有选择文件或者fileId非法)';
  7136. error = tool.getReturnError(errInfo, -21);
  7137. if (cbErr) cbErr(error);
  7138. return;
  7139. }
  7140. //fileObj.type="file";//ie8下不起作用,必须由业务自己设置
  7141. fileObj.name = 'file';
  7142. var iframe = document.createElement('iframe');
  7143. iframe.name = iframeName;
  7144. iframe.id = iframeName;
  7145. iframe.style.display = 'none';
  7146. document.body.appendChild(iframe);
  7147. var cmdName;
  7148. if (isAccessFormalEnv()) {
  7149. cmdName = 'pic_up';
  7150. } else {
  7151. cmdName = 'pic_up_test';
  7152. }
  7153. var uploadApiUrl =
  7154. 'https://pic.tim.qq.com/v4/openpic/' +
  7155. cmdName +
  7156. '?tinyid=' +
  7157. ctx.tinyid +
  7158. '&a2=' +
  7159. ctx.a2 +
  7160. '&sdkappid=' +
  7161. ctx.sdkAppID +
  7162. '&accounttype=' +
  7163. ctx.accountType +
  7164. '&contenttype=http';
  7165. form.action = uploadApiUrl;
  7166. form.method = 'post';
  7167. //form.enctype='multipart/form-data';//ie8下不起作用,必须由业务自己设置
  7168. form.target = iframeName;
  7169. function createFormInput(name, value) {
  7170. var tempInput = document.createElement('input');
  7171. tempInput.type = 'hidden';
  7172. tempInput.name = name;
  7173. tempInput.value = value;
  7174. form.appendChild(tempInput);
  7175. }
  7176. createFormInput('App_Version', VERSION_INFO.APP_VERSION);
  7177. createFormInput('From_Account', ctx.identifier);
  7178. createFormInput('To_Account', toAccount);
  7179. createFormInput('Seq', nextSeq().toString());
  7180. createFormInput('Timestamp', unixtime().toString());
  7181. createFormInput('Random', createRandom().toString());
  7182. createFormInput('Busi_Id', businessType);
  7183. createFormInput('PkgFlag', UPLOAD_RES_PKG_FLAG.RAW_DATA.toString());
  7184. createFormInput('Auth_Key', authkey);
  7185. createFormInput('Server_Ver', VERSION_INFO.SERVER_VERSION.toString());
  7186. createFormInput('File_Type', options.fileType);
  7187. //检测iframe.contentWindow.name是否有值
  7188. function checkFrameName() {
  7189. var resp;
  7190. try {
  7191. resp = JSON.parse(iframe.contentWindow.name) || {};
  7192. } catch (e) {
  7193. resp = {};
  7194. }
  7195. if (resp.ActionStatus) {
  7196. //上传接口返回
  7197. // We've got what we need. Stop the iframe from loading further content.
  7198. iframe.src = 'about:blank';
  7199. iframe.parentNode.removeChild(iframe);
  7200. iframe = null;
  7201. if (resp.ActionStatus == ACTION_STATUS.OK) {
  7202. cbOk && cbOk(resp);
  7203. } else {
  7204. cbErr && cbErr(resp);
  7205. }
  7206. } else {
  7207. setTimeout(checkFrameName, 100);
  7208. }
  7209. }
  7210. setTimeout(checkFrameName, 500);
  7211. form.submit(); //提交上传图片表单
  7212. };
  7213. //上传图片或文件(用于高版本浏览器,支持FileAPI)
  7214. this.uploadFile = function(options, cbOk, cbErr) {
  7215. var file_upload = {
  7216. //初始化
  7217. init: function(options, cbOk, cbErr) {
  7218. var me = this;
  7219. me.file = options.file;
  7220. //分片上传进度回调事件
  7221. me.onProgressCallBack = options.onProgressCallBack;
  7222. //停止上传图片按钮
  7223. if (options.abortButton) {
  7224. options.abortButton.onclick = me.abortHandler;
  7225. }
  7226. me.total = me.file.size; //文件总大小
  7227. me.loaded = 0; //已读取字节数
  7228. me.step = 1080 * 1024; //分块大小,1080K
  7229. me.sliceSize = 0; //分片大小
  7230. me.sliceOffset = 0; //当前分片位置
  7231. me.timestamp = unixtime(); //当前时间戳
  7232. me.seq = nextSeq(); //请求seq
  7233. me.random = createRandom(); //请求随机数
  7234. me.fromAccount = ctx.identifier; //发送者
  7235. me.toAccount = options.To_Account; //接收者
  7236. me.fileMd5 = options.fileMd5; //文件MD5
  7237. me.businessType = options.businessType; //图片或文件的业务类型,群消息:1; c2c消息:2; 个人头像:3; 群头像:4;
  7238. me.fileType = options.fileType; //文件类型,不填为默认认为上传的是图片;1:图片;2:文件;3:短视频;4:PTT
  7239. me.cbOk = cbOk; //上传成功回调事件
  7240. me.cbErr = cbErr; //上传失败回调事件
  7241. me.reader = new FileReader(); //读取文件对象
  7242. me.blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice; //file的slice方法,不同浏览器不一样
  7243. me.reader.onloadstart = me.onLoadStart; //开始读取回调事件
  7244. me.reader.onprogress = me.onProgress; //读取文件进度回调事件
  7245. me.reader.onabort = me.onAbort; //停止读取回调事件
  7246. me.reader.onerror = me.onerror; //读取发生错误回调事件
  7247. me.reader.onload = me.onLoad; //分片加载完毕回调事件
  7248. me.reader.onloadend = me.onLoadEnd; //读取文件完毕回调事件
  7249. },
  7250. //上传方法
  7251. upload: function() {
  7252. var me = file_upload;
  7253. //读取第一块
  7254. me.readBlob(0);
  7255. },
  7256. onLoadStart: function() {
  7257. var me = file_upload;
  7258. },
  7259. onProgress: function(e) {
  7260. var me = file_upload;
  7261. me.loaded += e.loaded;
  7262. if (me.onProgressCallBack) {
  7263. me.onProgressCallBack(me.loaded, me.total);
  7264. }
  7265. },
  7266. onAbort: function() {
  7267. var me = file_upload;
  7268. },
  7269. onError: function() {
  7270. var me = file_upload;
  7271. },
  7272. onLoad: function(e) {
  7273. var me = file_upload;
  7274. if (e.target.readyState == FileReader.DONE) {
  7275. var slice_data_base64 = e.target.result;
  7276. //注意,一定要去除base64编码头部
  7277. var pos = slice_data_base64.indexOf(',');
  7278. if (pos != -1) {
  7279. slice_data_base64 = slice_data_base64.substr(pos + 1);
  7280. }
  7281. //封装上传图片接口的请求参数
  7282. var opt = {
  7283. From_Account: me.fromAccount,
  7284. To_Account: me.toAccount,
  7285. Busi_Id: me.businessType,
  7286. File_Type: me.fileType,
  7287. File_Str_Md5: me.fileMd5,
  7288. PkgFlag: UPLOAD_RES_PKG_FLAG.BASE64_DATA,
  7289. File_Size: me.total,
  7290. Slice_Offset: me.sliceOffset,
  7291. Slice_Size: me.sliceSize,
  7292. Slice_Data: slice_data_base64,
  7293. Seq: me.seq,
  7294. Timestamp: me.timestamp,
  7295. Random: me.random
  7296. };
  7297. //上传成功的成功回调
  7298. var succCallback = function(resp) {
  7299. if (resp.IsFinish == 0) {
  7300. me.loaded = resp.Next_Offset;
  7301. if (me.loaded < me.total) {
  7302. me.readBlob(me.loaded);
  7303. } else {
  7304. me.loaded = me.total;
  7305. }
  7306. } else {
  7307. if (me.cbOk) {
  7308. var tempResp = {
  7309. ActionStatus: resp.ActionStatus,
  7310. ErrorCode: resp.ErrorCode,
  7311. ErrorInfo: resp.ErrorInfo,
  7312. File_UUID: resp.File_UUID,
  7313. File_Size: resp.Next_Offset,
  7314. URL_INFO: resp.URL_INFO,
  7315. Download_Flag: resp.Download_Flag
  7316. };
  7317. if (me.fileType == UPLOAD_RES_TYPE.FILE) {
  7318. //如果上传的是文件,下载地址需要sdk内部拼接
  7319. tempResp.URL_INFO = getFileDownUrl(resp.File_UUID, ctx.identifier, me.file.name);
  7320. }
  7321. me.cbOk(tempResp);
  7322. }
  7323. }
  7324. Upload_Retry_Times = 0;
  7325. };
  7326. //上传失败的回调
  7327. var errorCallback = function(resp) {
  7328. if (Upload_Retry_Times < Upload_Retry_Max_Times) {
  7329. Upload_Retry_Times++;
  7330. setTimeout(function() {
  7331. proto_uploadPic(opt, succCallback, errorCallback);
  7332. }, 1000);
  7333. } else {
  7334. me.cbErr(resp);
  7335. }
  7336. //me.cbErr
  7337. };
  7338. //分片上传图片接口
  7339. proto_uploadPic(opt, succCallback, errorCallback);
  7340. }
  7341. },
  7342. onLoadEnd: function() {
  7343. var me = file_upload;
  7344. },
  7345. //分片读取文件方法
  7346. readBlob: function(start) {
  7347. var me = file_upload;
  7348. var blob,
  7349. file = me.file;
  7350. var end = start + me.step;
  7351. if (end > me.total) {
  7352. end = me.total;
  7353. me.sliceSize = end - start;
  7354. } else {
  7355. me.sliceSize = me.step;
  7356. }
  7357. me.sliceOffset = start;
  7358. //根据起始和结束位置,分片读取文件
  7359. blob = me.blobSlice.call(file, start, end);
  7360. //将分片的二进制数据转换为base64编码
  7361. me.reader.readAsDataURL(blob);
  7362. },
  7363. abortHandler: function() {
  7364. var me = file_upload;
  7365. if (me.reader) {
  7366. me.reader.abort();
  7367. }
  7368. }
  7369. };
  7370. //读取文件MD5
  7371. getFileMD5(
  7372. options.file,
  7373. function(fileMd5) {
  7374. log.info('fileMd5: ' + fileMd5);
  7375. options.fileMd5 = fileMd5;
  7376. //初始化上传参数
  7377. file_upload.init(options, cbOk, cbErr);
  7378. //开始上传文件
  7379. file_upload.upload();
  7380. },
  7381. cbErr
  7382. );
  7383. };
  7384. }();
  7385. //web im 基础对象
  7386. //常量对象
  7387. //会话类型
  7388. webim.SESSION_TYPE = SESSION_TYPE;
  7389. webim.MSG_MAX_LENGTH = MSG_MAX_LENGTH;
  7390. //c2c消息子类型
  7391. webim.C2C_MSG_SUB_TYPE = C2C_MSG_SUB_TYPE;
  7392. //群消息子类型
  7393. webim.GROUP_MSG_SUB_TYPE = GROUP_MSG_SUB_TYPE;
  7394. //消息元素类型
  7395. webim.MSG_ELEMENT_TYPE = MSG_ELEMENT_TYPE;
  7396. //群提示消息类型
  7397. webim.GROUP_TIP_TYPE = GROUP_TIP_TYPE;
  7398. //图片类型
  7399. webim.IMAGE_TYPE = IMAGE_TYPE;
  7400. //群系统消息类型
  7401. webim.GROUP_SYSTEM_TYPE = GROUP_SYSTEM_TYPE;
  7402. //好友系统通知子类型
  7403. webim.FRIEND_NOTICE_TYPE = FRIEND_NOTICE_TYPE;
  7404. //群提示消息-群资料变更类型
  7405. webim.GROUP_TIP_MODIFY_GROUP_INFO_TYPE = GROUP_TIP_MODIFY_GROUP_INFO_TYPE;
  7406. //浏览器信息
  7407. webim.BROWSER_INFO = BROWSER_INFO;
  7408. //表情对象
  7409. webim.Emotions = webim.EmotionPicData = emotions;
  7410. //表情标识符和index Map
  7411. webim.EmotionDataIndexs = webim.EmotionPicDataIndex = emotionDataIndexs;
  7412. //腾讯登录服务错误码(托管模式)
  7413. webim.TLS_ERROR_CODE = TLS_ERROR_CODE;
  7414. //连接状态
  7415. webim.CONNECTION_STATUS = CONNECTION_STATUS;
  7416. //上传图片业务类型
  7417. webim.UPLOAD_PIC_BUSSINESS_TYPE = UPLOAD_PIC_BUSSINESS_TYPE;
  7418. //最近联系人类型
  7419. webim.RECENT_CONTACT_TYPE = RECENT_CONTACT_TYPE;
  7420. //上传资源类型
  7421. webim.UPLOAD_RES_TYPE = UPLOAD_RES_TYPE;
  7422. /**************************************/
  7423. //类对象
  7424. //
  7425. //工具对象
  7426. webim.Tool = tool;
  7427. //控制台打印日志对象
  7428. webim.Log = log;
  7429. //消息对象
  7430. webim.Msg = Msg;
  7431. //会话对象
  7432. webim.Session = Session;
  7433. //会话存储对象
  7434. webim.MsgStore = {
  7435. sessMap: function() {
  7436. return MsgStore.sessMap();
  7437. },
  7438. sessCount: function() {
  7439. return MsgStore.sessCount();
  7440. },
  7441. sessByTypeId: function(type, id) {
  7442. return MsgStore.sessByTypeId(type, id);
  7443. },
  7444. delSessByTypeId: function(type, id) {
  7445. return MsgStore.delSessByTypeId(type, id);
  7446. },
  7447. resetCookieAndSyncFlag: function() {
  7448. return MsgStore.resetCookieAndSyncFlag();
  7449. }
  7450. };
  7451. webim.Resources = Resources;
  7452. /**************************************/
  7453. // webim API impl
  7454. //
  7455. //基本接口
  7456. //登录
  7457. webim.login = webim.init = function(loginInfo, listeners, opts, cbOk, cbErr) {
  7458. //初始化连接状态回调函数
  7459. ConnManager.init(listeners.onConnNotify, cbOk, cbErr);
  7460. //设置ie9以下浏览器jsonp回调
  7461. if (listeners.jsonpCallback) jsonpCallback = listeners.jsonpCallback;
  7462. //登录
  7463. _login(loginInfo, listeners, opts, cbOk, cbErr);
  7464. };
  7465. //登出
  7466. //需要传长轮询id
  7467. //这样登出之后其他的登录实例还可以继续收取消息
  7468. webim.logout = webim.offline = function(cbOk, cbErr) {
  7469. return proto_logout('instance', cbOk, cbErr);
  7470. };
  7471. //登出
  7472. //这种登出方式,所有的实例都将不会收到消息推送,直到重新登录
  7473. webim.logoutAll = function(cbOk, cbErr) {
  7474. return proto_logout('all', cbOk, cbErr);
  7475. };
  7476. //消息管理接口
  7477. //发消息接口(私聊和群聊)
  7478. webim.sendMsg = function(msg, cbOk, cbErr) {
  7479. return MsgManager.sendMsg(msg, cbOk, cbErr);
  7480. };
  7481. //拉取未读c2c消息
  7482. webim.syncMsgs = function(cbOk, cbErr) {
  7483. return MsgManager.syncMsgs(cbOk, cbErr);
  7484. };
  7485. //拉取C2C漫游消息
  7486. webim.getC2CHistoryMsgs = function(options, cbOk, cbErr) {
  7487. return MsgManager.getC2CHistoryMsgs(options, cbOk, cbErr);
  7488. };
  7489. //拉取群漫游消息
  7490. webim.syncGroupMsgs = function(options, cbOk, cbErr) {
  7491. return MsgManager.syncGroupMsgs(options, cbOk, cbErr);
  7492. };
  7493. //上报c2c消息已读
  7494. webim.c2CMsgReaded = function(options, cbOk, cbErr) {
  7495. return MsgStore.c2CMsgReaded(options, cbOk, cbErr);
  7496. };
  7497. //上报群消息已读
  7498. webim.groupMsgReaded = function(options, cbOk, cbErr) {
  7499. return proto_groupMsgReaded(options, cbOk, cbErr);
  7500. };
  7501. //设置聊天会话自动标记已读
  7502. webim.setAutoRead = function(selSess, isOn, isResetAll) {
  7503. return MsgStore.setAutoRead(selSess, isOn, isResetAll);
  7504. };
  7505. //群组管理接口
  7506. //
  7507. //创建群
  7508. webim.createGroup = function(options, cbOk, cbErr) {
  7509. return proto_createGroup(options, cbOk, cbErr);
  7510. };
  7511. //创建群-高级接口
  7512. webim.createGroupHigh = function(options, cbOk, cbErr) {
  7513. return proto_createGroupHigh(options, cbOk, cbErr);
  7514. };
  7515. //申请加群
  7516. webim.applyJoinGroup = function(options, cbOk, cbErr) {
  7517. return proto_applyJoinGroup(options, cbOk, cbErr);
  7518. };
  7519. //处理加群申请(同意或拒绝)
  7520. webim.handleApplyJoinGroupPendency = function(options, cbOk, cbErr) {
  7521. return proto_handleApplyJoinGroupPendency(options, cbOk, cbErr);
  7522. };
  7523. //获取群组未决列表
  7524. webim.getPendencyGroup = function(options, cbOk, cbErr) {
  7525. return proto_getPendencyGroup(options, cbOk, cbErr);
  7526. };
  7527. //群未决已读上报
  7528. webim.getPendencyGroupRead = function(options, cbOk, cbErr) {
  7529. return proto_getPendencyGroupRead(options, cbOk, cbErr);
  7530. };
  7531. //处理邀请进群申请(同意或拒绝)
  7532. webim.handleInviteJoinGroupRequest = function(options, cbOk, cbErr) {
  7533. return proto_handleInviteJoinGroupRequest(options, cbOk, cbErr);
  7534. };
  7535. //删除加群申请
  7536. webim.deleteApplyJoinGroupPendency = function(options, cbOk, cbErr) {
  7537. return proto_deleteC2CMsg(options, cbOk, cbErr);
  7538. };
  7539. //主动退群
  7540. webim.quitGroup = function(options, cbOk, cbErr) {
  7541. return proto_quitGroup(options, cbOk, cbErr);
  7542. };
  7543. //搜索群组(根据名称)
  7544. webim.searchGroupByName = function(options, cbOk, cbErr) {
  7545. return proto_searchGroupByName(options, cbOk, cbErr);
  7546. };
  7547. //获取群组公开资料(根据群id搜索)
  7548. webim.getGroupPublicInfo = function(options, cbOk, cbErr) {
  7549. return proto_getGroupPublicInfo(options, cbOk, cbErr);
  7550. };
  7551. //获取群组详细资料-高级接口
  7552. webim.getGroupInfo = function(options, cbOk, cbErr) {
  7553. return proto_getGroupInfo(options, cbOk, cbErr);
  7554. };
  7555. //修改群基本资料
  7556. webim.modifyGroupBaseInfo = function(options, cbOk, cbErr) {
  7557. return proto_modifyGroupBaseInfo(options, cbOk, cbErr);
  7558. };
  7559. //获取群成员列表
  7560. webim.getGroupMemberInfo = function(options, cbOk, cbErr) {
  7561. return proto_getGroupMemberInfo(options, cbOk, cbErr);
  7562. };
  7563. //邀请好友加群
  7564. webim.addGroupMember = function(options, cbOk, cbErr) {
  7565. return proto_addGroupMember(options, cbOk, cbErr);
  7566. };
  7567. //修改群成员资料
  7568. webim.modifyGroupMember = function(options, cbOk, cbErr) {
  7569. return proto_modifyGroupMember(options, cbOk, cbErr);
  7570. };
  7571. //删除群成员
  7572. webim.deleteGroupMember = function(options, cbOk, cbErr) {
  7573. return proto_deleteGroupMember(options, cbOk, cbErr);
  7574. };
  7575. //解散群
  7576. webim.destroyGroup = function(options, cbOk, cbErr) {
  7577. return proto_destroyGroup(options, cbOk, cbErr);
  7578. };
  7579. //转让群组
  7580. webim.changeGroupOwner = function(options, cbOk, cbErr) {
  7581. return proto_changeGroupOwner(options, cbOk, cbErr);
  7582. };
  7583. //获取我的群组列表-高级接口
  7584. webim.getJoinedGroupListHigh = function(options, cbOk, cbErr) {
  7585. return proto_getJoinedGroupListHigh(options, cbOk, cbErr);
  7586. };
  7587. //获取群成员角色
  7588. webim.getRoleInGroup = function(options, cbOk, cbErr) {
  7589. return proto_getRoleInGroup(options, cbOk, cbErr);
  7590. };
  7591. //设置群成员禁言时间
  7592. webim.forbidSendMsg = function(options, cbOk, cbErr) {
  7593. return proto_forbidSendMsg(options, cbOk, cbErr);
  7594. };
  7595. //发送自定义群系统通知
  7596. webim.sendCustomGroupNotify = function(options, cbOk, cbErr) {
  7597. return proto_sendCustomGroupNotify(options, cbOk, cbErr);
  7598. };
  7599. //进入大群
  7600. webim.applyJoinBigGroup = function(options, cbOk, cbErr) {
  7601. return proto_applyJoinBigGroup(options, cbOk, cbErr);
  7602. };
  7603. //退出大群
  7604. webim.quitBigGroup = function(options, cbOk, cbErr) {
  7605. return proto_quitBigGroup(options, cbOk, cbErr);
  7606. };
  7607. //资料关系链管理接口
  7608. //
  7609. //获取个人资料接口,可用于搜索用户
  7610. webim.getProfilePortrait = function(options, cbOk, cbErr) {
  7611. return proto_getProfilePortrait(options, cbOk, cbErr);
  7612. };
  7613. //设置个人资料
  7614. webim.setProfilePortrait = function(options, cbOk, cbErr) {
  7615. return proto_setProfilePortrait(options, cbOk, cbErr);
  7616. };
  7617. //申请加好友
  7618. webim.applyAddFriend = function(options, cbOk, cbErr) {
  7619. return proto_applyAddFriend(options, cbOk, cbErr);
  7620. };
  7621. //获取好友申请列表
  7622. webim.getPendency = function(options, cbOk, cbErr) {
  7623. return proto_getPendency(options, cbOk, cbErr);
  7624. };
  7625. //好友申请列表已读上报
  7626. webim.getPendencyReport = function(options, cbOk, cbErr) {
  7627. return proto_getPendencyReport(options, cbOk, cbErr);
  7628. };
  7629. //删除好友申请
  7630. webim.deletePendency = function(options, cbOk, cbErr) {
  7631. return proto_deletePendency(options, cbOk, cbErr);
  7632. };
  7633. //处理好友申请
  7634. webim.responseFriend = function(options, cbOk, cbErr) {
  7635. return proto_responseFriend(options, cbOk, cbErr);
  7636. };
  7637. //获取我的好友
  7638. webim.getAllFriend = function(options, cbOk, cbErr) {
  7639. return proto_getAllFriend(options, cbOk, cbErr);
  7640. };
  7641. //删除会话
  7642. webim.deleteChat = function(options, cbOk, cbErr) {
  7643. return proto_deleteChat(options, cbOk, cbErr);
  7644. };
  7645. //删除好友
  7646. webim.deleteFriend = function(options, cbOk, cbErr) {
  7647. return proto_deleteFriend(options, cbOk, cbErr);
  7648. };
  7649. //拉黑
  7650. webim.addBlackList = function(options, cbOk, cbErr) {
  7651. return proto_addBlackList(options, cbOk, cbErr);
  7652. };
  7653. //删除黑名单
  7654. webim.deleteBlackList = function(options, cbOk, cbErr) {
  7655. return proto_deleteBlackList(options, cbOk, cbErr);
  7656. };
  7657. //获取我的黑名单
  7658. webim.getBlackList = function(options, cbOk, cbErr) {
  7659. return proto_getBlackList(options, cbOk, cbErr);
  7660. };
  7661. //获取最近会话
  7662. webim.getRecentContactList = function(options, cbOk, cbErr) {
  7663. return proto_getRecentContactList(options, cbOk, cbErr);
  7664. };
  7665. //图片或文件服务接口
  7666. //
  7667. //上传文件接口(高版本浏览器)
  7668. webim.uploadFile = webim.uploadPic = function(options, cbOk, cbErr) {
  7669. return FileUploader.uploadFile(options, cbOk, cbErr);
  7670. };
  7671. //提交上传图片表单接口(用于低版本ie)
  7672. webim.submitUploadFileForm = function(options, cbOk, cbErr) {
  7673. return FileUploader.submitUploadFileForm(options, cbOk, cbErr);
  7674. };
  7675. //上传图片或文件(Base64)接口
  7676. webim.uploadFileByBase64 = webim.uploadPicByBase64 = function(options, cbOk, cbErr) {
  7677. //请求参数
  7678. var opt = {
  7679. To_Account: options.toAccount,
  7680. Busi_Id: options.businessType,
  7681. File_Type: options.File_Type,
  7682. File_Str_Md5: options.fileMd5,
  7683. PkgFlag: UPLOAD_RES_PKG_FLAG.BASE64_DATA,
  7684. File_Size: options.totalSize,
  7685. Slice_Offset: 0,
  7686. Slice_Size: options.totalSize,
  7687. Slice_Data: options.base64Str,
  7688. Seq: nextSeq(),
  7689. Timestamp: unixtime(),
  7690. Random: createRandom()
  7691. };
  7692. return proto_uploadPic(opt, cbOk, cbErr);
  7693. };
  7694. //设置jsonp返回的值
  7695. webim.setJsonpLastRspData = function(rspData) {
  7696. jsonpLastRspData = typeof rspData == 'string' ? JSON.parse(rspData) : rspData;
  7697. };
  7698. //获取长轮询ID
  7699. webim.getLongPollingId = function(options, cbOk, cbErr) {
  7700. return proto_getLongPollingId(options, cbOk, cbErr);
  7701. };
  7702. //获取下载地址
  7703. webim.applyDownload = function(options, cbOk, cbErr) {
  7704. return proto_applyDownload(options, cbOk, cbErr);
  7705. };
  7706. //获取下载地址
  7707. webim.onDownFile = function(uuid) {
  7708. window.open(Resources.downloadMap['uuid_' + uuid]);
  7709. };
  7710. //检查是否登录
  7711. webim.checkLogin = function(cbErr, isNeedCallBack) {
  7712. return checkLogin(cbErr, isNeedCallBack);
  7713. };
  7714. })(webim);
  7715. for (const key in webim) {
  7716. if (webim.hasOwnProperty(key)) {
  7717. const element = webim[key];
  7718. if (Object.prototype.toString.call(element) === '[object Function]') {
  7719. webim[key + 'Async'] = (...args) => {
  7720. return new Promise((resolve, reject) => {
  7721. webim[key].apply(webim, [...args, resolve, reject]);
  7722. });
  7723. };
  7724. }
  7725. }
  7726. }
  7727. exports = module.exports = webim;