From 931784ed7fe125e2983137393619972c2c1034a0 Mon Sep 17 00:00:00 2001 From: Claire Strodtbeck Date: Sun, 14 Jun 2020 17:29:27 -0700 Subject: [PATCH] Created an ApiResult function for API calls. Need to finish GetRooms in session manager. --- MatrixDotNetLib/.vs/MatrixDotNetLib/v16/.suo | Bin 43520 -> 45568 bytes MatrixDotNetLib/MatrixDotNetCmd/Program.cs | 93 ++++- ...rixDotNetCmd.csprojAssemblyReference.cache | Bin 5608 -> 110069 bytes MatrixDotNetLib/MatrixDotNetLib/MatrixApis.cs | 360 +++++++++++++----- .../MatrixDotNetLib/MatrixLoginRequest.cs | 2 +- .../MatrixDotNetLib/MatrixSessionManager.cs | 169 +++++++- .../MatrixDotNetLib/MatrixUserRooms.cs | 16 + MatrixDotNetLib/MatrixDotNetLib/MatrixUtil.cs | 25 ++ .../Debug/netcoreapp3.1/MatrixDotNetLib.dll | Bin 18432 -> 18432 bytes .../Debug/netcoreapp3.1/MatrixDotNetLib.pdb | Bin 3364 -> 3464 bytes ...rixDotNetLib.csprojAssemblyReference.cache | Bin 104852 -> 104852 bytes .../Debug/netcoreapp3.1/MatrixDotNetLib.dll | Bin 18432 -> 18432 bytes .../Debug/netcoreapp3.1/MatrixDotNetLib.pdb | Bin 3364 -> 3464 bytes Scripts/URL entity parser.linq | 78 ++++ 14 files changed, 627 insertions(+), 116 deletions(-) create mode 100644 MatrixDotNetLib/MatrixDotNetLib/MatrixUserRooms.cs create mode 100644 MatrixDotNetLib/MatrixDotNetLib/MatrixUtil.cs create mode 100644 Scripts/URL entity parser.linq diff --git a/MatrixDotNetLib/.vs/MatrixDotNetLib/v16/.suo b/MatrixDotNetLib/.vs/MatrixDotNetLib/v16/.suo index a503216a2e1a89e842eae85409299a2df5574515..aab20682ee99979aa97755e85edfd12b86efaf21 100644 GIT binary patch delta 3806 zcmcgve^6A{6@GVJmX$2H%a3J&1(sC-0TB#FOo={p!(c^0ei+h31eFSn0%3O@B~Ez~ zlGw;Z@;;N86pcVe$V?^{o^9GRO&76^ZPKAL$>g6p9nXPO`&2$MDStE#7Nwh{NU=+jmqhO0o}Zs*?J_)W&7WvKB~;7d zIM3kGe|%d0vB>6;d(mU*5$|Kp)Enid{wp}X?1|V5B;8)l1P<0`dE zdw~$&N6>LvwO67tu0U83jGGtR5L|Iu^#sIu1XuNnA_d0s}RVlv9U*4 z!G)E!t)ysXMp98%1;m5;YTweUjhGs%E#qLTRWpoYSDFEFK&dVcqOJ?4?rna zRG$lWpBZjvAdzin6PN{@)ZF4VXQ|D|WnJ+XUjUCLUxB@{)S5xFjC~NOt-&=*5oT+v zFB`6 z9XOwtE=n-9bEDeiLUTe1uEm#)l$z8GFJ8-ZV{^gNxVE`S4C$O1x!*K0Zdy9H@_!Lr z%$6%64Z*x!Og)i`xx6~7XQ4+^5ZrcJE%3sdm~G{}Fx;iPMs=E_II7D~?o7~$;Bh88 zn1-x15YM9`nd>r60oHS5m}(wE7J;M14<%F2AW{y=Japi3jJc{^v4S&{GtrpCBxocO?9fx(c$D;4Bg~4=_9h{&em#D>H;&pEG}h-Xm&t%2 zn6bS+&Gq`N$~QL51TOEZTfKE`d%~6Rmri}jvi44+PaxDFYx1KZfg+PxZAuLP)8yv; zB5DPjfp|C>N>iecaMHV0jaUAU95mnjJ9+BjrTZXzE$aS6ho4TgfxwRCb~z^YCRq8Z zT%fcyc|B4Kas3cw28WP;o{hrOzSzHe3qt!p6?-t)J|RXh)P6F{PbuQp(}|LSlBI>} z7Bay}R!FJkNAJNsDE21d@&Sk1Dy#MKLU&g*l3_N^kKOwnIT^EW{O+o>d-c{2*G#;5 zTsdnOUdU#sBr)T4JA+>mZ3cMCv@MuI~lh?2NYfyE;4ktr+gg zr!U8_(u0eEKby^x?~bCTJ2^RNXG@^F{a97!q4tj2*2jab{y^aYe>Enak?l(Fx$6jV&P98ShDJq9_<*!i4e#WL7+s`Y4f&-hjC3cUC=eaH zXoj&b*7m)t$uEb5_SZg#aHNns!o?HfUyB`DY=4uWkCc;z-@`7|0((gj9(Y>LS;61m(G0nh=etu_Stsrk?9nTle6_);vvV zRZI~E)e1d0+vsPefxd(F;M`|svzQN*StI5ooarxRd*m&bh-X_d&(cRX$I~LAux|!y z{V(EFV4WVm7RYBpqw+a1`D(Ta+2_B7=HXne?b11c!7~+Fh59xLeI?{}4=AQf^WZx3 zz#8Hg)3UuB)ax#whGg~Czw9XXT6rUXb#5oxDg4+pn_ z4A+ujKgG0)V;cK4&GN4_9KRU;-R4ii|1lveoRKJ!>F@?j3!R{M=Z0%BF&D9KX->*Z z^H5vcHzOQJ^c}gfhfYwvf#`QZtdd!y7k8+FTK?4H|6uVk`7Pj=4&NO597?)!C(!)@ zC1?B68X_-3?cx`KmN{^8C=<0~8Cu5KW?>?N$!-M~hZH>vJ?ER5Bxt)-%J~M>`yIrL zIVq*C!aMeR<_#*;R6Thxf)m;e)oi*eQ`Qe3Ma@_|+Fo#C5?)Pq3xURjEm~+?7WCR4 HB)I<#=oS3j delta 3236 zcma)83rt(r89wJ?8wak90b^|N5&}3egc3t&6G$4FM|h;fHaH2+LbN=f4NWov*a^Xj zeCZOp6{IHjPuGIdC~>N-Ri>ulPEob2tMi(wsw>r6O?!)0lU7Y?*Gix*)f)Ey*Y+^Y zChbVyz5n^oIo~<|>)b2-MUXxc&bq$ElFh`}N|Xh}gN20!Qgf)+zI|@*oUA)+WZSg+ zKB@l=FQb7+U_>{<6_^(y+CuE-!HKl6VGl|VmeDw4*}ygV+Epkmz^J&oCzm8_*2J4+ zT1oGs6kR9E?TAu@4zV0TXVf6{2nV7Bu>w(yp!L)$P=;6a0c|}BE%2o#-?kN{HiRGX z1j3HkhOpphuC^7W2j@BzSvYKr-M0nEwl%1eR>6oc!Y9!-kAXdg8ZCmhfR6R0S|X_? zYa@*)btkN)VQN{Z`#LTzkQ1pHQAaYJo~WFNe1ru-%S8mS(%j6%I|twC2=b6Qp(73h z$~Hs+8r!HXGvuLMo)}*ZuW8oiZNc6KL@lBYu@SKeKGT#eqxH?$^I%X{7`!O?5FH2; zYHrHnVetZXUPfF*z;MQ-J8vMaBc_#8;zn*I^)uN09^y3O41#oE&1hFnizoTH zy+yLI6Q+6OkK3q`fME3uG@7a)xaBMtfVbp>-5E5~F(~WkO`a}8z$?xTplLC~7tMA>EYons ztW~PBO37LB z@;hp%=9c?JVx;0tGDC31gxpjNuQ=?m*?xnMD)aVC9<3Cnt&JS+*d7PTCZ)>qh#O*? zYcT#^11FZMRJOTlFKwkgi^?02?OmJ9ujny;Wq*`MHwe*9f?N>f76=vi^{J-IyEX97 zijzDSLWN$DZkJRS@En*g^y}$TT0DE5#9vnrEEhM4bWb^!47)$lQyDMLFY&?MHW$p* zOWX#b1V$2(9soMF~|>4RdW0&xVleeYhi3@hk{E;is!YOX;JB`|H9y z4MH^$aCc%nYT8B0z2vuoDgk008t#M>kA?v+3vN~Jm!u060NP<`0E!cpGZMoQblv+m{x6g*{tzBWKZ0Su1*UWJ=M#|zZ@aJ4?Km?X}caUtMT*G+1`O^{4orj)o7*uD_mj_0u;? zIvfqSn5CR$_XMU<4ps`eXo{6s()-vjYhwM#ydR4F#c00C*v|Uce%2kIk6-Y> za`Wux@xPCRPJO}80*@%X^D?IyFo3?e8CV1Eon{;;gy#d=;qA$F7vvVQh7#R&SliXi;d4n72%ca_U0cgo#n_}eavBAt}b z$etAPo)~`~c-IlmX%Y9p7hTu+6#T1eH1{ylJ%v_$mp#cyKF)}4kI2HTnXO~>>`~SX z3*j!XbbkQDdn@2r_tvzHtR4osJCxy5Zmzf@KD^8i>fy_v6)wG)4)48S%b=T{5?{yQ zy{X&KerSfj3;SR)eW-WvSnuEvtUR=a-$l&}+TOvz{z2-)?@s?v6T%6J&ONwsLw``uDEyyi%t@Y+?!YtzCF}Tl;3vx9jlK+F#}M>SwORyqgdX-7CAE6=Z#c_j zj2p0pyoU#Gg5Wb55>b`Ui67S9wsFA5OEf{=Nr1r6depq zH5V-&dvTXVL($awaWA|&VpeuO+r;@LEK>*h02;#%7yxT}V1_;s464R!uuPS+0No@&7QqHeL(TQ3>2(C*rp + /// Gets or sets login session token + /// + public string Token { get; set; } + + /// + /// Gets or sets server FQDN + /// + public string Server { get; set; } + + /// + /// Gets or sets the login session as an object + /// + public MatrixLoginResponse Session { get; set; } + } } diff --git a/MatrixDotNetLib/MatrixDotNetCmd/obj/Debug/netcoreapp3.1/MatrixDotNetCmd.csprojAssemblyReference.cache b/MatrixDotNetLib/MatrixDotNetCmd/obj/Debug/netcoreapp3.1/MatrixDotNetCmd.csprojAssemblyReference.cache index a87cc1607bb1049f939c8b7913269c2cff2fca8f..be0080256dd77e3e7148d2f46eee126fc19540aa 100644 GIT binary patch literal 110069 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 Y9fztc;8j3AoqFoKK|YZ|xs%`izimI?c>n+a delta 1206 zcmZvbPfQa*6vlTp-G!L~ON*`lDkg#ktt@RojcEJ>nuwMn;K`UEl9n_nZPP9)C*)w_ zNhM>_n0QfvlNe%*9*k$b=mkv_4|*~l=+T3x`o5NROV%%$FS~DM-*4Z0yT8Bbzrrg+ zOiikCm<{MmQ53ySt_4$DnsvIyJ+CLzU}1T0At+l10#Y4$Gx&D;^6fvym-@;Xj)MZ` zCDR+o#PuFCVs=NmqemHUM6`*_YsSxB>d)pAr*k>opn#&`Svfw?DML@^Rh7w8$@^W+ z6f*|Lt$ga{nXDC0Sh3VK!F?3veliGLHcRFym8CIxL0d1E%g2k+i>#v0!+hIFkJIQ=_d&twM$n;Wdp8+JKGH_7_xV35s zDe~cy5f5^rjMwYKY?Y0L=vJl0^j+jlqca67F=dWSXROpzLhx1!^4(;%Dy6U=R6~gt zqU<|epePW9sC0J^U21r7hcw}k+GxYSLF&(@(}@WymCY0cZ>J5um&{g`wnoYS(Z0HA z9duknha4JJYuB}3k>-3*-ny&x34VaWJWOV*O88VuSalOjIc6`@3ZJ-7&pEk529H3As`K7eaYn9ofa8icwBrCW22RK z!zMolCmERH=8PDroe^INvO)}#LsG~|fFW&8fQkJ#f!Rqr?hNRCB|~I+=;w>2=Ou9Ep|VHCT^ypqc#< Server = new Dictionary() + + public class Server { - { "discovery", "/.well-known/matrix/client" }, - { "versions", "/_matrix/client/versions" }, - { "capabilities", "/_matrix/client/r0/capabilities" }, - { "whois", "/_matrix/client/r0/admin/whois/{uid}" }, - { "search", "/_matrix/client/r0/search" }, - { "usersearch", "/_matrix/client/r0/user_directory/search" }, - { "roomlist", "/_matrix/client/r0/publicRooms" }, - { "managerooms", "/_matrix/client/r0/directory/list/appservice/{networkId}/{roomId}" }, - { "upgraderoom", "/_matrix/client/r0/rooms/{roomId}/upgrade" }, - { "openid", "/_matrix/client/r0/user/{userId}/openid/request_token" }, - { "voip", "/_matrix/client/r0/voip/turnServer" } - }; - - public static Dictionary Key = new Dictionary() + public static string Discovery = "/.well-known/matrix/client"; + public static string Versions = "/_matrix/client/versions"; + public static string Capabilities = "/_matrix/client/r0/capabilities"; + public static string Whois = "/_matrix/client/r0/admin/whois/{userid}"; + public static string Search = "/_matrix/client/r0/search"; + public static string UserSearch = "/_matrix/client/r0/user_directory/search"; + public static string RoomList = "/_matrix/client/r0/publicrooms"; + public static string ManageRooms = "/_matrix/client/r0/directory/list/appservice/{networkid}/{roomid}"; + public static string UpgradeRoom = "/_matrix/client/r0/rooms/{roomid}/upgrade"; + public static string Openid = "/_matrix/client/r0/user/{userid}/openid/request_token"; + public static string Voip = "/_matrix/client/r0/voip/turnserver"; + } + + public class Key { - { "latest", "/_matrix/client/r0/keys/changes" }, - { "claim", "/_matrix/client/r0/keys/claim" }, - { "download", "/_matrix/client/r0/keys/query" }, - { "upload", "/_matrix/client/r0/keys/upload" } - }; + public static string Latest = "/_matrix/client/r0/keys/changes"; + public static string Claim = "/_matrix/client/r0/keys/claim"; + public static string Download = "/_matrix/client/r0/keys/query"; + public static string Upload = "/_matrix/client/r0/keys/upload"; + } - public static Dictionary Device = new Dictionary() + public class Device { - { "manage", "/_matrix/client/r0/devices" }, - { "multidelete", "/_matrix/client/r0/delete_devices" }, - { "send", "/_matrix/client/r0/sendToDevice/{eventType}/{txnId}" } - }; + public static string Manage = "/_matrix/client/r0/devices"; + public static string MultiDelete = "/_matrix/client/r0/delete_devices"; + public static string Send = "/_matrix/client/r0/sendtodevice/{eventtype}/{txnid}"; + } - public static Dictionary Media = new Dictionary() + public class Media { - { "config", "/_matrix/media/r0/config" }, - { "save", "/_matrix/media/r0/download/{serverName}/{mediaId}" }, - { "saveas", "/_matrix/media/r0/download/{serverName}/{mediaId}/{fileName}" }, - { "preview", "/_matrix/media/r0/preview_url" }, - { "thumb", "/_matrix/media/r0/thumbnail/{serverName}/{mediaId}" }, - { "upload", "/_matrix/media/r0/upload" } - }; - - public static Dictionary Notifier = new Dictionary() + public static string Config = "/_matrix/media/r0/config"; + public static string Save = "/_matrix/media/r0/download/{servername}/{mediaid}"; + public static string Saveas = "/_matrix/media/r0/download/{servername}/{mediaid}/{filename}"; + public static string Preview = "/_matrix/media/r0/preview_url"; + public static string Thumb = "/_matrix/media/r0/thumbnail/{servername}/{mediaid}"; + public static string Upload = "/_matrix/media/r0/upload"; + } + + public class Notifier { - { "notifiers", "/_matrix/client/r0/notifications" }, - { "pushers", "/_matrix/client/r0/pushers" }, - { "set", "/_matrix/client/r0/pushers/set" }, - { "rules", "/_matrix/client/r0/pushrules/" } - }; + public static string Notifiers = "/_matrix/client/r0/notifications"; + public static string Pushers = "/_matrix/client/r0/pushers"; + public static string Set = "/_matrix/client/r0/pushers/set"; + public static string Rules = "/_matrix/client/r0/pushrules/"; + } - public static Dictionary NotifierRule = new Dictionary() + public class NotifierRule { - { "manage", "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}" }, - { "actions", "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/actions" }, - { "toggle", "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/enabled" } - }; + public static string Manage = "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleid}"; + public static string Actions = "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleid}/actions"; + public static string Toggle = "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleid}/enabled"; + } - public static Dictionary User = new Dictionary() + public static class User { - { "thirdparty", "/_matrix/client/r0/account/3pid" }, - { "deactivate", "/_matrix/client/r0/account/deactivate" }, - { "password", "/_matrix/client/r0/account/password" }, - { "register", "/_matrix/client/r0/register" }, - { "whoami", "/_matrix/client/r0/account/whoami" }, - { "profile", "/_matrix/client/r0/profile/{userId}" }, - { "avatar", "/_matrix/client/r0/profile/{userId}/avtatar_url" }, - { "displayname", "/_matrix/client/r0/profile/{userId}/displayname" }, - { "extrainfo", "/_matrix/client/r0/user/{userId}/account_data/{type}" }, - { "eventfilter", "/_matrix/client/r0/user/{userId}/filter" }, - { "rooms", "/_matrix/client/r0/joined_rooms" }, - { "login", "/_matrix/client/r0/login" }, - { "logout", "/_matrix/client/r0/logout" }, - { "status", "/_matrix/client/r0/presence/{userId}/status" } - }; - - public static Dictionary UserRoom = new Dictionary() + public static string Thirdparty = "/_matrix/client/r0/account/3pid"; + public static string Deactivate = "/_matrix/client/r0/account/deactivate"; + public static string Password = "/_matrix/client/r0/account/password"; + public static string Register = "/_matrix/client/r0/register"; + public static string WhoAmI = "/_matrix/client/r0/account/whoami"; + public static string Profile = "/_matrix/client/r0/profile/{userid}"; + public static string Avatar = "/_matrix/client/r0/profile/{userid}/avtatar_url"; + public static string DisplayName = "/_matrix/client/r0/profile/{userid}/displayname"; + public static string ExtraInfo = "/_matrix/client/r0/user/{userid}/account_data/{type}"; + public static string EventFilter = "/_matrix/client/r0/user/{userid}/filter"; + public static string Rooms = "/_matrix/client/r0/joined_rooms"; + public static string Login = "/_matrix/client/r0/login"; + public static string Logout = "/_matrix/client/r0/logout"; + public static string Status = "/_matrix/client/r0/presence/{userid}/status"; + } + + public class UserRoom { - { "extrainfo", "/_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}" }, - { "tags", "/_matrix/client/r0/user/{userId}/rooms/{roomId}/tags" } - }; + public static string Extrainfo = "/_matrix/client/r0/user/{userid}/rooms/{roomid}/account_data/{type}"; + public static string Tags = "/_matrix/client/r0/user/{userid}/rooms/{roomid}/tags"; + } - public static Dictionary Room = new Dictionary() + public class Room { - { "create", "/_matrix/client/r0/createRoom" }, - { "aliases", "/_matrix/client/r0/rooms/{roomId}/aliases" }, - { "active", "/_matrix/client/r0/rooms/{roomId}/joined_members" }, - { "members", "/_matrix/client/r0/rooms/{roomId}/members" }, - { "messages", "/_matrix/client/r0/rooms/{roomId}/messages" }, - { "join", "/_matrix/client/r0/join/{roomIdOrAlias}" }, - { "ban", "/_matrix/client/r0/rooms/{roomId}/ban" }, - { "forget", "/_matrix/client/r0/rooms/{roomId}/forget" }, - { "invite", "/_matrix/client/r0/rooms/{roomId}/invite" }, - { "idjoin", "/_matrix/client/r0/rooms/{roomId}/join" }, - { "kick", "/_matrix/client/r0/rooms/{roomId}/kick" }, - { "leave", "/_matrix/client/r0/rooms/{roomId}/leave" }, - { "unban", "/_matrix/client/r0/rooms/{roomId}/unban" }, - { "marker", "/_matrix/client/r0/rooms/{roomId}/read_markers" } - }; - - public static Dictionary RoomEvent = new Dictionary() + public static string Create = "/_matrix/client/r0/createroom"; + public static string Aliases = "/_matrix/client/unstable/org.matrix.msc2432/rooms/{roomid}/aliases"; + public static string Active = "/_matrix/client/r0/rooms/{roomid}/joined_members"; + public static string Members = "/_matrix/client/r0/rooms/{roomid}/members"; + public static string Messages = "/_matrix/client/r0/rooms/{roomid}/messages"; + public static string Join = "/_matrix/client/r0/join/{roomidoralias}"; + public static string Ban = "/_matrix/client/r0/rooms/{roomid}/ban"; + public static string Forget = "/_matrix/client/r0/rooms/{roomid}/forget"; + public static string Invite = "/_matrix/client/r0/rooms/{roomid}/invite"; + public static string IdJoin = "/_matrix/client/r0/rooms/{roomid}/join"; + public static string Kick = "/_matrix/client/r0/rooms/{roomid}/kick"; + public static string Leave = "/_matrix/client/r0/rooms/{roomid}/leave"; + public static string Unban = "/_matrix/client/r0/rooms/{roomid}/unban"; + public static string Marker = "/_matrix/client/r0/rooms/{roomid}/read_markers"; + } + + public class RoomEvent { - { "context", "/_matrix/client/r0/rooms/{roomId}/context/{eventId}" }, - { "event", "/_matrix/client/r0/rooms/{roomId}/event/{eventId}" }, - { "receipt", "/_matrix/client/r0/rooms/{roomId}/receipt/{receiptType}/{eventId}" }, - { "redact", "/_matrix/client/r0/rooms/{roomId}/redact/{eventId}/{txnId}" }, - { "send", "/_matrix/client/r0/rooms/{roomId}/send/{eventType}/{txnId}" }, - { "typing", "/_matrix/client/r0/rooms/{roomId}/typing/{userId}" }, - { "flag", "/_matrix/client/r0/rooms/{roomId}/report/{eventId}" } - }; - - public static Dictionary RoomState = new Dictionary() + public static string Context = "/_matrix/client/r0/rooms/{roomid}/context/{eventid}"; + public static string Event = "/_matrix/client/r0/rooms/{roomid}/event/{eventid}"; + public static string Receipt = "/_matrix/client/r0/rooms/{roomid}/receipt/{receipttype}/{eventid}"; + public static string Redact = "/_matrix/client/r0/rooms/{roomid}/redact/{eventid}/{txnid}"; + public static string Send = "/_matrix/client/r0/rooms/{roomid}/send/{eventtype}/{txnid}"; + public static string Typing = "/_matrix/client/r0/rooms/{roomid}/typing/{userid}"; + public static string Flag = "/_matrix/client/r0/rooms/{roomid}/report/{eventid}"; + } + + public class RoomState { - { "list", "/_matrix/client/r0/rooms/{roomId}/state" }, - { "state", "/_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey}" } - }; + public static string List = "/_matrix/client/r0/rooms/{roomid}/state"; + public static string State = "/_matrix/client/r0/rooms/{roomid}/state/{eventtype}/{statekey}"; + } } - class HotDamn + public class MatrixApiEntities { - public void testfunc() - { - // the avatar - string Avatar = MatrixApis.User["avatar"]; - } + public string DeviceId { get; set; } + public string EventId { get; set; } + public string EventType { get; set; } + public string FileName { get; set; } + public string FilterId { get; set; } + public string Kind { get; set; } + public string MediaId { get; set; } + public string NetworkId { get; set; } + public string ReceiptType { get; set; } + public string RoomAlias { get; set; } + public string RoomId { get; set; } + public string RoomIdOrAlias { get; set; } + public string RuleId { get; set; } + public string Scope { get; set; } + public string ServerName { get; set; } + public string StateKey { get; set; } + public string Tags { get; set; } + public string TxnId { get; set; } + public string Type { get; set; } + public string UserId { get; set; } } + + //public static Dictionary Server = new Dictionary() + //{ + // { "discovery", "/.well-known/matrix/client" }, + // { "versions", "/_matrix/client/versions" }, + // { "capabilities", "/_matrix/client/r0/capabilities" }, + // { "whois", "/_matrix/client/r0/admin/whois/{userId}" }, + // { "search", "/_matrix/client/r0/search" }, + // { "usersearch", "/_matrix/client/r0/user_directory/search" }, + // { "roomlist", "/_matrix/client/r0/publicRooms" }, + // { "managerooms", "/_matrix/client/r0/directory/list/appservice/{networkId}/{roomId}" }, + // { "upgraderoom", "/_matrix/client/r0/rooms/{roomId}/upgrade" }, + // { "openid", "/_matrix/client/r0/user/{userId}/openid/request_token" }, + // { "voip", "/_matrix/client/r0/voip/turnServer" } + //}; + + //public static Dictionary Key = new Dictionary() + //{ + // { "latest", "/_matrix/client/r0/keys/changes" }, + // { "claim", "/_matrix/client/r0/keys/claim" }, + // { "download", "/_matrix/client/r0/keys/query" }, + // { "upload", "/_matrix/client/r0/keys/upload" } + //}; + + //public static Dictionary Device = new Dictionary() + //{ + // { "manage", "/_matrix/client/r0/devices" }, + // { "multidelete", "/_matrix/client/r0/delete_devices" }, + // { "send", "/_matrix/client/r0/sendToDevice/{eventType}/{txnId}" } + //}; + + //public static Dictionary Media = new Dictionary() + //{ + // { "config", "/_matrix/media/r0/config" }, + // { "save", "/_matrix/media/r0/download/{serverName}/{mediaId}" }, + // { "saveas", "/_matrix/media/r0/download/{serverName}/{mediaId}/{fileName}" }, + // { "preview", "/_matrix/media/r0/preview_url" }, + // { "thumb", "/_matrix/media/r0/thumbnail/{serverName}/{mediaId}" }, + // { "upload", "/_matrix/media/r0/upload" } + //}; + + //public static Dictionary Notifier = new Dictionary() + //{ + // { "notifiers", "/_matrix/client/r0/notifications" }, + // { "pushers", "/_matrix/client/r0/pushers" }, + // { "set", "/_matrix/client/r0/pushers/set" }, + // { "rules", "/_matrix/client/r0/pushrules/" } + //}; + + //public static Dictionary NotifierRule = new Dictionary() + //{ + // { "manage", "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}" }, + // { "actions", "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/actions" }, + // { "toggle", "/_matrix/client/r0/pushrules/{scope}/{kind}/{ruleId}/enabled" } + //}; + + //public static Dictionary User = new Dictionary() + //{ + // { "thirdparty", "/_matrix/client/r0/account/3pid" }, + // { "deactivate", "/_matrix/client/r0/account/deactivate" }, + // { "password", "/_matrix/client/r0/account/password" }, + // { "register", "/_matrix/client/r0/register" }, + // { "whoami", "/_matrix/client/r0/account/whoami" }, + // { "profile", "/_matrix/client/r0/profile/{userId}" }, + // { "avatar", "/_matrix/client/r0/profile/{userId}/avtatar_url" }, + // { "displayname", "/_matrix/client/r0/profile/{userId}/displayname" }, + // { "extrainfo", "/_matrix/client/r0/user/{userId}/account_data/{type}" }, + // { "eventfilter", "/_matrix/client/r0/user/{userId}/filter" }, + // { "rooms", "/_matrix/client/r0/joined_rooms" }, + // { "login", "/_matrix/client/r0/login" }, + // { "logout", "/_matrix/client/r0/logout" }, + // { "status", "/_matrix/client/r0/presence/{userId}/status" } + //}; + + //public static Dictionary UserRoom = new Dictionary() + //{ + // { "extrainfo", "/_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}" }, + // { "tags", "/_matrix/client/r0/user/{userId}/rooms/{roomId}/tags" } + //}; + + //public static Dictionary Room = new Dictionary() + //{ + // { "create", "/_matrix/client/r0/createRoom" }, + // { "aliases", "/_matrix/client/unstable/org.matrix.msc2432/rooms/{roomId}/aliases" }, + // { "active", "/_matrix/client/r0/rooms/{roomId}/joined_members" }, + // { "members", "/_matrix/client/r0/rooms/{roomId}/members" }, + // { "messages", "/_matrix/client/r0/rooms/{roomId}/messages" }, + // { "join", "/_matrix/client/r0/join/{roomIdOrAlias}" }, + // { "ban", "/_matrix/client/r0/rooms/{roomId}/ban" }, + // { "forget", "/_matrix/client/r0/rooms/{roomId}/forget" }, + // { "invite", "/_matrix/client/r0/rooms/{roomId}/invite" }, + // { "idjoin", "/_matrix/client/r0/rooms/{roomId}/join" }, + // { "kick", "/_matrix/client/r0/rooms/{roomId}/kick" }, + // { "leave", "/_matrix/client/r0/rooms/{roomId}/leave" }, + // { "unban", "/_matrix/client/r0/rooms/{roomId}/unban" }, + // { "marker", "/_matrix/client/r0/rooms/{roomId}/read_markers" } + //}; + + //public static Dictionary RoomEvent = new Dictionary() + //{ + // { "context", "/_matrix/client/r0/rooms/{roomId}/context/{eventId}" }, + // { "event", "/_matrix/client/r0/rooms/{roomId}/event/{eventId}" }, + // { "receipt", "/_matrix/client/r0/rooms/{roomId}/receipt/{receiptType}/{eventId}" }, + // { "redact", "/_matrix/client/r0/rooms/{roomId}/redact/{eventId}/{txnId}" }, + // { "send", "/_matrix/client/r0/rooms/{roomId}/send/{eventType}/{txnId}" }, + // { "typing", "/_matrix/client/r0/rooms/{roomId}/typing/{userId}" }, + // { "flag", "/_matrix/client/r0/rooms/{roomId}/report/{eventId}" } + //}; + + //public static Dictionary RoomState = new Dictionary() + //{ + // { "list", "/_matrix/client/r0/rooms/{roomId}/state" }, + // { "state", "/_matrix/client/r0/rooms/{roomId}/state/{eventType}/{stateKey}" } + //}; + + //public Dictionary Entities = new Dictionary() + //{ + // { "deviceId", "" }, + // { "eventId", "" }, + // { "eventType", "" }, + // { "fileName", "" }, + // { "filterId", "" }, + // { "kind", "" }, + // { "mediaId", "" }, + // { "networkId", "" }, + // { "receiptType", "" }, + // { "roomAlias", "" }, + // { "roomId", "" }, + // { "roomIdOrAlias", "" }, + // { "ruleId", "" }, + // { "scope", "" }, + // { "serverName", "" }, + // { "stateKey", "" }, + // { "tags", "" }, + // { "txnId", "" }, + // { "type", "" }, + // { "userId", "" } + //}; } diff --git a/MatrixDotNetLib/MatrixDotNetLib/MatrixLoginRequest.cs b/MatrixDotNetLib/MatrixDotNetLib/MatrixLoginRequest.cs index 0af05b6..bf78abb 100644 --- a/MatrixDotNetLib/MatrixDotNetLib/MatrixLoginRequest.cs +++ b/MatrixDotNetLib/MatrixDotNetLib/MatrixLoginRequest.cs @@ -9,7 +9,7 @@ namespace MatrixDotNetLib public class MatrixLoginRequest { /// - /// Gets or sets the client device ID (optional, auto-generated if null) + /// Gets or sets client device ID (optional, auto-generated if null) /// [JsonProperty("device_id")] public string DeviceId { get; set; } diff --git a/MatrixDotNetLib/MatrixDotNetLib/MatrixSessionManager.cs b/MatrixDotNetLib/MatrixDotNetLib/MatrixSessionManager.cs index 8ca2add..5bafd44 100644 --- a/MatrixDotNetLib/MatrixDotNetLib/MatrixSessionManager.cs +++ b/MatrixDotNetLib/MatrixDotNetLib/MatrixSessionManager.cs @@ -6,12 +6,25 @@ using System.Net.Http; using System.Net.Http.Headers; using System.Reflection.Metadata.Ecma335; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; namespace MatrixDotNetLib { public class MatrixSessionManager { + public string Token { get; set; } + + public string Server { get; set; } + + /// + /// Logs the user in with specified server and credentials. + /// + /// Required + /// Required + /// Required + /// Optional + /// public MatrixLoginResponse Login(string server, string user, string pass, string device = "") { MatrixLoginIdentifier userId = new MatrixLoginIdentifier() @@ -33,23 +46,163 @@ namespace MatrixDotNetLib } // create a web request - string loginUrl = "https://" + server + MatrixApis.User["login"]; + string loginUrl = "https://" + server + MatrixApis.User.Login; // serialize object into JSON string requestJson = JsonConvert.SerializeObject(theRequest); - HttpContent requestContent = new StringContent(requestJson, Encoding.UTF8, "application/json"); + string responseJson = ApiResult(MatrixApis.User.Login, httpAction.GET, requestJson); + + MatrixLoginResponse response = JsonConvert.DeserializeObject(responseJson); + return response; + + //// simplest implementation + //// might not work for UWP + //// sauce: https://stackoverflow.com/questions/5527316/how-to-set-the-content-of-an-httpwebrequest-in-c + //HttpContent requestContent = new StringContent(requestJson, Encoding.UTF8, "application/json"); + + //HttpClient client = new HttpClient(); + //client.BaseAddress = new Uri(loginUrl); + //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + //HttpResponseMessage responseMessage = client.PostAsync(loginUrl, requestContent).Result; + //string responseString = responseMessage.Content.ReadAsStringAsync().Result; + + //if(responseString.Contains("errcode")) + //{ + // // deserialize into error object + // MatrixError error = JsonConvert.DeserializeObject(responseString); + + // // convert error object to a string + // string errMsg = error.ErrorCode + ": " + error.ErrorMessage; + + // // throw exception (can be caught and handled gracefully) + // throw new Exception(errMsg); + //} + //else + //{ + // MatrixLoginResponse response = JsonConvert.DeserializeObject(responseString); + + // return response; + //} + } + + public MatrixUserRooms GetRooms(string token) + { + + } + + public enum httpAction + { + DELETE, + GET, + POST, + PUT + } + + public string ApiResult(string api, httpAction action = httpAction.GET, string json = null, MatrixApiEntities entities = null) + { + // simplest implementation + // might not work for UWP + // sauce: https://stackoverflow.com/questions/5527316/how-to-set-the-content-of-an-httpwebrequest-in-c + + // replace all entities in param + + string url = "https://" + this.Server + api; HttpClient client = new HttpClient(); - client.BaseAddress = new Uri(loginUrl); - client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + client.BaseAddress = new Uri(url); - HttpResponseMessage responseMessage = client.PostAsync(loginUrl, requestContent).Result; - string responseString = responseMessage.Content.ReadAsStringAsync().Result; + // init empty string + string responseString = ""; - MatrixLoginResponse response = JsonConvert.DeserializeObject(responseString); + // DELETE: replace all entities in uri with values in param + // GET: replace all entities in uri with values in param + // POST: replace entities, create content from json + // PUT: replace entitites, create content from json - return response; + + if (entities != null) + { + // check if any populated entity property exists in the url + // find {...} in url + // replace with values from entity object + string matchPattern = @"\{([A-Za-z]+)\}"; + Regex rgx = new Regex(matchPattern); + + MatrixUtil util = new MatrixUtil(); + + foreach (Match match in rgx.Matches(url)) + { + string oldVal = match.Value; + string prop = util.UpperFirst(match.Groups[1].Value); + + // check if property exists in entity list + try + { + // get value of property through GetType().GetProperty().GetValue() + // sauce: https://www.techrepublic.com/article/applied-reflection-dynamically-accessing-properties-of-a-class-at-runtime/ + string newVal = entities.GetType().GetProperty(prop).GetValue(entities).ToString(); + // return URL with entities replaced and URL-encoded + url = WebUtility.UrlEncode(url.Replace(oldVal, newVal)); + } + catch + { + // shit broke + } + } + } + + HttpResponseMessage responseMessage = new HttpResponseMessage(); + + if (json != null) + { + // create HTTP request body from JSON string + HttpContent requestContent = new StringContent(json, Encoding.UTF8, "application/json"); + + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + + switch (action) + { + case httpAction.POST: + responseMessage = client.PostAsync(url, requestContent).Result; + break; + case httpAction.PUT: + responseMessage = client.PutAsync(url, requestContent).Result; + break; + } + + responseString = responseMessage.Content.ReadAsStringAsync().Result; + } + else + { + // no message body, so this must be a GET or DELETE operation + switch (action) + { + case httpAction.DELETE: + responseMessage = client.DeleteAsync(url).Result; + break; + case httpAction.GET: + responseMessage = client.GetAsync(url).Result; + break; + } + } + + if (responseString.Contains("errcode")) + { + // deserialize into error object + MatrixError error = JsonConvert.DeserializeObject(responseString); + + // convert error object to a string + string errMsg = error.ErrorCode + ": " + error.ErrorMessage; + + // throw exception (can be caught and handled gracefully) + throw new Exception(errMsg); + } + else + { + return responseString; + } } } } \ No newline at end of file diff --git a/MatrixDotNetLib/MatrixDotNetLib/MatrixUserRooms.cs b/MatrixDotNetLib/MatrixDotNetLib/MatrixUserRooms.cs new file mode 100644 index 0000000..2f00114 --- /dev/null +++ b/MatrixDotNetLib/MatrixDotNetLib/MatrixUserRooms.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MatrixDotNetLib +{ + public class MatrixUserRooms + { + /// + /// Gets or sets string array of joined rooms + /// + [JsonProperty("joined_rooms")] + public string[] Joined { get; set; } + } +} diff --git a/MatrixDotNetLib/MatrixDotNetLib/MatrixUtil.cs b/MatrixDotNetLib/MatrixDotNetLib/MatrixUtil.cs new file mode 100644 index 0000000..2cc60cd --- /dev/null +++ b/MatrixDotNetLib/MatrixDotNetLib/MatrixUtil.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MatrixDotNetLib +{ + public class MatrixUtil + { + /// + /// Returns string with first letter capitalized + /// + /// + /// + public string UpperFirst(string s) + { + // Check for empty string. + if (string.IsNullOrEmpty(s)) + { + return string.Empty; + } + // Return char and concat substring. + return char.ToUpper(s[0]) + s.Substring(1); + } + } +} diff --git a/MatrixDotNetLib/MatrixDotNetLib/bin/Debug/netcoreapp3.1/MatrixDotNetLib.dll b/MatrixDotNetLib/MatrixDotNetLib/bin/Debug/netcoreapp3.1/MatrixDotNetLib.dll index 6de0af9f9f0af36de24b3bc9838294453657e931..b5d30dd8ffdc9b067a8d071c9c6dc01ed03187ac 100644 GIT binary patch delta 3105 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 diff --git a/MatrixDotNetLib/MatrixDotNetLib/bin/Debug/netcoreapp3.1/MatrixDotNetLib.pdb b/MatrixDotNetLib/MatrixDotNetLib/bin/Debug/netcoreapp3.1/MatrixDotNetLib.pdb index 1eceee0422d910a72543d66f76872a05a17791f0..105b92bd30f74eb60458b3477401db5b9826f05a 100644 GIT binary patch delta 860 zcmYk4?@Lo*6vw~k>E1iH-Gw>mg{{KGElX?JG);{eh1L9#*vKHr8FL8c@NNr(YHGWy zUX@)4i3o~jii=sNuz`8HadA^_XJWe^71I~kWf7%!sOQcw$z%@nIqWyTrIw*B#^zZ>bzcN4MsNO%C9AaL)TCuJ0 z`APV3=uvQTp?B6{)vs_F$2Z<{I?DiJy=msImuhC72T05;SF4R&(k+!DHH!-2gCY=6 z2|-mL&F2L^b&cTD1TuW)tPH(w{GmAUo8zN!;tPkWI-&ClfD3)93j-zX#vRp-2OI^C zVlgTDM7DuPsE5jpgl~MIjzhA}yqUdn=A9g#(yV}kwcL1>c?s;YvGf~kEdAX!mVW3z zXCWKp&Z`fU4NW$dezT3G-(q9wx7t|xZ8nyEyN#v4?;l4{8h{yHGL^O@Bv}dU;k*W6 z&I$%Ot2n_~E8TFQinR;Td#-he3jQDsao=P7{ zCCAWlHkOVV;FhG-qtzBCG`~`Ht;wv7EX>sfW~Ziye;x8}54ZGvFF%-DS@I803^p5C zYu**gx=?`{g}*^SU@c+-J`5;Whlqd|euZm1DG6SpS1EI%O+h7m3eQX0Il_?OTDigt zkTSlN{51KVrdw(H1zmbaxxHli$jpeT+roT9`5wv_=yGB`dAei#?@vTiaYNs6I#qVE zsU;i^=jN?r?g3$Xt*7oTI%WNI-|)ON=ge2;TXV_$WG-8`^q8YP-;wXkM=jymB7ncD CK8mye delta 715 zcmYjOOK1~O6uozRGwEbfC={_oLrr5$B@#bPM5z@l+F()y3Bexd>E^~G5L+@1d z^ad3ma0x(Y0B3-B$}Hsyqh+FCQcrL%oq`L*w=$2X5A35lOZp-qFqkinkPh}NMsBXZ z8-F_e@yT-a`mgNF&>XeluJrtYhHy+)@J;N!(BT8&lcK{{!e`7lAi2>}&uO61F)s``aCweUAM9KKoIJW1d*zM5l4>&aYdmNg5{`T7^FNwgvMzPoIUIjc%K#EQkhUwJoNG|XbZk&&nk%GBc_?MiR@41Ybkyo@$t;bqO_!DDq2gZk%4)!*Ji}7Tx zI=}i=-@D^KUZ;Dz1|z=T-%rYAcNB%(Y^)292+*NJ&^%Pex^W{`=dsq0wU;=lfsES&85x~t002-u2893s diff --git a/MatrixDotNetLib/MatrixDotNetLib/obj/Debug/netcoreapp3.1/MatrixDotNetLib.dll b/MatrixDotNetLib/MatrixDotNetLib/obj/Debug/netcoreapp3.1/MatrixDotNetLib.dll index 6de0af9f9f0af36de24b3bc9838294453657e931..b5d30dd8ffdc9b067a8d071c9c6dc01ed03187ac 100644 GIT binary patch delta 3105 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 diff --git a/MatrixDotNetLib/MatrixDotNetLib/obj/Debug/netcoreapp3.1/MatrixDotNetLib.pdb b/MatrixDotNetLib/MatrixDotNetLib/obj/Debug/netcoreapp3.1/MatrixDotNetLib.pdb index 1eceee0422d910a72543d66f76872a05a17791f0..105b92bd30f74eb60458b3477401db5b9826f05a 100644 GIT binary patch delta 860 zcmYk4?@Lo*6vw~k>E1iH-Gw>mg{{KGElX?JG);{eh1L9#*vKHr8FL8c@NNr(YHGWy zUX@)4i3o~jii=sNuz`8HadA^_XJWe^71I~kWf7%!sOQcw$z%@nIqWyTrIw*B#^zZ>bzcN4MsNO%C9AaL)TCuJ0 z`APV3=uvQTp?B6{)vs_F$2Z<{I?DiJy=msImuhC72T05;SF4R&(k+!DHH!-2gCY=6 z2|-mL&F2L^b&cTD1TuW)tPH(w{GmAUo8zN!;tPkWI-&ClfD3)93j-zX#vRp-2OI^C zVlgTDM7DuPsE5jpgl~MIjzhA}yqUdn=A9g#(yV}kwcL1>c?s;YvGf~kEdAX!mVW3z zXCWKp&Z`fU4NW$dezT3G-(q9wx7t|xZ8nyEyN#v4?;l4{8h{yHGL^O@Bv}dU;k*W6 z&I$%Ot2n_~E8TFQinR;Td#-he3jQDsao=P7{ zCCAWlHkOVV;FhG-qtzBCG`~`Ht;wv7EX>sfW~Ziye;x8}54ZGvFF%-DS@I803^p5C zYu**gx=?`{g}*^SU@c+-J`5;Whlqd|euZm1DG6SpS1EI%O+h7m3eQX0Il_?OTDigt zkTSlN{51KVrdw(H1zmbaxxHli$jpeT+roT9`5wv_=yGB`dAei#?@vTiaYNs6I#qVE zsU;i^=jN?r?g3$Xt*7oTI%WNI-|)ON=ge2;TXV_$WG-8`^q8YP-;wXkM=jymB7ncD CK8mye delta 715 zcmYjOOK1~O6uozRGwEbfC={_oLrr5$B@#bPM5z@l+F()y3Bexd>E^~G5L+@1d z^ad3ma0x(Y0B3-B$}Hsyqh+FCQcrL%oq`L*w=$2X5A35lOZp-qFqkinkPh}NMsBXZ z8-F_e@yT-a`mgNF&>XeluJrtYhHy+)@J;N!(BT8&lcK{{!e`7lAi2>}&uO61F)s``aCweUAM9KKoIJW1d*zM5l4>&aYdmNg5{`T7^FNwgvMzPoIUIjc%K#EQkhUwJoNG|XbZk&&nk%GBc_?MiR@41Ybkyo@$t;bqO_!DDq2gZk%4)!*Ji}7Tx zI=}i=-@D^KUZ;Dz1|z=T-%rYAcNB%(Y^)292+*NJ&^%Pex^W{`=dsq0wU;=l + System.Net + + +void Main() +{ + string pattern = @"\{([A-Za-z]+)\}"; + + Regex rgx = new Regex(pattern); + + string source = @"/_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}"; + + MatrixApiEntities entities = new MatrixApiEntities() + { + UserId = "claire", + RoomId = "boobs", + Type = "private", + Tags = "dummy" + }; + + foreach (Match match in rgx.Matches(source)) + { + string replace = match.Value; + string prop = UpperFirst(match.Groups[1].Value); + + // check if property exists in entity list + try + { + // get value of property through GetType().GetProperty().GetValue() + string entityValue = entities.GetType().GetProperty(prop).GetValue(entities).ToString(); + // return URL with entities replaced and URL-encoded + source = WebUtility.UrlEncode(source.Replace(replace,entityValue)); + } + catch + { + // shit broke + } + + } + + Console.WriteLine(source); +} + +public string UpperFirst(string s) +{ + // Check for empty string. + if (string.IsNullOrEmpty(s)) + { + return string.Empty; + } + // Return char and concat substring. + return char.ToUpper(s[0]) + s.Substring(1); +} + +// Define other methods and classes here +public class MatrixApiEntities +{ + public string DeviceId { get; set; } + public string EventId { get; set; } + public string EventType { get; set; } + public string FileName { get; set; } + public string FilterId { get; set; } + public string Kind { get; set; } + public string MediaId { get; set; } + public string NetworkId { get; set; } + public string ReceiptType { get; set; } + public string RoomAlias { get; set; } + public string RoomId { get; set; } + public string RoomIdOrAlias { get; set; } + public string RuleId { get; set; } + public string Scope { get; set; } + public string ServerName { get; set; } + public string StateKey { get; set; } + public string Tags { get; set; } + public string TxnId { get; set; } + public string Type { get; set; } + public string UserId { get; set; } +} \ No newline at end of file