From 08da07bacfe8b53cc2dd930ba23f54e02d32ebbc Mon Sep 17 00:00:00 2001 From: halomademeapc Date: Wed, 22 Jul 2020 17:56:17 -0400 Subject: [PATCH] add branding, update docs --- README.md | 10 +++------- docfx_project/logo.png | Bin 0 -> 46209 bytes src/GravyIrc/EventHandlers.cs | 6 +++--- src/GravyIrc/EventHub.cs | 8 ++++---- src/GravyIrc/GravyIrc.csproj | 14 +++++++++++--- src/GravyIrc/{Client.cs => IrcClient.cs} | 20 ++++++++++---------- tests/GravyIrc.Tests/ClientTests.cs | 10 +++++----- 7 files changed, 36 insertions(+), 32 deletions(-) create mode 100644 docfx_project/logo.png rename src/GravyIrc/{Client.cs => IrcClient.cs} (90%) diff --git a/README.md b/README.md index 1427a9d..a6b5f68 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,9 @@ dotnet add package GravyIrc ```csharp public async void TestClient() { var user = new User(config.Nick, config.Identity); - var client = new Client(user, new TcpClientConnection()); - client.EventHub.RegistrationCompleted += Client_OnRegistered; - client.OnRawDataReceived += Client_OnRawDataReceived; + var client = new IrcClient(user, new TcpClientConnection()); + client.EventHub.Subscribe(Client_OnRegistered); + client.EventHub.Subscribe((client, args) => Console.WriteLine(args.IrcMessage.Message)); await client.ConnectAsync(config.Server, config.Port); await client.SendAsync(new NickMessage(config.Nick)); await client.SendAsync(new UserMessage(config.Nick, config.Identity)); @@ -33,8 +33,4 @@ private async void Client_OnRegistered(object sender, EventArgs e) { await client.SendAsync(new ModeMessage(config.Nick, "+B")); await JoinDefaultChannels(); } - -private void Client_OnRawDataReceived(Client client, string rawData) { - Console.WriteLine(rawData); -} ``` \ No newline at end of file diff --git a/docfx_project/logo.png b/docfx_project/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..79ee1dc3628698bb5dd125fbe09dbb408d30f7f5 GIT binary patch literal 46209 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 P z3{mQOH=!vu`+j(F7vvK4j0NIEVe*uE{ZgDLwWX(J+H$d@>0rN$wj1|?`(*xITncAt zX=zS@8a`KQ;Kf73mDaF=(+L8Z=)!nkR>^p7*oVd%Cr+c7)2bUP`P^Bse>O zk1=sCx-$_3a^i6qxG&KKmKL)qD6d1_4L~y*<+hcLtMOyk@1gu^-!ks$pT3W-9U6j% zb|GoP6ZCL<3>^WrslDYJw5?V?MAV~czFjTKKm;Mn5)VPm4HjH-aQuf_a>cbKdO;>C z-rQ>Pj4Br+MG3xeruiN9#6e>eg3zC=OdmxE87+W(Q33t@!lJp#30h7O_f(i>`{jTJ z?It=&cy+8MJ79aip>xC9wEjN5bOs;UEHZs9V>qy9AEsAkn)Jc?|KP(NoDkqWT)(&M z+zg!h;GMx)$~_SSWYn-^x%aPM;|9xRId(^&zs$mswChtj#Eu~B&RG6#=0aQ{o!IJi zZcmiX2esvHXlTf5W{Ls-zv_m<2XjJf9N8Opk zrio=rv*7kt9Y84C$^{&nJp;j2^7WL;fz^RWGJx0e9(FqHrq&M&KJKep%OR0+>M~|L zHv%Bh+g8Ueke+_cz;M9tUOA8%CKCJNIH&vsop3Od>qcTz@hUH&91(ye$d}uQ=F6nU z9t#w4mxrSDcJ*NIwRMoI6w0+B^Kjn<@_L;=Ou9#;21l0{tPP-uMDZtANvWdLt9`kM zs)ZPoJXF5LQ-@0YFH7|s(PW3O+ikyn?oC2htfFRuX#D`o11qcdpD~(9!>y7#6c-w(`2O!jl-R`mJ+2>V(0}4Zf87c?A?nl z?L>6;^-Q!cEE^-?d1w-);h6b${|Vy7>U~$gsd>&V!Jyhbyjw#l#eo2FOcBnwkW)B6 zI#JXZRBo1;4rm4FF2#Ef- $S==WV?=-4@0GjOLcJPN|0e?F+?`$Lf3M|*v^eIHD4co0#zP280hKA3%dAo4|CdagLnAnb%~QDC3~ts z88F&DD@tAc&BL~oEA$849@xpWyZ%iTdZ5n~D4~GQPPN#UZJHMOrd~gH&r{!upx7)< zH14$yo-~&-8be($s(P$4U*A~T|5x2S+8GnkQ@{r~RV|?wgC#Dw-T5n(4@93%`1x^1 z!s<8*x0{(lG$E}m-}J3?UmXYd>dQuyZb~h=L3qRMrmv=K`)jkQ^=mv7GtC;F`rUhD zj)B<2iTE|^g7s5I0mH+kUPi{d1=*pRIH8=Q!l1``2EV}g)AS%zcxrKrTs%;${})_9 z?hpk$lOybCuL{nAwVg0n;Hn?QuU`GhYBRkn@pdcB9j|B&r0 z+50v(tNkii3M3(q$%t2zefwTJinx?0fY*?zkd1Xi@I`9(a*9cLSQvA05)V+ZoUma5 zTMtu!hhROZX=9fwuE}?P@>yTgaA=>8r{yEs$MwoBx1q)y-Wp{>+?oObFkPj{`w zCy4$YaUOJba|7C+Q3;EajCEt@W$VV=cS_F$YhK>*z1$I>)CGIJB}`&a02W051!8+(9Qz4Xmy}40*%~G-Sj#RBr&$$g^#CS;Sw60J);$*J-xQ_D0o0r>EBTo=7u(~1S=LDjv z4DdsWMYz)#Is60YrV|#}giQ31SX_-|_hb`V=n?$w>Z;4#!h7VU!jfs+kX4@W6y}sD zCL0Pr5BJz)hs0{VOV%=H_OX?F$P)@3(lVV+QGs zwwfi06FMChY;Hok^y=K@7gNS3uJ%z34#K!ioTLeR+XULE>F-GNwP}QM^iV(9lioJ{ zPwhlUoAFXiLEa9qXxU*|pp}h1+pm|Kvv>-qdwizrFKNgXYX?kFz@J7x77`8`p8b(B zGEs+0)2FBs5b0fjF@}UggyZ!jKH_#>aPwexD-;O6r0z|ADsv>7CVT9~7Dvs==U*iv z-LqQQPr=K^pql7C#U`6ONxWEh6-3YoiF>=@8|D@hHpQmlDWH;7#@q|e*FQ4p z8oyU16dJ`UMQJIjL!U^s*u-$L1awcid8{50n#-!$uGvf{R_9HvUBNJV3pA^Ptk9C5 z4dwi%d_Ym$z>Ne+!Sr&9KpizkjsYW!zXkkQ!K9|WE`xS*-~U0xGu(%CKd2`Z5nHU| zqb4)VBhZ@o)X%cxQwhamP)q{^`9^UzZ|&Cuq~d-`&%3V>Jyfg2aot#EOKSNfrM_Wh zNhu)as?&6jx^UgMvh9M_jUHd|j3iO&zp<}4eTZV!l;D#?X!9=(g>sQJ&8>w4;YEc` zY26}?`!dsiTHuWhKp_p@2D5nO!vU=bdcM5shZnA%NGKk=y#Vsqs#DC4b zid4eS?D#q5;<50?OBgQ_BISo1)*Jb^M`a$^CdrL5FSx-~gnd&IqV-%h`<=O>xK{KM zv5Rq!J%8y}ec)q~ahaB1dybd2$VZKWI)vbF7xKjMY{bGD!K^*~Y>_JA*VZ5X_FJd6 zk&MxjRM%*(a>J&Bnm#VVsy$w-x9I)f@ zOaDt%1x$H91H{UQ56nN`Qc(mH^O^A_f(zs&pblEn+zH=)F{(WDb$|3!(C=RFf7n}- zMdC~BT*k4e7> z7NtXIhyD#iTavOpx@$~c$>CoVuH7x6UHZ~yxeV_=N2Q|}^dW&|D;OMpzR5(YQ{j&H z?!`<~fvFrIjaANeFhev+EU&a8Cf;P}GbixCS`Lit$lQ#+J!F`!-%x$`_Q$)A!QtD< zr-kngjUC9(uilb)$d?nDcbQ5((=sj>JKN6mMlku?We*;j#E1I4GVk;Fn5s|1zDn0T z{!QHDQU^et!qL8ICN!^+-8O=|#AmQ4O67t%FrIk_+((z>7;&r~vbcxg!zs8BYGZ(zf_LRKH|j<2ET`~)qzp`7CbzqQU{Saj|kP*lQms1bVW z-7IT?!G1a|Zztp2K(LRgJ;_J-bxQk{61hl4Us?$p276)rJ@*Jr#st~!{3JEq1hM~{ z(3s+0_`v|I!=v*w3nyUfye-jY##xNB2W}MPS)Drvx**y%V{h73i5=K4%O^MrjX?ZEiVdD4=qrw0QIJ(cs^*w)c(hHbXpN(BI&{yzb6DuRF0G*+haFyxT`+9YY%;< zTaSR!fQP$AAJ>yG+jVD}x0J`Lb=O?M`(}935@+YLd(SCrbo@D{cW{dJtJ-zfG$i$% zX8Z?x)&AICzFC);iLoPV)`mtSS8+4`f0qv}K2xE#> z^I!N!-kk-A-2V8co!`Z7knNzkJ$Bah-yB(8zobYYwoT|EQju&0+iSO{Oi9TPV>(XNm>Cf+pY3LOf~y%NdA08+OO)?Z2jh*goPd+ zNyUN{xOV;;{Tdm@^#*ZYBz5;+d>;`uqv49Se7cpm5s5IWfVuw3vQ&TQKYx1O@>eJ( zoYN-SxRL0IhnJWZ0tz>DR`V`!uDy9BM0Kv7-wD(n%6@j_1v^Jn99xmvWdVuc$NnI9 zZWMpT*WDZUSN*z!ebI`ZQu!?Og5Ac|Y`S$uM36FlCKhoTuvH?SE`#3##8t%DCh&ukCV0qWz=iw7>;Q_l4>3)HLtgv=Yp1EG{Er zem#ZgO707sDXs!W*Gj*!z!5<~wMvSLD`^T2qf~%-d=-@E2UA(4N}T_$#dZ8Hlli-K zdgc~+=+$Qu)q5?R>%^!deH+@;i60pnbOo+5NpoQ|H zA#p!;AhON?k<~yR*jY#%FHLLb@I!-xr`^bdgQhdYta&r&R)V?NmF^ngzr^C~qRsHB z%$T-@IP`FjD1LTdC*TC!K)|EThHM{V;igkfv5H=`c-4x&?a3`Diym)T?6G%W+fpgY z;JkJ4A;VD@Ig@u(Be3EnS8#RIn9%)W_YNkU>eCv2_OiG$&-E!nnqAM2g#^EaU7f6b zT=qmEEt(mU$R98d^>lTLfE;DJ;IlZ5`?i(ypE5OKI zeBGwuU0~iNcX;^tmfGd~&j1TDp*y$plfV;PrsvEydE(`+f8DTGqvcxQ{ePR5kpV(3BoDCfL(Z5TnSSIs#`?BF zNO#~X`{GT%c;()b9l$Ni03S%t#olb`zTBp&=ll@N#jV^8`4{! zqEX?Z0uRe8Azj3`9?QOyt1 zw#aDvXfwhtpdoAdzWhJU=+L>;5RAxT-Os8qw$vZ9&L?hET3!}FM%zW7BJ4^dJ4JQ- ze1tG^H?teaq;w!Qk?Okg1fu~0yZiZ@kkDFvoh z6htB-sVlFwS=z`)e2DmhH(tbxUXR{_B9tSZl4VGQx$8igoZultOl`ckdtPx(VZy3JXTi3ZUPI;#{O|a+qp}khZ z*GN6LbP|Re?8{^^(gRO_fP8*LL^+cME)z8I+)_)}fzej}RQe}Yn>%MwJBVavS?Khs z=QDN0dQYd1F88Ly@E*?@Y#Fz&Tgr*M4JmFe2912%acc!iLb&f79KUdtYpkFyTl&@u zzfWJ4*x%hJ8P}-zy1LYlT04IpwRGC^fVbnA1GdotDBa_|UWeHtwAV z&HhD9oaAursl3_`kN&aU1uo1~)|p_lKN>3hLB0d#g~mOib^TD*e2u!jB7m6WU1F#K zW3&O`6vjspLr#;!+riA^JjA>GT8=_FJrih3N!6TCz(?Bv9< zAE%`1d!l3@AfSP^`#YncWLtN|;d!tr39z8Mh&cN8L)5PW%mqV?HhLfNc+GMc{)bUr zyon;_qZ^a+8P;FsO3s+OA2h>iPyXy?Q5FXgezNNg=ahC+tpzXT3)M~cpzgPwqZDPO z9`mlRPC;uUIHaTa^euXQ2<^(dG?%T2za{dbbWpK~E{^BE9QyyGW8g7bZ}2Mv_pQS! zVBmd3p=n`}k+`hHg%p!#cz7Yoi>J6z!Ndnb-iEjjjb8-0E=5c)U-H?|>4!0^=|_{# zGTy^sE^N33H9W$v%X5VB3cl$fiD#@I|HGtwZ#LcW)ovnaghS$S4>IFuth_M zsasbn?#p!iyIiU?`hc#Y%}`bpWYEP2bE@V}UsT*iIZ`WO<1^n`;4#lHVYW3eQum8L z<6z^*n}M^9dQ8)^d*CBh$eK3RKVitop;yKA(4E%u(g~&huI-a)i9)%-6K#AyNUcc;lU{YK||&h zj<}AmvVXv<1&Iqo=APX(1x>ow*hHW!{tU8sdc-e2J8fe`+W+|-bGGIaMzT`e&1q%Q zbhzf;)((I}D6sdz4X#MrqYPm0O}qDTU4f^9--T-Ds+yYt4ze1R_bO&rN_^6gJDGE( z*~cv4)`3oT#3MES(W9W_Z_P=E1Qa#v)-YM~pq1QEGjzhHJ43(j)4T;VWmba@CQXBB zPcd4HyVv|E&w;uU8oNHc`Jaup2OEL1$Ua1srvFN}a(i+V2vqRBzKVN!aM^2QQ ziT72`p4crnv_1!TDEQt9&1H|~Qb_!e<_G~H6b<^)|hQ)2ULWNHQg+~%!yG{ z#3UuOc>o>zC5NYG<0HnE)m1qMMmCWL>XN*J=EpSIL|&M@Vi#eecgxxhE~U27kz-*W z3~o#wEIty`=!|d$FA?53mR6bR6Zwe?=9oT;)xdEc+MA&nO;=-^M*}S#H4q?C{IiWM zCO%$>f{gmMf|B|K(%OhEA{TiT~H$a z7s_e0tZ7{VJT9+55SPPP98&**9=bsI)PO{<1kuqED8q9|O7lO{rlO9v|Mdb$J}6nK zCnsjEq-`-8+I*8*eKZE?;!H!7Bu_8cZl|+qP7|%-JcKQ{|DHfx9Z6$O_+~>44w>kB zm%kQFWRGlZ>W6btkIymj#j<{r30Q9#H81m((c)RRKnG z(Z1n^e52Z`rZtU7+WHo^V9R(y^Vjd@9$C&>U)e9BJuk|s>Drdooto*^x#w&ZWi;9Q zQ@1WEycM15_a{ZIDC39+NkQdO7TfEz#Hq6@^4+H@iLJ;~o!ze5@W}DUf%62uUk$mq zLHF){mpO1B@{@Ya6FFs>S}v#80{uRjxpHu=0%my!!ViN-VAUF4#=XLwan`bZ4%>By zhP*(*uZ7;jKL+BKj`thh?Hisba{2Rb+3L(cA{#<4YHo1t+m+1dHSyMjuwI5oug$A3 zYNIw#^@;ljQE_-8p>*(B{)rTmN*wI}@yM`+cc)i69lI-;TvP!A&gZ#|A3lnjwX#1G zt7r%94M1-SUifq)>g%n%eEibC+d`c{b|m=G9bDK$!p<)Gw59By6!kxI7d9DzLbdfn zu+p`?L1_35l`vHI(`vltSa*BevlUV*0C_1Sx zw{oP!<3y?VU+WTh!Dg}rV&Z#dP$MYHveDc)1kl zIQm{Zbg;0FRPODO@k_PdVa?Rk+0>`T!%5q=H*m7P1eC zy`40E;Jo{3?kSOf>wn$|l=~<))Ab7QlWv{yXDz{kg(~@` zm8&i+E8TRa4@F4?&kD2}q)Ts&z$_)&Ect|A<=%|4DTk39{#5*nRn$~WpVj*q&S~U! z!WKOBHg|f#t>-lHfWj!dZyVrNT)xrY(7Dv#`~|(>WulsuGO1pSj9SXlvXpyo18`XcYVB++sv zLumxkO?c^_=GP6M0iAk0rz||rN@dj1quwX{OH{x3J%>3J`7H*R_i*}=&*cRt28<3TqK0n)YGF-S zuoYTu_ZLb&8@*vUn;Fj844=_WaPQdy?_aT;Q)Jw2wh?IJROK^b;PVfZ=D;w=X zI{7BQqviN+90$(TA$H|;Qo5Lt6z}+62b?#<6Q*fji1N{}^4s9oNz-ov`>Z>VTYqot zXG){-ov&TUb-&xO^hwRd>0ZkGE0DflK&5WyCbvxng#`?qAKx!{)j&S#(a*s`|LNaDwl@_+sJKaATVAyzIqm0IWLG6ck^bTQ;Q>47nE* z_uPtrZ~C%84s4;uw=k&^#$w04A>)NcyD}~isoj*=TjdF8wBI-gp?l@h&OZ{sBDM-Bp&r6@!m{YEEgk1I z%GrNCavRk>7dmYpLO(-_=(VR7SG|YNZwT2PXF z9J_e{6MiIUA=Ly_p|UJMfOi0f8HGZ<24F4w=Lz}BOwkE?9k7dDt$@Li_)I2Q{Nd?D zR!){MMHy~yy`_7FdjkZcEdUlv^Ly_6sQmuBK^QG zCAxv|?ULTTD;(oW1y%Bk*YNVfB{Jat>!M%X)Ytj@Lx2z5ftsf$VPV)o0AnZ|t6wU* zX45-g`RKuQk_|%G&_&+!=BJl|W!$IGO)E3JnBswY&+_%Y0`Q~Ds!)U!diwHb9pQ4e zk%>D0U@<^B7??}mWo~*-a%|5qvhEh4fBC2)4-mxt^}me|-e2sYFMU`2^1e!m&UefN zJ0O9H7M=IqjQ7}?v(|gE-Qb@=pJtDPpkauL9{W<*xF+F)gGf2n*0&sgFl||5BL1ow~Kx*moXM(RBiiYeH#joT> zC+PYiVC24Mo-(HW{I6vPAXF}p6)lCVYREJ7{4FXQmkhbEA3+4}mX`i?htc8<_QldR@H{xAD1&v@kx_wXRAL0&wh4Syv6SX$J{ zLC;4ja0aQjk<|LK&U{$9dl-z2R)|N1t#&&`3+JD={%_HS{#0va4ws_}6(Rer)ZL zpSSl!jGaqsTbp66$xd~B_p@2+6XJaE)ZC}0ZQX4}+%nF(#z8%;gHfis>2;H7<7H8Cb>calbJz!&+E^wr(dps#V8%z>610ji-hObL%(G9h3IH_5a57+^dP%Bsm(P_P`x9 zkcr75m$@fIx}8+|_rsJ({W}r?(u0%GXC-m`0s=!?kh;3re#~fzeA`6>5`$6EIL#X# zVQ&0zaivbeNIvHtT`tMkb84o#z*lV}duL{`UmMz_i){ZyQbmq`_IlbmVf5chVtXoc z)lVLwbS6xEH-Zj7c+4s87<32Jz<0}jsDxDPQkEQj^OHt3lOKg*q#p~BDp6<{!dCL+ zy}z$z+wem!a(V27QlzSkx3>ce-6<9ip0mv}y1-sIn}i)iX8ugHS^CN6rxGrsdX`zC z>Zn$7-7t+12vX7dQmJ3v_rkenTp+v~;cazIX(e56#ej^Of#>nSwl;P9{|L zyeWX&)@I&BxMWE87W$Mi^p1|gC&tFEvGh89h2_L~@RR;1MVh-`iE0?FNxe&Ex$`cN zSX)i}{mgKNhE3x}=MS5-v*W&_GOR%w@%@B-KuX%dU~+*2s-G7L{Te=ES~^vcS-*k; zpHziC^H=5w1Vu?XnX>ebJ#kvU60g}Y7XCa@-*O=ZHh$?i9db)28PlO=Dm*fDA9~ck z%%Z_+@g)16Xc)8o@y&>vgItMsR3!P1IT^$5+itp%n-*5vZJP6aZ7@B%kw}9kaeqEk zadJNI6b5AsK|==rl(yO|wit!i)T-j7Z@zk-kFd31;bNO@P78(!x8T&Q1vV|b)S=YV z5v5(u17s@KSRk`mq#=c^(^@MjLu%0U-w)-IE-IZ%&-0D8K&8l04 zjvq)Pf0qpG5tys@&-HoqTWg)^KT4pLT>v%<@R`!A0*#^b$?WHkN#}S; zC7WTk1&p={QUH`JHx?(Ysi`T>fXS^2iU6b}p8PfoU@dXLDLUXQfrY+>kRFAqog&ws zD{8$>mo#4%EW#isViOjbry{!d9arz?sm7z7tqCq6=%EzRt8m&DpwFJ}KET}k8 zgZZv-$?U0_q|DX4yVMaVU=*YpVwzZCQric=nV_-^BXjri3?q^h^g;<^F^67=6aOB6 z9m$~n*(9l(So}~WBY%CsD_Qa~Qzrpu7Q0#79m8kk!BS|BintTM*>Xj&3<9$n$(SqM zy;jmejrBPqZbpSw>Tj69(flzaSKfV08@nk%&U|~jrgXy@M`X!p-m8=fU@_s}j z3xVJ{Co)9*GiU&NIe%nOU;unC1u)Ll_dCi-X{VQ$tGajHCDiLN{|d3{%CsveT?(HG z2}cwy`!QqhuSdlj8?K$Lt^Ax)h&+VNe`B zi>hqiU5jCejd{?UdlMe>riy@3VhTTYY2K7RMZ`&S}_5WSn|@0SkSdrW&vJFP4OCRqsCK8G8CrfL}MV+7ggXg+WJ z-Kh)>2Poa_`pWl%gDbZ9wogVp9R<*z?D zr@`Ka%8Cb+V?JJczhD$`SWf1yqs2X?5;TU~mx`g>cy$Dl_UiAp(xH+s+|J*A@Yz(TvBTWR#jKWii@8CWk)Wq*yS zPkvbl4=d&(<<&~ls4Ry|erP8_4GsetAPaYt@GwxcjEo-FL2yTu{BqY`%V77iofTDS zUG!B;Ig&!#vc`|LV?Ss^lK&SHY=s`Ss+HCnBeS|uKlG5vK}DzP4h29pR*_)>6S+Uz|X@M|$$`>;|m zv{gk>=aJ_}S1x31TjYGbQr^20dKsG97C>p2y(cGL1yVAhXkdwn zSNYnPJ%pxkcdrc$J3gsLDiGFs6s75kVF&x*! zOV~$srFHka@*trH2X$ezy`1ekP0?62_q$%a4H>W)W_Qqmwz;`^JM8me&=T71>dThp z>6V<-P^oHSU>5xV>B0TRBucvY zE-)Pw3(w`J+uCj?_-&!ZfH6%bvdJT2UUKm~TYVA1g)o~c`V{8Ma4T=+yMJb;kMRv_ z%M)9?NRM(I%{x8jvFG*@FY;a0ts)OUGLGOb)ZCbiqhw<{`e$7M$tuMus`kVE(=(81 zVg1W5M=RNEN8_@f2>+COK*Jv&@b_livKw{5Z(_fH?hq&R@bw#&S>i0Q9?_>MBu3wu zG09^gs-Z3#Wow^MYf`=FA{!7ITHx&LEF~`=+lC1{u}o3%fipl2W)$syJFJ7gqvBft zFM3R5%Y>zv0qaY2XtAMV3TwJ2vtr!{U?>YNOZiuN8BAXU-WSV^?oqlcN_-UpCb+s2 zqPlj0)sybR6i38l1kREx9*)kw02~QbFy)-})rcv*vt9#=c2mMZrgPs{Tr|SM0dlWB z3bjF`#+7_3bY@vmAVJ-g2HivbI<3ArK-^J(LT$VRK&OKJ!(MfVieS!d1=@zn3-hz} zx%9PP!DoYx)bQsAL;uWS0@+oLv%$@UIFfxkB81MCA3llQ_itXk66=#d$RAAS{Nag> zu2;ISeCA^Oum3`vCcoChJB|@W4dK!ignKy}@db!AR{XMWy{LKR4BI^dGb@HrgevLnPZ+zfa* zIUMhLepD_cGt_s~Uwlu=jRf(SU*t?aeb|=>+!Jf1qurWY3IogUM|a&x5?f>M=wy~5 z^%^n{E^F^07Xzc3q&k0Ex#?9T8*xXCM*Q=h`XMBh@IgPm<4w~ZZBQO`Y5U3>)r-f! zeUYDE#;f(psEVpQqXA9rK#Lj`t!dXj&y*pjBsxN}CNXlZMUBjfaP+$%UF{hr*a&!(W9qGqy&kC*1A?1*6}<%1HGz3J&H5Hqc8uhCSamH2*oUqJ7P8UueEzPA}542$cgy zN};r=-FPMJ4O;H*J!=~q4LjDA_=&BuRdvbvIJj+jhTeAge{ zK4Oi%c{YmDV$pJ$nDK%N;9>!#g|{EfHM9{X4m>QCS_9GC?DoONc?^f>&#Cp6t&f!r zo~(W?+}1EmBZf_sR+`&b?u%cw2$F(vEybwHd;LCz0Bi?*86e5ddlVkm^u*cMI`-@h zi+ml1)Tmx&JW?J%HYy&S*RuONGRha;GJLOd7>d1pc3xezJh0UfDsUL_YJbAwD6t1$0^bDAkN*}N zA{MVpWx$p@wl0yt8U~m}%HPbFa4Ann_ck`o=}7|`jsgqU*PVPE%(fkKEgJ?2V${3- zrGEU#mF;2ZYijq5MUg3ZxnwEz)B^$WASyQoHISEQfkR@uaWjsx4X5)jhUYw0Vir0j z1*zd*bghMcNTC3WK+H#Q7~RD#(4TZq3^41c-=TV$D8(UT!8ib`#AC(01xVS+k4c?% zD16ok%g^qxDxXoBq!G`OzGI*0)*bQ=OBKAaZ7-iipNeU3QRQr`dX{pD1+FTEd}_=sJ+ue~M> z$z)4INj)UJ^4`lIMkIQ4q0b(2*OFq@9{=AmfUFtXyZH~TSd^ro0=czS@YZ4Mg`#8H zm0v@g%wCipI}3gRO({`wHm&w)1Z1Jk9_E-?%?ktsO$Gbm4=XTM^I`w8!O}ry6;Kzs za&@1N2XEhY`E#g#nmXA{)f^QFfZEXK9l!lGRhDrNzLj=T6uXR!jFPq%16jP4hvbu3g)rHD#PI4BfkT&w2UcF7I^1V-^U=QMQFi5veIg z!VZrhdLaQi(P?i>YQj--aPWL&dQarRxtluv{+IXxm#2IvJ@nd}iq2r4nE%2#Ar`8!{YB7B0(-P2Qh?#R*mwCw*R z5LXH?7JufpZ&3tDKZ!W^fE9VMS4Jo#uTMtk!~BUQhY0*!S>G+uP-erlvp|$B%|scM zF3BM;U$gx{*XBO+Cwyx%t;1zp^@MjYv1|K`k0_l*7;%0EG$&S8e?OKqvNvb^KP~_q zHOl;H2%7g(eLwo7&;fPf0tBL&M@NwZK-s`%-)>&pv>u2~By`*jAN9yI%F0Rn$`~g~ z^=o9nLaeJbR=D>YSlPpi2|F#?lPav>@SkzjhBx7-)5GW|qOd#ozf9<`_H}!)!0d(} zHXO@G@?K1l3Bfb#^uq&L#NaewB%(uj9IFj+xE|h3xI9Z0r>3v!q^#kZ`^>x+X!*~B z=BLNUfqf0ycfny%dd#$x&Hzcq@LghbL~&6CNHYKUS4$WOBvD|2SpGOyN9^?DN9oMn zS7{)UbapdHb#&K*dSWx}AQ{T#eYkNYbGgyjS37}ol9h}<-1(m7vek$R_Jtm&-Stq} zQw`+$I<0zRge06X40KVt_qoA_o&Q*IG*}-wGz6)aH9J1$d7N=kEe-@NM%tpHqPyGM zH6p~KYb+~eWKetHK7Y^Y-pHFg_(~JOkOi6#10judjdj@WDPGY&9mdE;1@3RIqyvKJ zR|(&CK`r9xOI||h?XjajIcFCA$ZdpRNE_i$Nm5Yz{MT=SU~kZlC(p(ACB$s-8WL$U5c8?Wt$_x3^$X)wI6%IG&Ypl&Vh2~Dj%Ue$E9@=iwOLY|y}ekioLn?xGm59ROn(1<2xDh$bs~+zc8~#yVWyE+V?J;{ z|2o#c$Q|P+zo|Orls@hzv!bOF`3sa_FM)jJ&AWG^nMMyiJ?}cQbZe*=Vo#Lm$z5|P z)ETL`U!xaZBT7h$DT@0>Tk1s@@iDe_Nn0OgBY)agLwp;YVhrE7Gy5gPM^4sBk`6{V za+;q9XRb@8B-+^;1fExMfA@fjI%dw@SEFHrcr;A>iv#_f5j?yln(mha3z;fib04_d zV{ljL%e93r3^tyR=>6d9VQOl+v%M{fc^9}ps-7)SMFQDQ$wISRPvr*Y+**W{CYoJy zAGMAR376NPuiG&EXhL$U%h7%gsZOm!`dY5~a}IUE$K8Imw~ZQE{R{rWs*(yq>= zipuT*#l}6~urua~st;ejZS00Zy_Lb3Gux_dsV0N@?<{sqlQ2iT9NC<7hKnARYS#`0Ee))5}d3S%QmD7W)vX1cUm*nI zjnUD<^_MelzLit&yMl2(SwS#8OUUQ{%i~;RS%3L;0ZUb+DQosgIE#@?o4H#`e!#ktD2{s7EB3? zFI5u-V-{v~+U|Wj6y|5o%UQ6qHS*upJy7m$IJ*_%xn}YA@T1CyGV6~HZ=Z$Nc)v#Q z?k-3~*N0vpx3F~=bDnaFi3@mg%eIkacd}f^5%P)pR0#{};$X4YbiZq)o%TqfZfKMQ z^mYf=Y>LtF!=q$71eZnRM-~jP>EP4vletY(e^Yw7c-=JdcAr&WpEl)SYa+#zx^ChN zwYWXZt|@A(^E?PM?%Kl#*G`o&?cb7}Nji%hPT@qWK>^LDJ*dp{*T=UA%b zdyCAA159XSoQ)0sR!9ZzQsFsFaVEXDM2;9($9-+CXMImtQJhYJz{s!G4 zQ`}-ganttMIO?M{s#%)e$4JEOs~#!Y&EgV4BlREWxJf4VPi60tmK#Ush@cmQ>F>wC z+VnyOo_)m>OX-nj%yEjIE1QhWvIYeNvLCGWPn)WwT0eYwxqcPvCw$MJ$;}kYJDJ=( znw^@;oE(5-ptpRc7H7HLfW<@478)>N&^x(zWA+*h@Em5GPVKd47_M|IVCd9uLC$WGLZY|kvZ9pTavdX zD(4=z`tT?iUqGI6i9^3R4cRy9>Q^KlCe=J%=p3gh)689RcWYKEgVJ(srlN_V4lRy3 zdG%*BxfY=_%(^!J_e1gpxwJ!xda@~uv^C#&?$EV;iWS{+w%lZI&{Pp9QxlVv3ZYrI zt8YOYq#`Gw6<$h6F_(l-OAU%z51cd?Ns#Iz2T?oy&_gc7FU`9j-0fw^uX{_X@%)J` zE5cuWumLL)d=xSxH%`ZfN@q~K|?LOyb>3f!p_ z$)xdaF83<#7YbAxJa=waptRhX5Y|NzAe6KtO zSo}#Qx|7ab#`~!o6X)A#XT4bor|;s5gOZUGe2{<7$l~)GP!4-9WLvw$*maJ3?;I$k zeL53M$vlx-92Z`~dFWIx>>RD_u5R61O18<@yxweo4Euc{`L$^n?sxRW@*@zi3d;@f zj^+!OGt{;?{WR9zz>jK6Uz9!2*fL4I-L6AL^ z2WjU+C$qc3nRg}$i&8xW_b6*m?E-riP)EW5IUv>4z}wLkCUFltbziwH8u{^XrEe!V zz34O@SLr05svPs7Fg>*KhrYV+A1RH4x&w)*xdYu1Z#H5dWWyB!P{;m6NCOF30Pf zt%byjjLGXPsGM&n-G@pN*(6Z0N%hM)Iv>_ZRJu3}N=}7A0p{*DRP+eL-qDLrbpSnq zUIl9P5cWBdM7F_GYd!Ketk?gzP5>}FU)8BRG?U*kMup;o^aIOky$Lb7`tGTFV>2}} zHujMUR!&`2;7yKy-oq`5+P8h8V$0(T=ia!)3m9ov2NZgO{h~}#NI#kDK$1_)1ng@0 zW?go2Ypt62qI^ys7@Gv%{~cy}CcqP|EAG=K#T%lf{w!y$WxQabh4Q(CadKdOL;WUl zcgnrzK;>d$cs?Vl&senwBdz0QtwmGN(V-Fy5+z4 z&WbEN&`!5$w)DHP;9IoR`tjl~^uj6ek~UUu1pWBCKMY2x zp}XLCVnTH*O`r`mHdLGRSEkQDS%`_3iaR6td`$i-3F@61jp}mI>4#*FH_FFBVrK3W zPnJ(U4!JlUDb&Pny(Rh=1^yk_!rmPVv!JpAGb{k0-GE-WPx3%}$Vj`+SQuz9fmjw) zR{Q~;srQZy^2mgtXJ^|oVUh{_@}YtS0APEa<|lG!L;s7{nIgwXVOSptX$S;SjqJfOw;82EL4** z=~lbndnMQ-oe><(8!+(|Nw1Cb^lPvoxf`VYneTv$pDqgW4*T9Q3m@Y9XddYFZZ&G= z4e|L)>h5$C3oEBPa_8e-4v&HW`xyaJkCMGx1pt_I7?9!$gh{WwvD~2(1$GKrVt;Z# zO-vxMi^C8+;wXe!0`*7lhq_*Tf6T~1GXpZdR0HF_Y*nwfWagq2Y7v}?xZ+4qGwJpm z!YujC6TNU3tBb@(vW?vA;Y>Pbzolm9Dq5T{IM3V)MWt7mDu4h1t{^c3d=IchN zlQtu5R(nevvT#0mn8fT+1+~_K-V|wCP9{PPUD9&2_B*yHk1E@GcRN5gMs}!ErR#4r zl5uvSdfC)VN61^ryA7S7>b0}UE z7V`7(*u$loHK&Y8K(=tRzoqwftgz`b0Cj!c6jR!oKUmZyg=?v(npa(^y4xE7Yk#t) zIK|~&JV|Cft-&WML+~xeUd4*bJ6Q+&Z+`Sv_PB8}5cJe-S^MJ4&$ZZuKm(U)5v5Dc zV}XGt`sx-8t%!M3Zn4NUj7bLz#^f_Gd3gpKI z7LE-sq0P5Ql9Z|^@Kj*n&%c3c(hb}rtmV@c=fc&Xw2@156>2DYZu_ zt}<@*feD9Zo{??Im98Y3-Ds2cgYD8GXYY<}PN0MJNC;mK1gOfCY&3$$o7zK`_0^1< z0xbuuk`DqT6Dn>4kk=t(g-N;GwTB`i-qG{L1!o4m4Xbd3bVwHJxoF+~VYDe%4YbHq zw)>JPQ$Qkp4R5{w`=R~MmQJ=Z;upb<u40874MJR0k?}Ji2J+`XJB5jUIuC9d1`P*k z-g%{|%`l}#*+9Zoo(T8cC*!CAW@F)t%rd7IY_ueR)#0_+?)xwjHN^viVgXg|cWJW# z=>u-tchEw8h67Sh6%E%p(IT_cZc=e$Hdv(N#~umS1}Do6pL|S}x8mx%>qsD(Ut4`D zD0^@*S!Q8KqI_CBSUl_Gxg(NC8t5W;N;4i>{4?Zds|rpN`*ZtBNhNWxUL3(wXUZ)3 zA|MUXQjpS)zY7aVQkO51Iq!p?ra2Y}w8dWD}dxH~j zb|z%y9Px&nMgql?nb=RZT;Ib$$ocB{0Eg+?i}tS7wLEccd&Dh)y|TYlS=-tfc%)+9 zC$Vh$X>sbieH{r`Oy|bql9%5^k-uk(9CxZ(Oek*_CrW`{SD~0$v&Th_PU)F{JmqG+ zl_q2WooQnK-(W=M=Cx|;`sVdOIV}dcfp&5=6RP*xLV8ov(lVXHs<{<`L&{qj7^BM# z=%x(m>~jGhZgH^%zNs^7u$BDrnl!KQId^LATy?#Ke0_JbanUiG&KrhbE=EmW?CAC4 z63QOSbEceia?Z=-kQ0SWKQpPjn9@X~6vd3&#V%_)ZJ~ppt_xUtpIj0YAaxB54Ouy& zJX%Us(KK99DVb$9wF2%E9Q$9dA!-nkVdPr1=d3*Yf?x*be+peww7z{L4KU;cDWt}E zQhHnjdM9?wxf>~eg<$R2?jdkxS*-g6`mV;6;_%_}6_Hi@JXNmXFzY>u&Euql=a|bI ziZ?K+%Cx3)*T<~fYZI|2V9G_F>sf_)tvT43isO9%0D@Uq@t-=DJdZaIgV=A=yVrV_ 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 Q^xxm<=@`L_wI9FyA1z*jbN~PV literal 0 HcmV?d00001 diff --git a/src/GravyIrc/EventHandlers.cs b/src/GravyIrc/EventHandlers.cs index 506c64e..f289bd7 100644 --- a/src/GravyIrc/EventHandlers.cs +++ b/src/GravyIrc/EventHandlers.cs @@ -3,10 +3,10 @@ namespace GravyIrc { - public delegate void IrcRawDataHandler(Client client, string rawData); - public delegate void ParsedIrcMessageHandler(Client client, ParsedIrcMessage ircMessage); + public delegate void IrcRawDataHandler(IrcClient client, string rawData); + public delegate void ParsedIrcMessageHandler(IrcClient client, ParsedIrcMessage ircMessage); - public delegate void IrcMessageEventHandler(Client client, IrcMessageEventArgs e) where T : IrcMessage; + public delegate void IrcMessageEventHandler(IrcClient client, IrcMessageEventArgs e) where T : IrcMessage; public class IrcMessageEventArgs : EventArgs where T : IrcMessage { diff --git a/src/GravyIrc/EventHub.cs b/src/GravyIrc/EventHub.cs index 98f29f2..1c8343c 100644 --- a/src/GravyIrc/EventHub.cs +++ b/src/GravyIrc/EventHub.cs @@ -10,10 +10,10 @@ namespace GravyIrc /// public class EventHub { - private readonly Client client; + private readonly IrcClient client; private readonly Dictionary eventHandlers = new Dictionary(); - internal EventHub(Client client) + internal EventHub(IrcClient client) { this.client = client; } @@ -99,9 +99,9 @@ public void Trigger(IServerMessage message) private class ServerMessageEventHandler where TMessage : IrcMessage, IServerMessage { - private readonly Client client; + private readonly IrcClient client; - internal ServerMessageEventHandler(Client client) + internal ServerMessageEventHandler(IrcClient client) { this.client = client; } diff --git a/src/GravyIrc/GravyIrc.csproj b/src/GravyIrc/GravyIrc.csproj index 5d7c57b..988d19e 100644 --- a/src/GravyIrc/GravyIrc.csproj +++ b/src/GravyIrc/GravyIrc.csproj @@ -1,7 +1,7 @@  - IRC client library for .NET Standard 2.0. Forked from NetIRC. + IRC client library for .NET Standard 2.0. Forked from NetIRC and beefed up a little. 0.1.1 Alex Griffith @@ -15,10 +15,18 @@ full portable True - 0.1.0-alpha2 + 1.0.0 GravyIrc - Initial release; testing travis deploy + Initial release true + logo.png + + + True + + + + diff --git a/src/GravyIrc/Client.cs b/src/GravyIrc/IrcClient.cs similarity index 90% rename from src/GravyIrc/Client.cs rename to src/GravyIrc/IrcClient.cs index 6cf1b22..c40aefc 100644 --- a/src/GravyIrc/Client.cs +++ b/src/GravyIrc/IrcClient.cs @@ -9,7 +9,7 @@ namespace GravyIrc /// /// The NetIRC IRC client /// - public class Client : IDisposable + public class IrcClient : IDisposable { private readonly IConnection connection; @@ -57,7 +57,7 @@ public class Client : IDisposable /// /// User who wishes to connect to the server /// IConnection implementation - public Client(User user, IConnection connection) + public IrcClient(User user, IConnection connection) { User = user; @@ -72,7 +72,7 @@ public Client(User user, IConnection connection) InitializeDefaultEventHubEvents(); } - public Client(User user, string password, IConnection connection) + public IrcClient(User user, string password, IConnection connection) : this(user, connection) { this.password = password; @@ -90,13 +90,13 @@ private void InitializeDefaultEventHubEvents() EventHub.Subscribe(EventHub_Nick); } - private void EventHub_Nick(Client client, IrcMessageEventArgs e) + private void EventHub_Nick(IrcClient client, IrcMessageEventArgs e) { var user = Peers.GetUser(e.IrcMessage.OldNick); user.Nick = e.IrcMessage.NewNick; } - private void EventHub_PrivMsg(Client client, IrcMessageEventArgs e) + private void EventHub_PrivMsg(IrcClient client, IrcMessageEventArgs e) { var user = Peers.GetUser(e.IrcMessage.From); var message = new ChatMessage(user, e.IrcMessage.Message); @@ -113,7 +113,7 @@ private void EventHub_PrivMsg(Client client, IrcMessageEventArgs } } - private void EventHub_RplNamReply(Client client, IrcMessageEventArgs e) + private void EventHub_RplNamReply(IrcClient client, IrcMessageEventArgs e) { var channel = Channels.GetChannel(e.IrcMessage.Channel); foreach (var nick in e.IrcMessage.Nicks) @@ -126,7 +126,7 @@ private void EventHub_RplNamReply(Client client, IrcMessageEventArgs e) + private void EventHub_Quit(IrcClient client, IrcMessageEventArgs e) { foreach (var channel in Channels) { @@ -134,7 +134,7 @@ private void EventHub_Quit(Client client, IrcMessageEventArgs e) } } - private void EventHub_Kick(Client client, IrcMessageEventArgs e) + private void EventHub_Kick(IrcClient client, IrcMessageEventArgs e) { var channel = Channels.FirstOrDefault(c => c.Name == e.IrcMessage.Channel); if (channel != null) @@ -150,13 +150,13 @@ private void EventHub_Kick(Client client, IrcMessageEventArgs e) } } - private void EventHub_Part(Client client, IrcMessageEventArgs e) + private void EventHub_Part(IrcClient client, IrcMessageEventArgs e) { var channel = Channels.GetChannel(e.IrcMessage.Channel); channel.RemoveUser(e.IrcMessage.Nick); } - private void EventHub_Join(Client client, IrcMessageEventArgs e) + private void EventHub_Join(IrcClient client, IrcMessageEventArgs e) { var channel = Channels.GetChannel(e.IrcMessage.Channel); if (e.IrcMessage.Nick != User.Nick) diff --git a/tests/GravyIrc.Tests/ClientTests.cs b/tests/GravyIrc.Tests/ClientTests.cs index b12ce3e..d61d9a6 100644 --- a/tests/GravyIrc.Tests/ClientTests.cs +++ b/tests/GravyIrc.Tests/ClientTests.cs @@ -11,12 +11,12 @@ public class ClientTests { private static User FakeUser = new User("test", "test"); private readonly Mock mockConnection; - private readonly Client client; + private readonly IrcClient client; public ClientTests() { mockConnection = new Mock(); - client = new Client(FakeUser, mockConnection.Object); + client = new IrcClient(FakeUser, mockConnection.Object); } [Fact] @@ -99,7 +99,7 @@ public async Task SendsNickAndUserWhenConnected() var nick = "guest"; var realName = "Ronnie Reagan"; var user = new User(nick, realName); - var client = new Client(user, mockConnection.Object); + var client = new IrcClient(user, mockConnection.Object); await Task.Run(() => client.ConnectAsync("localhost", 6667)); @@ -114,7 +114,7 @@ public async Task SendsPassNickAndUserWhenConnected() var nick = "guest"; var realName = "Ronnie Reagan"; var user = new User(nick, realName); - var client = new Client(user, password, mockConnection.Object); + var client = new IrcClient(user, password, mockConnection.Object); await Task.Run(() => client.ConnectAsync("localhost", 6667)); @@ -644,7 +644,7 @@ public void NickTriggersOnPropertyChangedOnUser() Assert.Equal("Nick", propertyName); } - private void RaiseDataReceived(Mock mockConnection, Client client, string raw) + private void RaiseDataReceived(Mock mockConnection, IrcClient client, string raw) { mockConnection.Raise(c => c.DataReceived += null, client, new DataReceivedEventArgs(raw)); }