1107 Commits

Author SHA1 Message Date
m3o-actions
6b4b4c9980 Commit from m3o/m3o action 2022-03-09 23:21:04 +00:00
m3o-actions
9ae25e0fec Commit from m3o/m3o action 2022-03-09 21:27:07 +00:00
m3o-actions
0882443a5e Commit from m3o/m3o action 2022-03-09 20:20:24 +00:00
m3o-actions
6910f3d25a Commit from m3o/m3o action 2022-03-09 20:18:31 +00:00
m3o-actions
c4eb97765e Commit from m3o/m3o action 2022-03-09 20:15:45 +00:00
m3o-actions
2eb4296382 Commit from m3o/m3o action 2022-03-09 17:11:54 +00:00
m3o-actions
418f914253 Commit from m3o/m3o action 2022-03-09 17:02:01 +00:00
m3o-actions
2fb26f6b55 Commit from m3o/m3o action 2022-03-09 17:00:50 +00:00
m3o-actions
8750a8c59f Commit from m3o/m3o action 2022-03-09 16:31:09 +00:00
m3o-actions
9cbd5c1988 Commit from m3o/m3o action 2022-03-09 11:54:00 +00:00
m3o-actions
465010411d Commit from m3o/m3o action 2022-03-09 11:51:42 +00:00
m3o-actions
885aa8766c Commit from m3o/m3o action 2022-03-09 11:48:10 +00:00
m3o-actions
c0072c24d5 Commit from m3o/m3o action 2022-03-09 11:37:37 +00:00
m3o-actions
041b4ef27d Commit from m3o/m3o action 2022-03-09 08:54:14 +00:00
m3o-actions
eeced0f4bc Commit from m3o/m3o action 2022-03-09 07:43:59 +00:00
m3o-actions
1373d7afea Commit from m3o/m3o action 2022-03-09 07:41:47 +00:00
m3o-actions
aab69f0713 Commit from m3o/m3o action 2022-03-07 20:20:04 +00:00
m3o-actions
6464c39046 Commit from m3o/m3o action 2022-03-07 20:08:46 +00:00
m3o-actions
7ddabee6b5 Commit from m3o/m3o action 2022-03-07 18:09:28 +00:00
m3o-actions
099b92a9b5 Commit from m3o/m3o action 2022-03-07 14:45:54 +00:00
Asim Aslam
a14a8d234a Merge pull request #8 from cyb3rko/cyb3rko-discord-banner
Add Discord banner to README
2022-03-07 12:31:51 +00:00
Niko Diamadis
c84610cd53 Update README with Discord banner 2022-03-07 13:02:11 +01:00
m3o-actions
827b29d2b7 Commit from m3o/m3o action 2022-03-06 12:51:00 +00:00
m3o-actions
5a56ef54e7 Commit from m3o/m3o action 2022-03-03 17:15:58 +00:00
m3o-actions
94e2f8a5a6 Commit from m3o/m3o action 2022-03-03 15:46:41 +00:00
m3o-actions
544f3d2941 Commit from m3o/m3o action 2022-03-03 14:24:45 +00:00
m3o-actions
e8facfabd7 Commit from m3o/m3o action 2022-03-03 14:19:31 +00:00
m3o-actions
dadeda6bb0 Commit from m3o/m3o action 2022-03-03 14:14:33 +00:00
m3o-actions
2b02492525 Commit from m3o/m3o action 2022-03-03 11:49:03 +00:00
m3o-actions
781a433a84 Commit from m3o/m3o action 2022-03-03 10:21:42 +00:00
m3o-actions
a2efcefd8b Commit from m3o/m3o action 2022-03-02 17:15:22 +00:00
m3o-actions
bb0db592be Commit from m3o/m3o action 2022-03-02 17:02:33 +00:00
m3o-actions
beca62373a Commit from m3o/m3o action 2022-03-02 16:46:27 +00:00
m3o-actions
95340f33e9 Commit from m3o/m3o action 2022-03-02 10:44:07 +00:00
m3o-actions
ddef868d22 Commit from m3o/m3o action 2022-03-02 10:19:39 +00:00
m3o-actions
fd8353bc9c Commit from m3o/m3o action 2022-03-02 10:16:25 +00:00
m3o-actions
e56aeee2a7 Commit from m3o/m3o action 2022-03-01 20:39:54 +00:00
m3o-actions
40bb9bcdb3 Commit from m3o/m3o action 2022-03-01 17:11:35 +00:00
m3o-actions
21b9ece648 Commit from m3o/m3o action 2022-03-01 17:03:04 +00:00
m3o-actions
fa7dfe82c6 Commit from m3o/m3o action 2022-03-01 16:46:43 +00:00
m3o-actions
ca3f935e80 Commit from m3o/m3o action 2022-03-01 16:40:47 +00:00
m3o-actions
a2fd26ec51 Commit from m3o/m3o action 2022-03-01 16:32:46 +00:00
m3o-actions
29df5f68d5 Commit from m3o/m3o action 2022-03-01 16:30:35 +00:00
m3o-actions
cd0a0f4059 Commit from m3o/m3o action 2022-03-01 16:24:48 +00:00
m3o-actions
5b5d0b3e59 Commit from m3o/m3o action 2022-03-01 16:21:04 +00:00
m3o-actions
9bd086fd57 Commit from m3o/m3o action 2022-03-01 16:15:13 +00:00
m3o-actions
3225621041 Commit from m3o/m3o action 2022-03-01 16:15:04 +00:00
m3o-actions
489d94445a Commit from m3o/m3o action 2022-03-01 15:57:50 +00:00
m3o-actions
8cc6efd763 Commit from m3o/m3o action 2022-03-01 15:50:46 +00:00
m3o-actions
2485a8b887 Commit from m3o/m3o action 2022-03-01 15:48:51 +00:00
m3o-actions
818f632239 Commit from m3o/m3o action 2022-03-01 09:29:28 +00:00
m3o-actions
e20ce9d6e9 Commit from m3o/m3o action 2022-03-01 09:29:07 +00:00
m3o-actions
0fed9fb4ae Commit from m3o/m3o action 2022-03-01 09:15:35 +00:00
m3o-actions
e259f67996 Commit from m3o/m3o action 2022-02-28 17:55:46 +00:00
m3o-actions
41f154c15d Commit from m3o/m3o action 2022-02-28 17:51:44 +00:00
m3o-actions
f4364042f0 Commit from m3o/m3o action 2022-02-28 17:06:58 +00:00
m3o-actions
becd2f34a6 Commit from m3o/m3o action 2022-02-28 16:17:11 +00:00
m3o-actions
68f3df1004 Commit from m3o/m3o action 2022-02-27 22:41:12 +00:00
m3o-actions
af1231f0c9 Commit from m3o/m3o action 2022-02-27 22:39:27 +00:00
m3o-actions
3dc5ec3324 Commit from m3o/m3o action 2022-02-27 22:09:25 +00:00
m3o-actions
06173570da Commit from m3o/m3o action 2022-02-27 21:57:31 +00:00
m3o-actions
d045a9a5e4 Commit from m3o/m3o action 2022-02-27 21:47:26 +00:00
m3o-actions
fec8cd6c49 Commit from m3o/m3o action 2022-02-25 15:21:54 +00:00
m3o-actions
d935baa7b6 Commit from m3o/m3o action 2022-02-25 13:12:07 +00:00
m3o-actions
b6293c699c Commit from m3o/m3o action 2022-02-25 13:04:30 +00:00
m3o-actions
bcf8833d06 Commit from m3o/m3o action 2022-02-25 12:46:02 +00:00
m3o-actions
341d0e9563 Commit from m3o/m3o action 2022-02-25 12:38:16 +00:00
m3o-actions
8287cc7f53 Commit from m3o/m3o action 2022-02-25 12:26:43 +00:00
m3o-actions
bc29f092b5 Commit from m3o/m3o action 2022-02-25 12:05:16 +00:00
m3o-actions
38aea3724a Commit from m3o/m3o action 2022-02-24 22:04:39 +00:00
m3o-actions
ed46965680 Commit from m3o/m3o action 2022-02-24 18:24:35 +00:00
m3o-actions
c80c59c3cb Commit from m3o/m3o action 2022-02-24 18:23:52 +00:00
m3o-actions
a5c68cd8ab Commit from m3o/m3o action 2022-02-24 16:11:57 +00:00
Asim Aslam
f478825008 delete example 2022-02-24 16:05:10 +00:00
m3o-actions
dc93f7878d Commit from m3o/m3o action 2022-02-24 14:34:03 +00:00
m3o-actions
850f0f9a73 Commit from m3o/m3o action 2022-02-24 12:41:15 +00:00
m3o-actions
805c982135 Commit from m3o/m3o action 2022-02-24 12:15:02 +00:00
m3o-actions
f22a101838 Commit from m3o/m3o action 2022-02-24 12:01:52 +00:00
m3o-actions
70b02fb947 Commit from m3o/m3o action 2022-02-24 11:54:00 +00:00
m3o-actions
e9ccf5fa0f Commit from m3o/m3o action 2022-02-24 11:35:45 +00:00
m3o-actions
1251b49828 Commit from m3o/m3o action 2022-02-24 11:35:33 +00:00
m3o-actions
664e8e8299 Commit from m3o/m3o action 2022-02-24 09:55:54 +00:00
m3o-actions
610b0caa7a Commit from m3o/m3o action 2022-02-24 08:12:04 +00:00
m3o-actions
27aa74905c Commit from m3o/m3o action 2022-02-23 12:59:33 +00:00
m3o-actions
3a183dd2a5 Commit from m3o/m3o action 2022-02-23 12:57:15 +00:00
m3o-actions
daf8202a94 Commit from m3o/m3o action 2022-02-23 12:10:16 +00:00
m3o-actions
e3abb63e40 Commit from m3o/m3o action 2022-02-23 11:56:38 +00:00
m3o-actions
8cfcd5d7d2 Commit from m3o/m3o action 2022-02-22 21:20:08 +00:00
m3o-actions
ba33a517e5 Commit from m3o/m3o action 2022-02-22 21:16:43 +00:00
m3o-actions
3380a01ec6 Commit from m3o/m3o action 2022-02-22 18:23:53 +00:00
m3o-actions
b386520a82 Commit from m3o/m3o action 2022-02-22 15:56:13 +00:00
m3o-actions
41076ed778 Commit from m3o/m3o action 2022-02-22 15:53:41 +00:00
m3o-actions
c7e37bf0f9 Commit from m3o/m3o action 2022-02-22 15:45:18 +00:00
m3o-actions
1e217f2fe6 Commit from m3o/m3o action 2022-02-22 15:42:40 +00:00
m3o-actions
0094140173 Commit from m3o/m3o action 2022-02-22 15:26:29 +00:00
m3o-actions
3dace0f97c Commit from m3o/m3o action 2022-02-22 15:25:43 +00:00
m3o-actions
9328c78184 Commit from m3o/m3o action 2022-02-22 15:25:24 +00:00
m3o-actions
8607d1e6ec Commit from m3o/m3o action 2022-02-22 15:21:30 +00:00
m3o-actions
5a0bb20888 Commit from m3o/m3o action 2022-02-22 09:38:52 +00:00
m3o-actions
716229e84c Commit from m3o/m3o action 2022-02-22 09:17:28 +00:00
m3o-actions
9f21dbac27 Commit from m3o/m3o action 2022-02-22 08:39:05 +00:00
m3o-actions
bf055df06e Commit from m3o/m3o action 2022-02-22 08:32:13 +00:00
m3o-actions
4f9eefd72c Commit from m3o/m3o action 2022-02-22 08:29:01 +00:00
m3o-actions
ad465bab1b Commit from m3o/m3o action 2022-02-21 17:00:20 +00:00
m3o-actions
bf71e8910b Commit from m3o/m3o action 2022-02-21 16:54:05 +00:00
m3o-actions
7d6c343c0c Commit from m3o/m3o action 2022-02-21 16:47:59 +00:00
m3o-actions
006377ced4 Commit from m3o/m3o action 2022-02-21 16:38:00 +00:00
m3o-actions
c18890d567 Commit from m3o/m3o action 2022-02-21 16:23:55 +00:00
m3o-actions
d9ba4f1e81 Commit from m3o/m3o action 2022-02-21 14:55:05 +00:00
m3o-actions
e2c7c21f71 Commit from m3o/m3o action 2022-02-21 14:54:04 +00:00
m3o-actions
39bb32658f Commit from m3o/m3o action 2022-02-21 14:16:06 +00:00
m3o-actions
d9aa0c235b Commit from m3o/m3o action 2022-02-21 14:09:50 +00:00
m3o-actions
93129f6883 Commit from m3o/m3o action 2022-02-21 13:40:57 +00:00
m3o-actions
d976129e73 Commit from m3o/m3o action 2022-02-21 13:32:02 +00:00
m3o-actions
86d710f81e Commit from m3o/m3o action 2022-02-21 13:22:08 +00:00
Asim Aslam
0638da0d21 remove example 2022-02-21 13:17:00 +00:00
m3o-actions
d1352d714d Commit from m3o/m3o action 2022-02-21 13:05:38 +00:00
m3o-actions
9ba50816ab Commit from m3o/m3o action 2022-02-21 12:55:08 +00:00
m3o-actions
1d31086bec Commit from m3o/m3o action 2022-02-21 12:52:58 +00:00
m3o-actions
10d0a9e182 Commit from m3o/m3o action 2022-02-21 12:50:53 +00:00
m3o-actions
e23aea2415 Commit from m3o/m3o action 2022-02-21 12:48:23 +00:00
m3o-actions
fafe078c68 Commit from m3o/m3o action 2022-02-21 12:45:08 +00:00
m3o-actions
bab69e3059 Commit from m3o/m3o action 2022-02-21 12:43:11 +00:00
m3o-actions
aa05f2f678 Commit from m3o/m3o action 2022-02-21 12:35:39 +00:00
m3o-actions
453403a198 Commit from m3o/m3o action 2022-02-21 12:32:45 +00:00
m3o-actions
b580e5270e Commit from m3o/m3o action 2022-02-21 12:27:30 +00:00
m3o-actions
92317e7690 Commit from m3o/m3o action 2022-02-21 12:15:24 +00:00
m3o-actions
c737c0dd9f Commit from m3o/m3o action 2022-02-21 12:11:52 +00:00
m3o-actions
cf4338a959 Commit from m3o/m3o action 2022-02-21 12:04:55 +00:00
m3o-actions
6c61a79774 Commit from m3o/m3o action 2022-02-21 11:44:41 +00:00
m3o-actions
f78928459e Commit from m3o/m3o action 2022-02-21 10:04:04 +00:00
m3o-actions
d96ccfd958 Commit from m3o/m3o action 2022-02-21 09:55:56 +00:00
m3o-actions
46da6257d7 Commit from m3o/m3o action 2022-02-20 22:12:44 +00:00
m3o-actions
e59891fea8 Commit from m3o/m3o action 2022-02-20 22:01:00 +00:00
m3o-actions
0d60904f8a Commit from m3o/m3o action 2022-02-20 21:54:04 +00:00
m3o-actions
a6dc177797 Commit from m3o/m3o action 2022-02-20 21:44:00 +00:00
m3o-actions
29cb72c55b Commit from m3o/m3o action 2022-02-20 18:24:22 +00:00
m3o-actions
48aaa5dbad Commit from m3o/m3o action 2022-02-20 14:19:28 +00:00
m3o-actions
83d47cea87 Commit from m3o/m3o action 2022-02-20 14:08:38 +00:00
m3o-actions
ffe132871c Commit from m3o/m3o action 2022-02-20 12:41:40 +00:00
m3o-actions
facb2a9289 Commit from m3o/m3o action 2022-02-20 12:36:15 +00:00
m3o-actions
2f40c45092 Commit from m3o/m3o action 2022-02-20 12:07:07 +00:00
m3o-actions
c41627014b Commit from m3o/m3o action 2022-02-20 12:02:04 +00:00
m3o-actions
c5749cbf5c Commit from m3o/m3o action 2022-02-20 08:59:06 +00:00
m3o-actions
b5baad9981 Commit from m3o/m3o action 2022-02-20 08:17:35 +00:00
m3o-actions
ac2e4538f1 Commit from m3o/m3o action 2022-02-19 22:30:12 +00:00
m3o-actions
f951b8d2ac Commit from m3o/m3o action 2022-02-19 22:29:45 +00:00
m3o-actions
ead8d22c5f Commit from m3o/m3o action 2022-02-19 22:29:38 +00:00
m3o-actions
a94dc8b071 Commit from m3o/m3o action 2022-02-19 22:29:29 +00:00
m3o-actions
a3e13de758 Commit from m3o/m3o action 2022-02-19 22:28:41 +00:00
m3o-actions
ff159f4ded Commit from m3o/m3o action 2022-02-19 22:11:00 +00:00
m3o-actions
7a9449f921 Commit from m3o/m3o action 2022-02-19 22:07:44 +00:00
m3o-actions
a52e5923dd Commit from m3o/m3o action 2022-02-19 22:03:43 +00:00
m3o-actions
c768003af0 Commit from m3o/m3o action 2022-02-19 21:47:16 +00:00
m3o-actions
5f2ae98a47 Commit from m3o/m3o action 2022-02-19 21:27:57 +00:00
m3o-actions
2bf4cdd6b0 Commit from m3o/m3o action 2022-02-19 21:21:23 +00:00
m3o-actions
f1290e2b67 Commit from m3o/m3o action 2022-02-19 20:47:51 +00:00
m3o-actions
3c113f0f22 Commit from m3o/m3o action 2022-02-19 20:46:21 +00:00
m3o-actions
bdbbff7f50 Commit from m3o/m3o action 2022-02-19 20:35:54 +00:00
m3o-actions
ddbd0b480e Commit from m3o/m3o action 2022-02-19 20:17:40 +00:00
m3o-actions
aaedcafdaa Commit from m3o/m3o action 2022-02-19 18:53:53 +00:00
m3o-actions
90cf4567c8 Commit from m3o/m3o action 2022-02-19 18:03:41 +00:00
m3o-actions
7a39dbb5ad Commit from m3o/m3o action 2022-02-19 18:01:25 +00:00
Asim Aslam
95f8372cb9 remove emoji send 2022-02-19 17:57:11 +00:00
m3o-actions
21d9e25274 Commit from m3o/m3o action 2022-02-19 17:50:34 +00:00
m3o-actions
47b379f500 Commit from m3o/m3o action 2022-02-19 17:46:54 +00:00
m3o-actions
87d036f80d Commit from m3o/m3o action 2022-02-19 17:46:18 +00:00
m3o-actions
5c139aa49a Commit from m3o/m3o action 2022-02-19 17:44:20 +00:00
m3o-actions
8f09a3e936 Commit from m3o/m3o action 2022-02-19 17:44:00 +00:00
m3o-actions
a54d8235d8 Commit from m3o/m3o action 2022-02-19 17:40:18 +00:00
m3o-actions
322e1ef7ad Commit from m3o/m3o action 2022-02-19 16:07:12 +00:00
m3o-actions
e56ddcffa5 Commit from m3o/m3o action 2022-02-19 16:02:48 +00:00
m3o-actions
219931dd30 Commit from m3o/m3o action 2022-02-19 15:46:10 +00:00
m3o-actions
7857517aa3 Commit from m3o/m3o action 2022-02-19 15:37:47 +00:00
m3o-actions
6b7892d67e Commit from m3o/m3o action 2022-02-19 15:32:30 +00:00
m3o-actions
60c598762d Commit from m3o/m3o action 2022-02-19 15:22:20 +00:00
m3o-actions
291fa0ace8 Commit from m3o/m3o action 2022-02-19 15:17:40 +00:00
m3o-actions
2b269fddc4 Commit from m3o/m3o action 2022-02-19 15:16:00 +00:00
m3o-actions
56f9de1f9b Commit from m3o/m3o action 2022-02-19 14:44:24 +00:00
m3o-actions
ebb5f1bad0 Commit from m3o/m3o action 2022-02-19 14:24:50 +00:00
m3o-actions
ce7c51dbe7 Commit from m3o/m3o action 2022-02-19 12:58:52 +00:00
m3o-actions
1794a54039 Commit from m3o/m3o action 2022-02-19 12:43:14 +00:00
m3o-actions
fc050b8ee8 Commit from m3o/m3o action 2022-02-19 12:35:27 +00:00
m3o-actions
e10b8ec3ae Commit from m3o/m3o action 2022-02-19 12:33:39 +00:00
m3o-actions
f52d0c2326 Commit from m3o/m3o action 2022-02-19 12:33:12 +00:00
m3o-actions
632f0d29cb Commit from m3o/m3o action 2022-02-19 12:31:56 +00:00
m3o-actions
d7c3704cdc Commit from m3o/m3o action 2022-02-19 12:15:06 +00:00
m3o-actions
5072f84abf Commit from m3o/m3o action 2022-02-19 11:44:19 +00:00
m3o-actions
dfe8bc8923 Commit from m3o/m3o action 2022-02-19 11:37:31 +00:00
m3o-actions
de9c4adf65 Commit from m3o/m3o action 2022-02-19 09:47:32 +00:00
m3o-actions
18e89c6aaa Commit from m3o/m3o action 2022-02-19 09:33:56 +00:00
m3o-actions
f710c9998f Commit from m3o/m3o action 2022-02-19 09:32:43 +00:00
m3o-actions
c0d318a6c8 Commit from m3o/m3o action 2022-02-19 09:27:07 +00:00
m3o-actions
b04245c5dd Commit from m3o/m3o action 2022-02-19 09:24:38 +00:00
m3o-actions
24a3fbeaad Commit from m3o/m3o action 2022-02-19 09:22:50 +00:00
m3o-actions
270f241c30 Commit from m3o/m3o action 2022-02-19 09:19:02 +00:00
m3o-actions
9218ed3365 Commit from m3o/m3o action 2022-02-18 20:39:45 +00:00
m3o-actions
241a2e8253 Commit from m3o/m3o action 2022-02-18 20:32:01 +00:00
m3o-actions
004c90663d Commit from m3o/m3o action 2022-02-18 19:55:07 +00:00
m3o-actions
398ddc83fb Commit from m3o/m3o action 2022-02-18 19:50:16 +00:00
m3o-actions
c56699c7ac Commit from m3o/m3o action 2022-02-18 17:45:29 +00:00
m3o-actions
5a83458f0b Commit from m3o/m3o action 2022-02-18 16:21:44 +00:00
m3o-actions
a2e3e070ae Commit from m3o/m3o action 2022-02-18 16:15:22 +00:00
m3o-actions
0394044281 Commit from m3o/m3o action 2022-02-18 16:14:52 +00:00
m3o-actions
815ed6c85c Commit from m3o/m3o action 2022-02-18 16:08:57 +00:00
m3o-actions
e5df1d2d4e Commit from m3o/m3o action 2022-02-18 16:06:14 +00:00
m3o-actions
c61e197ab3 Commit from m3o/m3o action 2022-02-18 13:52:52 +00:00
m3o-actions
326a38028d Commit from m3o/m3o action 2022-02-18 13:31:31 +00:00
m3o-actions
59d85ff128 Commit from m3o/m3o action 2022-02-18 13:27:32 +00:00
m3o-actions
1b52ade3cd Commit from m3o/m3o action 2022-02-18 13:26:54 +00:00
m3o-actions
7b49673d15 Commit from m3o/m3o action 2022-02-18 13:03:17 +00:00
m3o-actions
e2cce06b00 Commit from m3o/m3o action 2022-02-18 12:19:53 +00:00
m3o-actions
f109440524 Commit from m3o/m3o action 2022-02-18 12:19:41 +00:00
m3o-actions
f4c1fb6719 Commit from m3o/m3o action 2022-02-18 12:18:49 +00:00
m3o-actions
c64f6e2af6 Commit from m3o/m3o action 2022-02-18 12:16:48 +00:00
m3o-actions
634291e93c Commit from m3o/m3o action 2022-02-18 12:14:14 +00:00
m3o-actions
e2cf2d8234 Commit from m3o/m3o action 2022-02-18 12:12:27 +00:00
m3o-actions
8ac14a5d53 Commit from m3o/m3o action 2022-02-18 12:11:38 +00:00
m3o-actions
8a905ac605 Commit from m3o/m3o action 2022-02-18 12:08:56 +00:00
m3o-actions
c6be7b79d4 Commit from m3o/m3o action 2022-02-18 12:08:20 +00:00
m3o-actions
994cc15926 Commit from m3o/m3o action 2022-02-18 11:55:00 +00:00
m3o-actions
fbcf589c8c Commit from m3o/m3o action 2022-02-18 11:53:25 +00:00
m3o-actions
d4311d3010 Commit from m3o/m3o action 2022-02-18 11:51:51 +00:00
m3o-actions
c45c463e7c Commit from m3o/m3o action 2022-02-18 11:49:40 +00:00
m3o-actions
9fd476dee8 Commit from m3o/m3o action 2022-02-18 11:48:14 +00:00
m3o-actions
3a883ccd4d Commit from m3o/m3o action 2022-02-18 11:40:50 +00:00
m3o-actions
3501f9aedd Commit from m3o/m3o action 2022-02-18 11:31:56 +00:00
m3o-actions
a6ee280b89 Commit from m3o/m3o action 2022-02-18 11:24:50 +00:00
m3o-actions
6c126097a5 Commit from m3o/m3o action 2022-02-18 11:22:56 +00:00
m3o-actions
b5b06f2c54 Commit from m3o/m3o action 2022-02-18 11:22:43 +00:00
m3o-actions
8e06d54c66 Commit from m3o/m3o action 2022-02-18 11:21:41 +00:00
m3o-actions
8a2aa76f81 Commit from m3o/m3o action 2022-02-18 11:20:34 +00:00
m3o-actions
8072676eeb Commit from m3o/m3o action 2022-02-18 11:19:41 +00:00
m3o-actions
18283f6252 Commit from m3o/m3o action 2022-02-18 11:18:21 +00:00
m3o-actions
a30af6f8a8 Commit from m3o/m3o action 2022-02-18 11:17:26 +00:00
m3o-actions
773ca17ff5 Commit from m3o/m3o action 2022-02-18 11:16:18 +00:00
m3o-actions
018ae85f91 Commit from m3o/m3o action 2022-02-18 11:13:00 +00:00
m3o-actions
29b773ac62 Commit from m3o/m3o action 2022-02-17 22:09:04 +00:00
m3o-actions
97ec346c6b Commit from m3o/m3o action 2022-02-17 21:48:58 +00:00
m3o-actions
f8fea92773 Commit from m3o/m3o action 2022-02-17 16:45:54 +00:00
m3o-actions
1fd3edc2c1 Commit from m3o/m3o action 2022-02-17 13:36:26 +00:00
m3o-actions
24b136c46a Commit from m3o/m3o action 2022-02-17 13:28:24 +00:00
m3o-actions
f4da5a864d Commit from m3o/m3o action 2022-02-17 13:27:44 +00:00
m3o-actions
e49c2fc4f5 Commit from m3o/m3o action 2022-02-17 13:25:57 +00:00
m3o-actions
923f60501a Commit from m3o/m3o action 2022-02-17 13:24:06 +00:00
m3o-actions
f6eaea5d63 Commit from m3o/m3o action 2022-02-17 13:22:34 +00:00
m3o-actions
560a7f1a88 Commit from m3o/m3o action 2022-02-17 13:22:07 +00:00
m3o-actions
43b17fede3 Commit from m3o/m3o action 2022-02-17 11:53:44 +00:00
m3o-actions
f838c439a7 Commit from m3o/m3o action 2022-02-16 21:45:47 +00:00
m3o-actions
5f6e71b7d0 Commit from m3o/m3o action 2022-02-16 17:51:13 +00:00
m3o-actions
c8dfc8df56 Commit from m3o/m3o action 2022-02-16 17:49:43 +00:00
m3o-actions
83ac51fe95 Commit from m3o/m3o action 2022-02-16 17:49:23 +00:00
m3o-actions
504423439f Commit from m3o/m3o action 2022-02-16 17:45:13 +00:00
m3o-actions
cf0a9af833 Commit from m3o/m3o action 2022-02-16 17:43:49 +00:00
m3o-actions
7551ba0bd0 Commit from m3o/m3o action 2022-02-16 17:43:19 +00:00
m3o-actions
393a340600 Commit from m3o/m3o action 2022-02-16 17:42:40 +00:00
m3o-actions
6d66ae3935 Commit from m3o/m3o action 2022-02-16 17:40:18 +00:00
m3o-actions
1a0a40d7e1 Commit from m3o/m3o action 2022-02-16 17:39:42 +00:00
m3o-actions
8ba35534a1 Commit from m3o/m3o action 2022-02-16 17:38:59 +00:00
m3o-actions
7576f985d7 Commit from m3o/m3o action 2022-02-16 17:38:07 +00:00
m3o-actions
8252311ba8 Commit from m3o/m3o action 2022-02-16 17:37:21 +00:00
m3o-actions
1876958097 Commit from m3o/m3o action 2022-02-16 17:32:41 +00:00
m3o-actions
47273aa12e Commit from m3o/m3o action 2022-02-16 17:31:52 +00:00
m3o-actions
27de67618d Commit from m3o/m3o action 2022-02-16 17:31:36 +00:00
m3o-actions
8202aef808 Commit from m3o/m3o action 2022-02-16 17:31:27 +00:00
m3o-actions
5df737c1b8 Commit from m3o/m3o action 2022-02-16 17:28:29 +00:00
m3o-actions
4caeae2aa1 Commit from m3o/m3o action 2022-02-16 15:51:55 +00:00
m3o-actions
75c795781b Commit from m3o/m3o action 2022-02-16 15:25:25 +00:00
m3o-actions
ca7a123aa7 Commit from m3o/m3o action 2022-02-16 15:03:44 +00:00
m3o-actions
598164c362 Commit from m3o/m3o action 2022-02-16 11:27:38 +00:00
m3o-actions
4d7767e86a Commit from m3o/m3o action 2022-02-16 10:05:41 +00:00
m3o-actions
4cf3519856 Commit from m3o/m3o action 2022-02-16 09:26:30 +00:00
m3o-actions
8e78e3040b Commit from m3o/m3o action 2022-02-16 08:50:58 +00:00
m3o-actions
fc990c84ab Commit from m3o/m3o action 2022-02-15 22:22:36 +00:00
m3o-actions
e9229571ad Commit from m3o/m3o action 2022-02-15 17:32:16 +00:00
Asim Aslam
b310d3e1e0 remove auto complete example 2022-02-15 17:26:40 +00:00
m3o-actions
3e8a30c33a Commit from m3o/m3o action 2022-02-15 15:30:41 +00:00
m3o-actions
d5b9efe74e Commit from m3o/m3o action 2022-02-15 15:10:47 +00:00
m3o-actions
da28af7166 Commit from m3o/m3o action 2022-02-15 13:03:21 +00:00
m3o-actions
cceeb16d81 Commit from m3o/m3o action 2022-02-15 12:41:05 +00:00
m3o-actions
a25cabc9be Commit from m3o/m3o action 2022-02-15 12:34:07 +00:00
m3o-actions
4ca21d5561 Commit from m3o/m3o action 2022-02-15 12:32:59 +00:00
m3o-actions
39fcaa24c0 Commit from m3o/m3o action 2022-02-15 12:16:34 +00:00
m3o-actions
fc1099c437 Commit from m3o/m3o action 2022-02-15 11:52:09 +00:00
m3o-actions
f3af3fa1ba Commit from m3o/m3o action 2022-02-15 11:36:20 +00:00
m3o-actions
03a3a1bb91 Commit from m3o/m3o action 2022-02-15 11:27:21 +00:00
m3o-actions
1c58bf602d Commit from m3o/m3o action 2022-02-15 11:04:19 +00:00
m3o-actions
02fc6f735a Commit from m3o/m3o action 2022-02-15 10:02:49 +00:00
m3o-actions
7ea20aefbd Commit from m3o/m3o action 2022-02-15 10:00:53 +00:00
m3o-actions
7698310d1a Commit from m3o/m3o action 2022-02-15 10:00:04 +00:00
m3o-actions
9685cb5d53 Commit from m3o/m3o action 2022-02-14 16:40:54 +00:00
m3o-actions
63fb62a55e Commit from m3o/m3o action 2022-02-14 15:40:49 +00:00
m3o-actions
56cdd3c583 Commit from m3o/m3o action 2022-02-14 14:12:45 +00:00
m3o-actions
97accc758e Commit from m3o/m3o action 2022-02-13 18:44:01 +00:00
m3o-actions
7e5fdc7d77 Commit from m3o/m3o action 2022-02-13 18:13:54 +00:00
m3o-actions
90f27882e8 Commit from m3o/m3o action 2022-02-11 15:10:20 +00:00
m3o-actions
70fd591952 Commit from m3o/m3o action 2022-02-11 14:43:11 +00:00
m3o-actions
7add4ca16b Commit from m3o/m3o action 2022-02-11 14:40:54 +00:00
m3o-actions
243d779a03 Commit from m3o/m3o action 2022-02-11 14:28:51 +00:00
m3o-actions
6b9caa1e59 Commit from m3o/m3o action 2022-02-11 14:27:47 +00:00
m3o-actions
2bbe49f716 Commit from m3o/m3o action 2022-02-10 20:54:17 +00:00
m3o-actions
046127532d Commit from m3o/m3o action 2022-02-09 22:11:39 +00:00
m3o-actions
2e14a4252f Commit from m3o/m3o action 2022-02-09 21:55:39 +00:00
m3o-actions
d1be4f25bc Commit from m3o/m3o action 2022-02-09 17:41:21 +00:00
m3o-actions
f38850c259 Commit from m3o/m3o action 2022-02-09 16:54:13 +00:00
m3o-actions
99979e1167 Commit from m3o/m3o action 2022-02-09 16:22:26 +00:00
m3o-actions
d144fd0b22 Commit from m3o/m3o action 2022-02-09 15:12:53 +00:00
m3o-actions
75cd109929 Commit from m3o/m3o action 2022-02-09 12:34:26 +00:00
m3o-actions
4cd429a8b3 Commit from m3o/m3o action 2022-02-09 12:32:09 +00:00
m3o-actions
aef44febce Commit from m3o/m3o action 2022-02-09 12:28:25 +00:00
m3o-actions
6446146553 Commit from m3o/m3o action 2022-02-09 10:44:26 +00:00
m3o-actions
f251e45b0b Commit from m3o/m3o action 2022-02-08 21:53:46 +00:00
m3o-actions
01f99e0b6d Commit from m3o/m3o action 2022-02-08 21:52:55 +00:00
m3o-actions
d9cabd803a Commit from m3o/m3o action 2022-02-08 21:50:47 +00:00
m3o-actions
064734211e Commit from m3o/m3o action 2022-02-08 21:49:28 +00:00
m3o-actions
d0aeac6b3c Commit from m3o/m3o action 2022-02-08 13:52:58 +00:00
m3o-actions
eb93a5a449 Commit from m3o/m3o action 2022-02-08 12:06:36 +00:00
m3o-actions
78d8e2fa1e Commit from m3o/m3o action 2022-02-07 16:49:25 +00:00
m3o-actions
6bca5af6c5 Commit from m3o/m3o action 2022-02-07 16:44:05 +00:00
m3o-actions
d132d7c27c Commit from m3o/m3o action 2022-02-07 16:25:19 +00:00
m3o-actions
6f3a7a4dd3 Commit from m3o/m3o action 2022-02-07 16:13:31 +00:00
m3o-actions
a2eb34e59a Commit from m3o/m3o action 2022-02-07 15:27:01 +00:00
m3o-actions
709e4180ec Commit from m3o/m3o action 2022-02-06 19:14:19 +00:00
m3o-actions
3abd701901 Commit from m3o/m3o action 2022-02-06 19:13:50 +00:00
m3o-actions
ea5aa65039 Commit from m3o/m3o action 2022-02-06 18:47:42 +00:00
m3o-actions
1ae6969f65 Commit from m3o/m3o action 2022-02-05 23:52:42 +00:00
m3o-actions
9901807b67 Commit from m3o/m3o action 2022-02-05 21:34:41 +00:00
m3o-actions
efb35c528c Commit from m3o/m3o action 2022-02-05 21:34:19 +00:00
m3o-actions
a64a7a6162 Commit from m3o/m3o action 2022-02-05 21:32:59 +00:00
m3o-actions
c7afdd237d Commit from m3o/m3o action 2022-02-05 21:32:06 +00:00
m3o-actions
6f5714dc73 Commit from m3o/m3o action 2022-02-03 22:42:38 +00:00
m3o-actions
6ce3f89757 Commit from m3o/m3o action 2022-02-03 22:02:09 +00:00
m3o-actions
3e655dea52 Commit from m3o/m3o action 2022-02-03 22:01:41 +00:00
m3o-actions
80ca5f8229 Commit from m3o/m3o action 2022-02-03 17:36:03 +00:00
m3o-actions
993c0b1e1c Commit from m3o/m3o action 2022-02-03 17:23:40 +00:00
m3o-actions
f7c6ac50e2 Commit from m3o/m3o action 2022-02-03 16:13:46 +00:00
m3o-actions
1f72651636 Commit from m3o/m3o action 2022-02-03 16:06:11 +00:00
m3o-actions
9f65103806 Commit from m3o/m3o action 2022-02-03 14:18:46 +00:00
m3o-actions
fb85cd000f Commit from m3o/m3o action 2022-02-03 11:32:32 +00:00
m3o-actions
e78ab622d6 Commit from m3o/m3o action 2022-02-03 11:21:15 +00:00
m3o-actions
84a739197e Commit from m3o/m3o action 2022-02-02 16:54:08 +00:00
m3o-actions
83d8cd3702 Commit from m3o/m3o action 2022-02-02 16:49:58 +00:00
m3o-actions
a94d784928 Commit from m3o/m3o action 2022-02-02 16:41:56 +00:00
m3o-actions
fd3a1063b0 Commit from m3o/m3o action 2022-02-02 16:32:36 +00:00
m3o-actions
2b935c2eb1 Commit from m3o/m3o action 2022-02-02 15:30:54 +00:00
m3o-actions
2d46dc2672 Commit from m3o/m3o action 2022-02-02 15:03:48 +00:00
m3o-actions
06f2db6618 Commit from m3o/m3o action 2022-02-02 12:14:14 +00:00
m3o-actions
c0731399ee Commit from m3o/m3o action 2022-02-02 11:33:16 +00:00
m3o-actions
9057f09e41 Commit from m3o/m3o action 2022-02-02 10:29:34 +00:00
m3o-actions
b7853960a4 Commit from m3o/m3o action 2022-02-01 17:25:12 +00:00
m3o-actions
1d96d4517b Commit from m3o/m3o action 2022-02-01 17:11:32 +00:00
m3o-actions
dd282e7ab9 Commit from m3o/m3o action 2022-02-01 15:16:59 +00:00
m3o-actions
8f3fe3d33c Commit from m3o/m3o action 2022-02-01 12:52:37 +00:00
m3o-actions
7e17640b3e Commit from m3o/m3o action 2022-02-01 12:14:35 +00:00
m3o-actions
a46a505a9f Commit from m3o/m3o action 2022-02-01 11:50:37 +00:00
m3o-actions
0a690f02d9 Commit from m3o/m3o action 2022-02-01 11:23:28 +00:00
m3o-actions
434a7615b7 Commit from m3o/m3o action 2022-02-01 11:12:15 +00:00
m3o-actions
7552377ffc Commit from m3o/m3o action 2022-02-01 08:52:03 +00:00
m3o-actions
cdb937b2cb Commit from m3o/m3o action 2022-01-31 18:10:43 +00:00
m3o-actions
fbf39cc693 Commit from m3o/m3o action 2022-01-31 16:18:59 +00:00
m3o-actions
1729996181 Commit from m3o/m3o action 2022-01-31 11:37:39 +00:00
m3o-actions
5fe1678ec5 Commit from m3o/m3o action 2022-01-31 11:31:42 +00:00
m3o-actions
8b790bd9b9 Commit from m3o/m3o action 2022-01-30 13:20:18 +00:00
m3o-actions
a9bcb78aa8 Commit from m3o/m3o action 2022-01-29 13:34:03 +00:00
m3o-actions
b3fd38731e Commit from m3o/m3o action 2022-01-29 13:32:49 +00:00
m3o-actions
ad326fd0b8 Commit from m3o/m3o action 2022-01-29 13:12:25 +00:00
m3o-actions
3ffe702d02 Commit from m3o/m3o action 2022-01-28 16:51:25 +00:00
m3o-actions
27a90b388a Commit from m3o/m3o action 2022-01-28 16:44:19 +00:00
m3o-actions
edfebe05df Commit from m3o/m3o action 2022-01-28 12:45:06 +00:00
m3o-actions
13441363d5 Commit from m3o/m3o action 2022-01-28 12:26:49 +00:00
m3o-actions
c5d206122c Commit from m3o/m3o action 2022-01-28 12:23:16 +00:00
m3o-actions
909ac3d71f Commit from m3o/m3o action 2022-01-28 11:45:42 +00:00
m3o-actions
3e8a881233 Commit from m3o/m3o action 2022-01-28 11:38:06 +00:00
m3o-actions
da1038343f Commit from m3o/m3o action 2022-01-28 11:07:21 +00:00
m3o-actions
fe7b620e59 Commit from m3o/m3o action 2022-01-27 14:31:56 +00:00
m3o-actions
58278dc08b Commit from m3o/m3o action 2022-01-26 20:25:51 +00:00
m3o-actions
362f73dca1 Commit from m3o/m3o action 2022-01-26 20:15:25 +00:00
m3o-actions
3cb3b40901 Commit from m3o/m3o action 2022-01-26 20:04:43 +00:00
m3o-actions
0aca22c769 Commit from m3o/m3o action 2022-01-26 19:15:56 +00:00
m3o-actions
9547c26947 Commit from m3o/m3o action 2022-01-26 13:06:45 +00:00
m3o-actions
9cd82a849f Commit from m3o/m3o action 2022-01-24 18:17:02 +00:00
m3o-actions
f142eddbb9 Commit from m3o/m3o action 2022-01-23 17:54:02 +00:00
m3o-actions
81eb8a213a Commit from m3o/m3o action 2022-01-23 09:47:29 +00:00
m3o-actions
79a9c94139 Commit from m3o/m3o action 2022-01-23 09:46:54 +00:00
m3o-actions
4a6b4ddbaa Commit from m3o/m3o action 2022-01-23 09:10:40 +00:00
m3o-actions
4646555d94 Commit from m3o/m3o action 2022-01-23 09:09:54 +00:00
m3o-actions
87d4ae480a Commit from m3o/m3o action 2022-01-23 09:09:16 +00:00
m3o-actions
f2c03ac414 Commit from m3o/m3o action 2022-01-23 09:08:22 +00:00
m3o-actions
00ad5f2668 Commit from m3o/m3o action 2022-01-21 15:55:22 +00:00
m3o-actions
5890e989e4 Commit from m3o/m3o action 2022-01-20 18:46:25 +00:00
m3o-actions
e7f0fd6434 Commit from m3o/m3o action 2022-01-20 15:13:38 +00:00
m3o-actions
d52ecd7232 Commit from m3o/m3o action 2022-01-20 15:13:18 +00:00
m3o-actions
3fd0023e27 Commit from m3o/m3o action 2022-01-20 08:15:38 +00:00
m3o-actions
83740822e1 Commit from m3o/m3o action 2022-01-20 08:06:17 +00:00
m3o-actions
7a4f8f2faa Commit from m3o/m3o action 2022-01-20 08:03:44 +00:00
m3o-actions
5db5bff7e5 Commit from m3o/m3o action 2022-01-20 07:58:53 +00:00
m3o-actions
bc3256a02a Commit from m3o/m3o action 2022-01-20 07:54:44 +00:00
m3o-actions
d346494459 Commit from m3o/m3o action 2022-01-20 07:52:53 +00:00
m3o-actions
847b17a423 Commit from m3o/m3o action 2022-01-19 21:52:39 +00:00
m3o-actions
051b7e8db7 Commit from m3o/m3o action 2022-01-19 21:51:49 +00:00
m3o-actions
ef53cae138 Commit from m3o/m3o action 2022-01-19 19:39:03 +00:00
m3o-actions
9c5e2fc5dd Commit from m3o/m3o action 2022-01-19 19:38:00 +00:00
m3o-actions
fbbc6fce2b Commit from m3o/m3o action 2022-01-19 18:45:46 +00:00
m3o-actions
75931d518a Commit from m3o/m3o action 2022-01-19 18:45:22 +00:00
m3o-actions
76e85f7e0a Commit from m3o/m3o action 2022-01-19 18:45:02 +00:00
m3o-actions
b4f72abd73 Commit from m3o/m3o action 2022-01-19 18:39:51 +00:00
m3o-actions
c9ddd8776c Commit from m3o/m3o action 2022-01-19 18:15:52 +00:00
m3o-actions
4e9cd04448 Commit from m3o/m3o action 2022-01-19 15:06:00 +00:00
m3o-actions
e4472e76bc Commit from m3o/m3o action 2022-01-19 10:30:21 +00:00
m3o-actions
b89a529672 Commit from m3o/m3o action 2022-01-18 14:54:20 +00:00
m3o-actions
1c567f0eff Commit from m3o/m3o action 2022-01-18 13:29:33 +00:00
m3o-actions
42b9941d93 Commit from m3o/m3o action 2022-01-18 09:21:40 +00:00
m3o-actions
ee0f545030 Commit from m3o/m3o action 2022-01-17 15:32:27 +00:00
m3o-actions
59a3c3c3a8 Commit from m3o/m3o action 2022-01-17 14:13:41 +00:00
m3o-actions
081b4bc7dd Commit from m3o/m3o action 2022-01-17 11:48:03 +00:00
m3o-actions
c296523bb2 Commit from m3o/m3o action 2022-01-17 11:42:01 +00:00
m3o-actions
fe83bf7d18 Commit from m3o/m3o action 2022-01-17 11:34:48 +00:00
m3o-actions
f68c53a04d Commit from m3o/m3o action 2022-01-15 21:05:12 +00:00
m3o-actions
04d7bf8148 Commit from m3o/m3o action 2022-01-15 20:59:52 +00:00
m3o-actions
a83b25a9aa Commit from m3o/m3o action 2022-01-15 20:55:42 +00:00
m3o-actions
b48eab72b9 Commit from m3o/m3o action 2022-01-15 20:55:33 +00:00
m3o-actions
8a600b6131 Commit from m3o/m3o action 2022-01-15 20:54:42 +00:00
m3o-actions
8408429e9b Commit from m3o/m3o action 2022-01-15 20:53:15 +00:00
m3o-actions
20a3a5bfd7 Commit from m3o/m3o action 2022-01-15 20:53:01 +00:00
m3o-actions
f01a912eb3 Commit from m3o/m3o action 2022-01-15 20:48:02 +00:00
m3o-actions
eebea56166 Commit from m3o/m3o action 2022-01-15 20:46:39 +00:00
m3o-actions
2d8f3d735d Commit from m3o/m3o action 2022-01-14 17:42:50 +00:00
m3o-actions
ccc5de5cda Commit from m3o/m3o action 2022-01-14 17:42:44 +00:00
m3o-actions
863b60c7db Commit from m3o/m3o action 2022-01-14 16:09:20 +00:00
m3o-actions
5caf581eff Commit from m3o/m3o action 2022-01-14 09:11:51 +00:00
m3o-actions
2dda68b677 Commit from m3o/m3o action 2022-01-14 09:11:13 +00:00
m3o-actions
8967d7aed8 Commit from m3o/m3o action 2022-01-13 14:13:38 +00:00
m3o-actions
88ec3b1629 Commit from m3o/m3o action 2022-01-13 13:23:08 +00:00
m3o-actions
3b8973592b Commit from m3o/m3o action 2022-01-13 11:39:07 +00:00
m3o-actions
af71fa56b0 Commit from m3o/m3o action 2022-01-13 11:00:05 +00:00
m3o-actions
1a6e2f4cb5 Commit from m3o/m3o action 2022-01-12 15:03:53 +00:00
m3o-actions
9abf8b4e6a Commit from m3o/m3o action 2022-01-12 14:17:28 +00:00
m3o-actions
74d67fe903 Commit from m3o/m3o action 2022-01-12 10:23:25 +00:00
m3o-actions
f9a04eab0b Commit from m3o/m3o action 2022-01-12 10:10:29 +00:00
m3o-actions
ecbcaa1f37 Commit from m3o/m3o action 2022-01-12 10:08:41 +00:00
m3o-actions
fc9078369c Commit from m3o/m3o action 2022-01-12 10:03:46 +00:00
m3o-actions
9fb8b7249a Commit from m3o/m3o action 2022-01-12 09:46:51 +00:00
m3o-actions
f238a3dde3 Commit from m3o/m3o action 2022-01-12 09:44:30 +00:00
m3o-actions
06e0e031f0 Commit from m3o/m3o action 2022-01-11 15:53:58 +00:00
m3o-actions
4671615268 Commit from m3o/m3o action 2022-01-11 14:33:46 +00:00
m3o-actions
50abf5f044 Commit from m3o/m3o action 2022-01-11 12:33:30 +00:00
m3o-actions
7ebbac3eb1 Commit from m3o/m3o action 2022-01-10 20:48:03 +00:00
m3o-actions
cff39c86e7 Commit from m3o/m3o action 2022-01-10 15:39:42 +00:00
m3o-actions
200da05cf0 Commit from m3o/m3o action 2022-01-10 15:13:17 +00:00
m3o-actions
0a2f0eb713 Commit from m3o/m3o action 2022-01-10 09:20:34 +00:00
m3o-actions
0d1952d41a Commit from m3o/m3o action 2022-01-07 12:55:10 +00:00
m3o-actions
4eaa0d7a79 Commit from m3o/m3o action 2022-01-07 12:48:23 +00:00
m3o-actions
fc3cf88dd1 Commit from m3o/m3o action 2022-01-07 11:59:24 +00:00
m3o-actions
4029f043af Commit from m3o/m3o action 2022-01-07 11:55:38 +00:00
m3o-actions
768c3a7277 Commit from m3o/m3o action 2022-01-07 11:09:48 +00:00
Dominic Wong
1b6f533cda remove search example 2022-01-07 11:05:22 +00:00
m3o-actions
23efeb1b54 Commit from m3o/m3o action 2022-01-06 22:20:09 +00:00
m3o-actions
28be83a1a3 Commit from m3o/m3o action 2022-01-06 22:09:57 +00:00
m3o-actions
163098f65c Commit from m3o/m3o action 2022-01-06 18:20:05 +00:00
m3o-actions
d75eee6adc Commit from m3o/m3o action 2022-01-06 17:04:52 +00:00
m3o-actions
f62afe5c72 Commit from m3o/m3o action 2022-01-06 17:00:05 +00:00
m3o-actions
05dcddb482 Commit from m3o/m3o action 2022-01-06 16:59:33 +00:00
m3o-actions
96bb1b0a89 Commit from m3o/m3o action 2022-01-06 16:57:05 +00:00
m3o-actions
3a49edfecc Commit from m3o/m3o action 2022-01-06 16:50:27 +00:00
m3o-actions
e8cd7403b7 Commit from m3o/m3o action 2022-01-06 16:44:20 +00:00
m3o-actions
8bba336dd3 Commit from m3o/m3o action 2022-01-06 15:23:27 +00:00
m3o-actions
a8b28f6b2a Commit from m3o/m3o action 2022-01-06 14:52:18 +00:00
m3o-actions
c919eb0016 Commit from m3o/m3o action 2022-01-06 11:30:48 +00:00
m3o-actions
6443d9822b Commit from m3o/m3o action 2022-01-06 11:14:12 +00:00
m3o-actions
cd580f41a7 Commit from m3o/m3o action 2022-01-06 11:13:13 +00:00
m3o-actions
f21152e1ed Commit from m3o/m3o action 2022-01-05 15:30:45 +00:00
m3o-actions
27e13d2b6c Commit from m3o/m3o action 2021-12-29 13:41:36 +00:00
m3o-actions
8561aa8205 Commit from m3o/m3o action 2021-12-28 10:50:15 +00:00
m3o-actions
f051277b48 Commit from m3o/m3o action 2021-12-28 10:47:34 +00:00
m3o-actions
1132b4809a Commit from m3o/m3o action 2021-12-28 07:23:23 +00:00
m3o-actions
85ff0bf56f Commit from m3o/m3o action 2021-12-23 09:07:13 +00:00
m3o-actions
f362f68c54 Commit from m3o/m3o action 2021-12-22 10:20:20 +00:00
m3o-actions
063e059d70 Commit from m3o/m3o action 2021-12-21 14:18:03 +00:00
m3o-actions
1773d164e4 Commit from m3o/m3o action 2021-12-21 11:38:52 +00:00
m3o-actions
a835eaddc4 Commit from m3o/m3o action 2021-12-21 11:38:29 +00:00
m3o-actions
a905d67b2c Commit from m3o/m3o action 2021-12-21 11:37:33 +00:00
m3o-actions
9c1ae9e4d2 Commit from m3o/m3o action 2021-12-21 11:36:48 +00:00
m3o-actions
5daed5e997 Commit from m3o/m3o action 2021-12-21 11:36:33 +00:00
m3o-actions
7c8a6f80de Commit from m3o/m3o action 2021-12-21 11:27:10 +00:00
Asim Aslam
05097a471d Remove contact examples 2021-12-21 11:16:46 +00:00
m3o-actions
3d0f9dda4b Commit from m3o/m3o action 2021-12-21 10:51:03 +00:00
m3o-actions
36d8023ada Commit from m3o/m3o action 2021-12-21 09:21:58 +00:00
m3o-actions
b135490f0e Commit from m3o/m3o action 2021-12-20 20:02:20 +00:00
m3o-actions
a97ced0f02 Commit from m3o/m3o action 2021-12-20 19:53:22 +00:00
m3o-actions
002380be31 Commit from m3o/m3o action 2021-12-20 14:22:15 +00:00
m3o-actions
1211b1b74e Commit from m3o/m3o action 2021-12-20 11:10:57 +00:00
m3o-actions
9a39681342 Commit from m3o/m3o action 2021-12-17 16:16:32 +00:00
m3o-actions
fd12523b0d Commit from m3o/m3o action 2021-12-17 15:38:23 +00:00
m3o-actions
4822495226 Commit from m3o/m3o action 2021-12-17 15:26:23 +00:00
m3o-actions
9cfa252f59 Commit from m3o/m3o action 2021-12-17 14:57:36 +00:00
m3o-actions
ab4602b369 Commit from m3o/m3o action 2021-12-17 14:01:44 +00:00
m3o-actions
9c97fbb4da Commit from m3o/m3o action 2021-12-17 13:02:04 +00:00
m3o-actions
3c853a2cbc Commit from m3o/m3o action 2021-12-17 10:03:03 +00:00
m3o-actions
ed1603b391 Commit from m3o/m3o action 2021-12-17 09:58:48 +00:00
m3o-actions
6ba5ad8ce4 Commit from m3o/m3o action 2021-12-17 09:34:07 +00:00
m3o-actions
24b609b070 Commit from m3o/m3o action 2021-12-17 09:29:22 +00:00
m3o-actions
801e983f3a Commit from m3o/m3o action 2021-12-17 09:28:01 +00:00
m3o-actions
c3e28cbc66 Commit from m3o/m3o action 2021-12-17 09:26:50 +00:00
m3o-actions
c4e0fe407e Commit from m3o/m3o action 2021-12-17 09:25:23 +00:00
m3o-actions
43e6f37402 Commit from m3o/m3o action 2021-12-17 09:24:04 +00:00
m3o-actions
9036b95fd2 Commit from m3o/m3o action 2021-12-17 09:20:58 +00:00
m3o-actions
937cb915ac Commit from m3o/m3o action 2021-12-17 09:14:47 +00:00
m3o-actions
da2b23fbab Commit from m3o/m3o action 2021-12-17 08:08:27 +00:00
m3o-actions
4de67b6746 Commit from m3o/m3o action 2021-12-16 21:02:03 +00:00
m3o-actions
75ba0d6c3a Commit from m3o/m3o action 2021-12-16 19:51:32 +00:00
Asim Aslam
873ba7f939 fix examples 2021-12-16 19:47:04 +00:00
m3o-actions
a6c66fb76a Commit from m3o/m3o action 2021-12-16 19:24:48 +00:00
m3o-actions
292001f3f2 Commit from m3o/m3o action 2021-12-16 19:22:42 +00:00
m3o-actions
d7e95f687f Commit from m3o/m3o action 2021-12-16 17:34:25 +00:00
m3o-actions
32496fe696 Commit from m3o/m3o action 2021-12-16 17:18:38 +00:00
m3o-actions
86803cc1e2 Commit from m3o/m3o action 2021-12-16 17:03:59 +00:00
m3o-actions
3f24078efb Commit from m3o/m3o action 2021-12-16 17:00:50 +00:00
m3o-actions
bb753c4504 Commit from m3o/m3o action 2021-12-16 16:55:04 +00:00
m3o-actions
3c6466378c Commit from m3o/m3o action 2021-12-16 15:49:00 +00:00
m3o-actions
d921922cd9 Commit from m3o/m3o action 2021-12-16 15:17:46 +00:00
m3o-actions
d2230e009d Commit from m3o/m3o action 2021-12-16 15:16:44 +00:00
m3o-actions
536e9cfe77 Commit from m3o/m3o action 2021-12-16 15:06:05 +00:00
m3o-actions
c707489b7a Commit from m3o/m3o action 2021-12-16 14:52:39 +00:00
m3o-actions
1a28fb54f9 Commit from m3o/m3o action 2021-12-16 12:53:53 +00:00
m3o-actions
d9525396cf Commit from m3o/m3o action 2021-12-16 12:50:50 +00:00
m3o-actions
4ba7d514de Commit from m3o/m3o action 2021-12-16 12:50:13 +00:00
m3o-actions
6f19fa6c21 Commit from m3o/m3o action 2021-12-16 12:35:53 +00:00
m3o-actions
9e9cdea93c Commit from m3o/m3o action 2021-12-16 12:33:31 +00:00
m3o-actions
b15338a487 Commit from m3o/m3o action 2021-12-16 08:48:57 +00:00
m3o-actions
0dcf091fcd Commit from m3o/m3o action 2021-12-16 08:47:26 +00:00
m3o-actions
0b51a95007 Commit from m3o/m3o action 2021-12-15 16:08:33 +00:00
m3o-actions
45911a9514 Commit from m3o/m3o action 2021-12-15 13:09:54 +00:00
m3o-actions
e1e192f018 Commit from m3o/m3o action 2021-12-15 12:22:04 +00:00
m3o-actions
27a864147e Commit from m3o/m3o action 2021-12-15 12:19:20 +00:00
m3o-actions
c1b77789fa Commit from m3o/m3o action 2021-12-15 11:31:44 +00:00
m3o-actions
4620490768 Commit from m3o/m3o action 2021-12-15 11:26:16 +00:00
m3o-actions
114a758381 Commit from m3o/m3o action 2021-12-15 11:22:20 +00:00
Asim Aslam
56f6f1b226 remove vote endpoint 2021-12-15 11:17:17 +00:00
m3o-actions
669c89d2ce Commit from m3o/m3o action 2021-12-15 10:55:54 +00:00
m3o-actions
1ba6f0112e Commit from m3o/m3o action 2021-12-15 10:49:43 +00:00
m3o-actions
683ed620f6 Commit from m3o/m3o action 2021-12-15 10:21:49 +00:00
m3o-actions
f456c792e3 Commit from m3o/m3o action 2021-12-15 10:18:05 +00:00
m3o-actions
501ad85d89 Commit from m3o/m3o action 2021-12-15 10:07:27 +00:00
m3o-actions
f5ac2484b1 Commit from m3o/m3o action 2021-12-15 09:51:05 +00:00
m3o-actions
ffe83a0e6b Commit from m3o/m3o action 2021-12-15 09:21:40 +00:00
m3o-actions
a27ae23ef5 Commit from m3o/m3o action 2021-12-15 09:07:31 +00:00
m3o-actions
3268e8b833 Commit from m3o/m3o action 2021-12-14 14:45:32 +00:00
m3o-actions
f4d0b1d660 Commit from m3o/m3o action 2021-12-14 14:42:56 +00:00
m3o-actions
ed69c094ef Commit from m3o/m3o action 2021-12-14 13:41:34 +00:00
m3o-actions
f98122a9dd Commit from m3o/m3o action 2021-12-14 12:51:59 +00:00
m3o-actions
ec54c879cb Commit from m3o/m3o action 2021-12-14 12:41:29 +00:00
m3o-actions
44073d45ca Commit from m3o/m3o action 2021-12-14 12:40:38 +00:00
m3o-actions
06105ec3b9 Commit from m3o/m3o action 2021-12-14 12:19:31 +00:00
m3o-actions
0c476e33bd Commit from m3o/m3o action 2021-12-14 12:15:33 +00:00
m3o-actions
8241c345fb Commit from m3o/m3o action 2021-12-14 11:08:30 +00:00
m3o-actions
0eb39e2461 Commit from m3o/m3o action 2021-12-14 11:00:00 +00:00
m3o-actions
8ce3354f04 Commit from m3o/m3o action 2021-12-14 10:54:12 +00:00
m3o-actions
f5475a5170 Commit from m3o/m3o action 2021-12-14 10:52:37 +00:00
m3o-actions
90e94ef592 Commit from m3o/m3o action 2021-12-14 10:51:48 +00:00
m3o-actions
03c04de4f0 Commit from m3o/m3o action 2021-12-14 09:48:42 +00:00
m3o-actions
06389f6ad6 Commit from m3o/m3o action 2021-12-14 09:14:36 +00:00
m3o-actions
7a11bb07da Commit from m3o/m3o action 2021-12-13 21:11:39 +00:00
m3o-actions
aa8a17a47c Commit from m3o/m3o action 2021-12-13 20:45:04 +00:00
m3o-actions
0310b8e3df Commit from m3o/m3o action 2021-12-13 18:58:10 +00:00
m3o-actions
e6a0e215ab Commit from m3o/m3o action 2021-12-13 18:52:15 +00:00
m3o-actions
e649f76975 Commit from m3o/m3o action 2021-12-13 18:51:36 +00:00
m3o-actions
2b8e5d7870 Commit from m3o/m3o action 2021-12-13 17:08:03 +00:00
m3o-actions
23de678eeb Commit from m3o/m3o action 2021-12-13 17:04:45 +00:00
m3o-actions
9a662c1dcc Commit from m3o/m3o action 2021-12-13 16:12:03 +00:00
m3o-actions
8a940fae02 Commit from m3o/m3o action 2021-12-13 15:29:27 +00:00
m3o-actions
fdcfcfd347 Commit from m3o/m3o action 2021-12-13 15:23:30 +00:00
m3o-actions
65df1a1342 Commit from m3o/m3o action 2021-12-13 15:22:21 +00:00
m3o-actions
93e6f9f01d Commit from m3o/m3o action 2021-12-13 15:16:03 +00:00
m3o-actions
b84d5933b9 Commit from m3o/m3o action 2021-12-13 14:58:15 +00:00
m3o-actions
f8e430b5a7 Commit from m3o/m3o action 2021-12-13 14:05:31 +00:00
m3o-actions
244d46bb05 Commit from m3o/m3o action 2021-12-13 14:04:45 +00:00
m3o-actions
6e4709f6fc Commit from m3o/m3o action 2021-12-13 13:51:50 +00:00
m3o-actions
4a6f0939d7 Commit from m3o/m3o action 2021-12-13 13:51:33 +00:00
m3o-actions
d287d1f1bd Commit from m3o/m3o action 2021-12-13 13:27:04 +00:00
m3o-actions
7fadd2533d Commit from m3o/m3o action 2021-12-13 13:24:59 +00:00
m3o-actions
ea14846c46 Commit from m3o/m3o action 2021-12-13 13:24:43 +00:00
m3o-actions
f6e156bc79 Commit from m3o/m3o action 2021-12-13 13:22:24 +00:00
m3o-actions
e5a5c4e65b Commit from m3o/m3o action 2021-12-13 13:16:18 +00:00
m3o-actions
792375ce99 Commit from m3o/m3o action 2021-12-13 13:08:22 +00:00
m3o-actions
f199e7ce48 Commit from m3o/m3o action 2021-12-13 12:27:50 +00:00
m3o-actions
72e5d61a4f Commit from m3o/m3o action 2021-12-13 12:26:36 +00:00
m3o-actions
01c65269af Commit from m3o/m3o action 2021-12-13 11:17:00 +00:00
m3o-actions
cde5ee4b4a Commit from m3o/m3o action 2021-12-12 09:32:32 +00:00
m3o-actions
a803ac6cb2 Commit from m3o/m3o action 2021-12-11 20:56:19 +00:00
m3o-actions
4bf0f8117b Commit from m3o/m3o action 2021-12-11 20:53:26 +00:00
m3o-actions
83576d7c80 Commit from m3o/m3o action 2021-12-11 20:32:22 +00:00
m3o-actions
72d0bf6e92 Commit from m3o/m3o action 2021-12-11 20:28:22 +00:00
m3o-actions
f3af48b74a Commit from m3o/m3o action 2021-12-11 20:27:08 +00:00
m3o-actions
a411a0357f Commit from m3o/m3o action 2021-12-11 08:24:45 +00:00
m3o-actions
1768e5a808 Commit from m3o/m3o action 2021-12-10 20:49:19 +00:00
m3o-actions
c0d2552cbd Commit from m3o/m3o action 2021-12-10 20:47:33 +00:00
m3o-actions
768b2ff48a Commit from m3o/m3o action 2021-12-10 20:41:32 +00:00
m3o-actions
5b868b14a1 Commit from m3o/m3o action 2021-12-10 17:19:51 +00:00
m3o-actions
05bd1cc019 Commit from m3o/m3o action 2021-12-10 16:48:02 +00:00
m3o-actions
d43cef6a73 Commit from m3o/m3o action 2021-12-10 16:24:17 +00:00
m3o-actions
d553a75980 Commit from m3o/m3o action 2021-12-10 16:17:36 +00:00
m3o-actions
075ce9c66d Commit from m3o/m3o action 2021-12-10 16:03:26 +00:00
m3o-actions
14f8578107 Commit from m3o/m3o action 2021-12-10 15:55:39 +00:00
m3o-actions
ee1e2f343f Commit from m3o/m3o action 2021-12-10 15:51:57 +00:00
m3o-actions
d1d2e772b1 Commit from m3o/m3o action 2021-12-10 15:49:58 +00:00
m3o-actions
39c260aa7d Commit from m3o/m3o action 2021-12-10 15:48:00 +00:00
m3o-actions
df2e3791f8 Commit from m3o/m3o action 2021-12-10 15:47:28 +00:00
m3o-actions
b438949b74 Commit from m3o/m3o action 2021-12-10 15:45:38 +00:00
m3o-actions
522d1cfddf Commit from m3o/m3o action 2021-12-10 15:44:12 +00:00
m3o-actions
99dd48cf66 Commit from m3o/m3o action 2021-12-10 15:30:19 +00:00
m3o-actions
17032521e6 Commit from m3o/m3o action 2021-12-10 14:54:50 +00:00
m3o-actions
641305066b Commit from m3o/m3o action 2021-12-10 14:43:35 +00:00
m3o-actions
05f5fd60de Commit from m3o/m3o action 2021-12-10 12:59:08 +00:00
m3o-actions
9b6b287efd Commit from m3o/m3o action 2021-12-10 12:20:58 +00:00
m3o-actions
fb17d4eeb8 Commit from m3o/m3o action 2021-12-10 11:37:47 +00:00
m3o-actions
9e505ad6fd Commit from m3o/m3o action 2021-12-10 11:29:30 +00:00
m3o-actions
c9f71d2779 Commit from m3o/m3o action 2021-12-10 11:27:29 +00:00
m3o-actions
d792a8407f Commit from m3o/m3o action 2021-12-10 11:19:12 +00:00
m3o-actions
f55142f3fd Commit from m3o/m3o action 2021-12-10 11:12:15 +00:00
m3o-actions
77e5eeb9d0 Commit from m3o/m3o action 2021-12-10 10:54:08 +00:00
m3o-actions
6e56e7fb79 Commit from m3o/m3o action 2021-12-10 10:53:08 +00:00
m3o-actions
4cfcb489f5 Commit from m3o/m3o action 2021-12-10 10:39:35 +00:00
m3o-actions
fbd3cc92b8 Commit from m3o/m3o action 2021-12-10 10:32:30 +00:00
m3o-actions
d31537fab5 Commit from m3o/m3o action 2021-12-10 10:19:18 +00:00
m3o-actions
3b138131a9 Commit from m3o/m3o action 2021-12-10 10:01:12 +00:00
m3o-actions
620ee63c4f Commit from m3o/m3o action 2021-12-10 09:30:33 +00:00
m3o-actions
6a2dd1866b Commit from m3o/m3o action 2021-12-10 09:22:42 +00:00
m3o-actions
71c5bb6e03 Commit from m3o/m3o action 2021-12-10 09:21:48 +00:00
m3o-actions
3b8a75307d Commit from m3o/m3o action 2021-12-09 21:21:57 +00:00
m3o-actions
43846051bf Commit from m3o/m3o action 2021-12-09 21:19:25 +00:00
m3o-actions
84a5ed29c6 Commit from m3o/m3o action 2021-12-09 21:14:57 +00:00
m3o-actions
0d54e22630 Commit from m3o/m3o action 2021-12-09 20:31:03 +00:00
m3o-actions
8fd93d33a8 Commit from m3o/m3o action 2021-12-09 20:27:04 +00:00
m3o-actions
633b2dc986 Commit from m3o/m3o action 2021-12-09 20:01:23 +00:00
m3o-actions
9726537930 Commit from m3o/m3o action 2021-12-09 18:15:58 +00:00
m3o-actions
a7335378e5 Commit from m3o/m3o action 2021-12-09 16:49:13 +00:00
m3o-actions
11ea4be31e Commit from m3o/m3o action 2021-12-09 16:43:56 +00:00
m3o-actions
cbee5fbe46 Commit from m3o/m3o action 2021-12-09 16:37:46 +00:00
m3o-actions
87645bef95 Commit from m3o/m3o action 2021-12-09 16:37:37 +00:00
m3o-actions
fbb3b8b37f Commit from m3o/m3o action 2021-12-09 16:28:59 +00:00
m3o-actions
c578c665fb Commit from m3o/m3o action 2021-12-09 16:03:02 +00:00
m3o-actions
192963e19e Commit from m3o/m3o action 2021-12-09 15:56:25 +00:00
m3o-actions
f6a6c065b1 Commit from m3o/m3o action 2021-12-09 15:06:12 +00:00
m3o-actions
92edd2c7df Commit from m3o/m3o action 2021-12-09 15:03:36 +00:00
m3o-actions
6f04af332e Commit from m3o/m3o action 2021-12-09 15:02:43 +00:00
m3o-actions
e6a4ba7a6a Commit from m3o/m3o action 2021-12-09 14:49:22 +00:00
m3o-actions
8245cf14ad Commit from m3o/m3o action 2021-12-09 14:32:12 +00:00
m3o-actions
d310afaf59 Commit from m3o/m3o action 2021-12-09 14:20:17 +00:00
m3o-actions
ead8a52c00 Commit from m3o/m3o action 2021-12-09 14:18:03 +00:00
m3o-actions
44959a42ae Commit from m3o/m3o action 2021-12-09 13:41:13 +00:00
m3o-actions
9400bd92ed Commit from m3o/m3o action 2021-12-09 13:28:25 +00:00
m3o-actions
f3ad0d0a31 Commit from m3o/m3o action 2021-12-09 13:16:27 +00:00
m3o-actions
c85190845b Commit from m3o/m3o action 2021-12-09 11:26:07 +00:00
Asim Aslam
f3960b5942 Remove space vote 2021-12-09 11:18:52 +00:00
m3o-actions
14bf65c01b Commit from m3o/m3o action 2021-12-09 10:53:29 +00:00
m3o-actions
c246e99019 Commit from m3o/m3o action 2021-12-09 10:29:13 +00:00
m3o-actions
945dd22f3f Commit from m3o/m3o action 2021-12-08 18:02:09 +00:00
m3o-actions
9f36bc2691 Commit from m3o/m3o action 2021-12-08 14:53:42 +00:00
m3o-actions
eca42fbc54 Commit from m3o/m3o action 2021-12-08 14:43:43 +00:00
m3o-actions
ba04dfd77e Commit from m3o/m3o action 2021-12-08 14:26:17 +00:00
Asim Aslam
af45cd2894 remove nft vote endpoint 2021-12-08 14:22:33 +00:00
m3o-actions
0a74e37b3d Commit from m3o/m3o action 2021-12-08 14:05:05 +00:00
m3o-actions
3e76b80858 Commit from m3o/m3o action 2021-12-08 12:22:21 +00:00
m3o-actions
40fb1aabc2 Commit from m3o/m3o action 2021-12-08 12:18:50 +00:00
m3o-actions
2166a3322f Commit from m3o/m3o action 2021-12-08 11:26:11 +00:00
m3o-actions
f7d1a4e72a Commit from m3o/m3o action 2021-12-08 11:21:57 +00:00
m3o-actions
717896adeb Commit from m3o/m3o action 2021-12-08 11:03:41 +00:00
m3o-actions
614e6f96d5 Commit from m3o/m3o action 2021-12-08 11:03:07 +00:00
m3o-actions
884146ef30 Commit from m3o/m3o action 2021-12-08 11:02:02 +00:00
m3o-actions
041d77e930 Commit from m3o/m3o action 2021-12-08 11:01:23 +00:00
m3o-actions
2148ec979a Commit from m3o/m3o action 2021-12-08 11:00:40 +00:00
m3o-actions
6ebb0a6fc0 Commit from m3o/m3o action 2021-12-08 11:00:14 +00:00
m3o-actions
a2297b4940 Commit from m3o/m3o action 2021-12-08 10:59:48 +00:00
m3o-actions
54ac1d7b5e Commit from m3o/m3o action 2021-12-08 10:59:06 +00:00
m3o-actions
5d4497ce02 Commit from m3o/m3o action 2021-12-08 10:57:18 +00:00
m3o-actions
5cf1b55904 Commit from m3o/m3o action 2021-12-08 10:55:57 +00:00
m3o-actions
4b1ca7d2cf Commit from m3o/m3o action 2021-12-08 10:55:53 +00:00
m3o-actions
18f89d3897 Commit from m3o/m3o action 2021-12-08 10:41:28 +00:00
m3o-actions
e56ccf9c5a Commit from m3o/m3o action 2021-12-07 14:20:21 +00:00
m3o-actions
21d79de877 Commit from m3o/m3o action 2021-12-07 13:05:17 +00:00
m3o-actions
99efab9e84 Commit from m3o/m3o action 2021-12-07 12:56:51 +00:00
m3o-actions
17969ed728 Commit from m3o/m3o action 2021-12-07 11:38:27 +00:00
m3o-actions
18bb483c19 Commit from m3o/m3o action 2021-12-07 11:36:32 +00:00
m3o-actions
2df19f48f9 Commit from m3o/m3o action 2021-12-07 11:30:32 +00:00
m3o-actions
1fd95a1ba2 Commit from m3o/m3o action 2021-12-07 11:27:50 +00:00
m3o-actions
d561c13a96 Commit from m3o/m3o action 2021-12-07 11:17:50 +00:00
m3o-actions
a40743588f Commit from m3o/m3o action 2021-12-06 16:40:26 +00:00
m3o-actions
ba5525397e Commit from m3o/m3o action 2021-12-04 22:37:52 +00:00
m3o-actions
8cb1bd3b0e Commit from m3o/m3o action 2021-12-04 22:25:26 +00:00
m3o-actions
bb37bc2303 Commit from m3o/m3o action 2021-12-04 22:22:13 +00:00
m3o-actions
952eefa075 Commit from m3o/m3o action 2021-12-03 17:02:26 +00:00
m3o-actions
ce4bf96d24 Commit from m3o/m3o action 2021-12-03 16:43:14 +00:00
m3o-actions
38ca628ece Commit from m3o/m3o action 2021-12-03 16:26:46 +00:00
m3o-actions
f18524b9be Commit from m3o/m3o action 2021-12-03 09:39:03 +00:00
m3o-actions
440ace2ff1 Commit from m3o/m3o action 2021-12-02 18:29:24 +00:00
m3o-actions
e8b0af2e55 Commit from m3o/m3o action 2021-12-02 18:28:04 +00:00
m3o-actions
0b38412bf3 Commit from m3o/m3o action 2021-12-02 16:51:01 +00:00
m3o-actions
b9768eb8b7 Commit from m3o/m3o action 2021-12-02 16:02:08 +00:00
m3o-actions
e7e04b4dc6 Commit from m3o/m3o action 2021-12-02 15:58:50 +00:00
m3o-actions
699b61e7c0 Commit from m3o/m3o action 2021-12-02 13:38:03 +00:00
m3o-actions
4cb3a27308 Commit from m3o/m3o action 2021-12-02 13:36:47 +00:00
m3o-actions
0f075f596c Commit from m3o/m3o action 2021-12-02 13:36:29 +00:00
m3o-actions
e474140446 Commit from m3o/m3o action 2021-12-02 13:35:53 +00:00
m3o-actions
455cc584c1 Commit from m3o/m3o action 2021-12-02 13:34:34 +00:00
m3o-actions
f2720472ef Commit from m3o/m3o action 2021-12-02 13:28:38 +00:00
m3o-actions
e4d135221e Commit from m3o/m3o action 2021-12-02 13:28:35 +00:00
m3o-actions
ab6fda2a88 Commit from m3o/m3o action 2021-12-02 13:26:57 +00:00
m3o-actions
949f7358ae Commit from m3o/m3o action 2021-12-02 13:26:09 +00:00
m3o-actions
e92b8761e4 Commit from m3o/m3o action 2021-12-02 13:24:47 +00:00
m3o-actions
e480f7b75e Commit from m3o/m3o action 2021-12-02 13:23:56 +00:00
m3o-actions
f72459c80c Commit from m3o/m3o action 2021-12-02 13:23:38 +00:00
m3o-actions
4eaec6494d Commit from m3o/m3o action 2021-12-02 13:16:07 +00:00
m3o-actions
ff8579bd7b Commit from m3o/m3o action 2021-12-02 13:15:54 +00:00
m3o-actions
d7a2a7192c Commit from m3o/m3o action 2021-12-02 13:12:55 +00:00
m3o-actions
9484560933 Commit from m3o/m3o action 2021-12-02 13:10:12 +00:00
m3o-actions
4d9f2537b3 Commit from m3o/m3o action 2021-12-02 13:10:10 +00:00
m3o-actions
4ad39a9390 Commit from m3o/m3o action 2021-12-02 13:08:42 +00:00
m3o-actions
6e90e55833 Commit from m3o/m3o action 2021-12-02 13:08:15 +00:00
m3o-actions
e0df52d52d Commit from m3o/m3o action 2021-12-02 13:06:38 +00:00
m3o-actions
85d2609a1a Commit from m3o/m3o action 2021-12-02 13:05:01 +00:00
m3o-actions
9daed33d8c Commit from m3o/m3o action 2021-12-02 13:04:36 +00:00
m3o-actions
381437bc3e Commit from m3o/m3o action 2021-12-02 13:04:09 +00:00
m3o-actions
aebe1be645 Commit from m3o/m3o action 2021-12-02 13:03:04 +00:00
m3o-actions
7c4b2d3be8 Commit from m3o/m3o action 2021-12-02 08:35:08 +00:00
m3o-actions
dc4ea3ec58 Commit from m3o/m3o action 2021-12-02 08:27:08 +00:00
m3o-actions
59088be869 Commit from m3o/m3o action 2021-12-02 08:24:35 +00:00
m3o-actions
5c417658ba Commit from m3o/m3o action 2021-12-02 08:24:13 +00:00
m3o-actions
6635c69668 Commit from m3o/m3o action 2021-12-01 21:17:56 +00:00
m3o-actions
d37db98b30 Commit from m3o/m3o action 2021-12-01 21:10:14 +00:00
m3o-actions
470af2ef62 Commit from m3o/m3o action 2021-12-01 21:00:43 +00:00
m3o-actions
f80a59c744 Commit from m3o/m3o action 2021-12-01 18:57:58 +00:00
m3o-actions
c93f6ca3f8 Commit from m3o/m3o action 2021-12-01 18:47:57 +00:00
m3o-actions
fb09d21ee3 Commit from m3o/m3o action 2021-12-01 15:42:23 +00:00
m3o-actions
c72af16e84 Commit from m3o/m3o action 2021-12-01 15:41:49 +00:00
m3o-actions
82aff73527 Commit from m3o/m3o action 2021-12-01 15:11:15 +00:00
m3o-actions
f5a9559dd5 Commit from m3o/m3o action 2021-12-01 15:09:24 +00:00
m3o-actions
b74cd32327 Commit from m3o/m3o action 2021-12-01 15:05:34 +00:00
m3o-actions
f2acce6472 Commit from m3o/m3o action 2021-12-01 15:03:06 +00:00
m3o-actions
ca487399c4 Commit from m3o/m3o action 2021-12-01 14:57:12 +00:00
m3o-actions
804c7c268f Commit from m3o/m3o action 2021-12-01 14:26:37 +00:00
m3o-actions
7f887c0e5c Commit from m3o/m3o action 2021-12-01 14:23:00 +00:00
m3o-actions
5280b7371d Commit from m3o/m3o action 2021-12-01 14:08:42 +00:00
m3o-actions
ef81a4f249 Commit from m3o/m3o action 2021-12-01 14:00:44 +00:00
m3o-actions
c07c3d2c56 Commit from m3o/m3o action 2021-12-01 13:58:11 +00:00
m3o-actions
b7d260f835 Commit from m3o/m3o action 2021-12-01 13:29:26 +00:00
m3o-actions
244317372a Commit from m3o/m3o action 2021-12-01 13:24:18 +00:00
m3o-actions
e155efc8bc Commit from m3o/m3o action 2021-12-01 12:18:42 +00:00
m3o-actions
170212b863 Commit from m3o/m3o action 2021-12-01 12:01:26 +00:00
m3o-actions
981643b54e Commit from m3o/m3o action 2021-12-01 12:00:37 +00:00
m3o-actions
49b020b77d Commit from m3o/m3o action 2021-12-01 11:48:26 +00:00
m3o-actions
a0c2f0e902 Commit from m3o/m3o action 2021-12-01 11:36:12 +00:00
m3o-actions
ecd3cd917e Commit from m3o/m3o action 2021-12-01 11:35:02 +00:00
m3o-actions
cc85c6fecb Commit from m3o/m3o action 2021-12-01 11:34:27 +00:00
m3o-actions
214ee72d62 Commit from m3o/m3o action 2021-12-01 11:34:07 +00:00
m3o-actions
0c5b55927a Commit from m3o/m3o action 2021-12-01 11:32:51 +00:00
m3o-actions
b33cea5122 Commit from m3o/m3o action 2021-12-01 11:31:56 +00:00
m3o-actions
f3206ed31c Commit from m3o/m3o action 2021-12-01 11:04:27 +00:00
m3o-actions
149807a75c Commit from m3o/m3o action 2021-12-01 09:21:49 +00:00
m3o-actions
612fc2de62 Commit from m3o/m3o action 2021-11-30 21:41:21 +00:00
m3o-actions
9b283db5fe Commit from m3o/m3o action 2021-11-30 21:38:52 +00:00
m3o-actions
042289cc6f Commit from m3o/m3o action 2021-11-30 10:34:26 +00:00
m3o-actions
4db6e7b4ba Commit from m3o/m3o action 2021-11-30 10:33:26 +00:00
m3o-actions
322b0a4106 Commit from m3o/m3o action 2021-11-30 10:07:29 +00:00
m3o-actions
3f4c3f86df Commit from m3o/m3o action 2021-11-29 13:51:59 +00:00
m3o-actions
eda3404230 Commit from m3o/m3o action 2021-11-29 13:50:50 +00:00
m3o-actions
ec4c8a74bb Commit from m3o/m3o action 2021-11-29 13:50:07 +00:00
m3o-actions
21b52c415d Commit from m3o/m3o action 2021-11-29 13:49:55 +00:00
m3o-actions
762c2c0fe1 Commit from m3o/m3o action 2021-11-29 10:04:20 +00:00
m3o-actions
96a4f54d29 Commit from m3o/m3o action 2021-11-29 10:04:08 +00:00
m3o-actions
85b2a409d1 Commit from m3o/m3o action 2021-11-29 10:03:15 +00:00
m3o-actions
0f3166d4e8 Commit from m3o/m3o action 2021-11-29 10:02:08 +00:00
m3o-actions
d814c2acf7 Commit from m3o/m3o action 2021-11-29 10:01:31 +00:00
m3o-actions
8c56ab81dc Commit from m3o/m3o action 2021-11-29 10:01:21 +00:00
m3o-actions
f5c0e5528e Commit from m3o/m3o action 2021-11-28 15:24:25 +00:00
m3o-actions
672f12a626 Commit from m3o/m3o action 2021-11-28 15:24:13 +00:00
m3o-actions
bb625c5e27 Commit from m3o/m3o action 2021-11-28 15:16:46 +00:00
m3o-actions
dceb4a3d15 Commit from m3o/m3o action 2021-11-28 13:03:55 +00:00
m3o-actions
0989ba261d Commit from m3o/m3o action 2021-11-28 13:02:34 +00:00
m3o-actions
a22808668d Commit from m3o/m3o action 2021-11-28 13:01:57 +00:00
m3o-actions
678101a8c1 Commit from m3o/m3o action 2021-11-28 13:01:30 +00:00
m3o-actions
272b9b9ec4 Commit from m3o/m3o action 2021-11-26 16:06:46 +00:00
m3o-actions
ede720bbcc Commit from m3o/m3o action 2021-11-26 15:46:26 +00:00
m3o-actions
b581d55bab Commit from m3o/m3o action 2021-11-26 12:57:45 +00:00
m3o-actions
1232a8904f Commit from m3o/m3o action 2021-11-26 12:50:18 +00:00
m3o-actions
81c307da6f Commit from m3o/m3o action 2021-11-26 12:45:31 +00:00
m3o-actions
dac0425b2a Commit from m3o/m3o action 2021-11-26 12:42:49 +00:00
m3o-actions
06ef8db313 Commit from m3o/m3o action 2021-11-26 12:42:17 +00:00
m3o-actions
5b47bd8d20 Commit from m3o/m3o action 2021-11-26 12:39:33 +00:00
m3o-actions
8b220a4f84 Commit from m3o/m3o action 2021-11-26 12:38:58 +00:00
m3o-actions
87630a4bfd Commit from m3o/m3o action 2021-11-26 12:34:00 +00:00
m3o-actions
8e682f8359 Commit from m3o/m3o action 2021-11-26 11:50:41 +00:00
m3o-actions
6506023057 Commit from m3o/m3o action 2021-11-26 11:49:08 +00:00
m3o-actions
c531597f93 Commit from m3o/m3o action 2021-11-26 11:14:55 +00:00
m3o-actions
0547d347c4 Commit from m3o/m3o action 2021-11-26 11:14:49 +00:00
m3o-actions
1084761795 Commit from m3o/m3o action 2021-11-26 11:04:53 +00:00
m3o-actions
6ce71d618e Commit from m3o/m3o action 2021-11-26 11:01:00 +00:00
m3o-actions
8ba89dded0 Commit from m3o/m3o action 2021-11-26 10:59:48 +00:00
m3o-actions
7448f9c556 Commit from m3o/m3o action 2021-11-26 10:47:45 +00:00
m3o-actions
15b0ea2d2c Commit from m3o/m3o action 2021-11-26 10:33:54 +00:00
m3o-actions
04883e7c8c Commit from m3o/m3o action 2021-11-26 10:16:51 +00:00
m3o-actions
9e1a6baeb8 Commit from m3o/m3o action 2021-11-25 21:44:09 +00:00
m3o-actions
c680a1c055 Commit from m3o/m3o action 2021-11-24 17:45:32 +00:00
m3o-actions
36b779de0d Commit from m3o/m3o action 2021-11-24 11:51:13 +00:00
m3o-actions
0c995edf26 Commit from m3o/m3o action 2021-11-24 11:49:42 +00:00
m3o-actions
8d7ad0b58b Commit from m3o/m3o action 2021-11-24 10:57:36 +00:00
m3o-actions
321c5b9f6f Commit from m3o/m3o action 2021-11-24 10:48:06 +00:00
m3o-actions
3f9e5d8723 Commit from m3o/m3o action 2021-11-24 10:46:51 +00:00
m3o-actions
faf22546b7 Commit from m3o/m3o action 2021-11-23 12:56:15 +00:00
m3o-actions
a083415879 Commit from m3o/m3o action 2021-11-23 12:49:06 +00:00
m3o-actions
cd45d400fb Commit from m3o/m3o action 2021-11-22 19:02:08 +00:00
m3o-actions
bb36584e1a Commit from m3o/m3o action 2021-11-22 15:40:26 +00:00
m3o-actions
894cd4e923 Commit from m3o/m3o action 2021-11-22 15:29:39 +00:00
m3o-actions
39f8d5f3fb Commit from m3o/m3o action 2021-11-22 15:25:16 +00:00
m3o-actions
54c8f9dcb6 Commit from m3o/m3o action 2021-11-22 15:24:12 +00:00
m3o-actions
a51bd71f2d Commit from m3o/m3o action 2021-11-22 15:22:24 +00:00
m3o-actions
3ea8266db8 Commit from m3o/m3o action 2021-11-22 15:20:49 +00:00
m3o-actions
230e477ceb Commit from m3o/m3o action 2021-11-22 15:17:40 +00:00
m3o-actions
5575045afe Commit from m3o/m3o action 2021-11-22 15:16:21 +00:00
m3o-actions
538c015b32 Commit from m3o/m3o action 2021-11-22 15:13:24 +00:00
m3o-actions
f799ac0771 Commit from m3o/m3o action 2021-11-22 15:12:37 +00:00
m3o-actions
2de1245364 Commit from m3o/m3o action 2021-11-22 15:03:59 +00:00
m3o-actions
6ab7deb939 Commit from m3o/m3o action 2021-11-22 15:03:08 +00:00
m3o-actions
82e3f11c72 Commit from m3o/m3o action 2021-11-22 15:01:25 +00:00
m3o-actions
7a74865089 Commit from m3o/m3o action 2021-11-22 15:00:17 +00:00
m3o-actions
0231fe345f Commit from m3o/m3o action 2021-11-22 14:28:24 +00:00
m3o-actions
96d7eb54ed Commit from m3o/m3o action 2021-11-22 12:57:29 +00:00
m3o-actions
65ce64530e Commit from m3o/m3o action 2021-11-22 12:56:40 +00:00
m3o-actions
dd6aa87548 Commit from m3o/m3o action 2021-11-22 12:53:58 +00:00
m3o-actions
ee8da57912 Commit from m3o/m3o action 2021-11-22 12:50:36 +00:00
m3o-actions
0096558263 Commit from m3o/m3o action 2021-11-22 12:48:56 +00:00
m3o-actions
ed691ec515 Commit from m3o/m3o action 2021-11-22 12:25:01 +00:00
m3o-actions
c2fb06ae73 Commit from m3o/m3o action 2021-11-21 09:49:14 +00:00
m3o-actions
3d54b046da Commit from m3o/m3o action 2021-11-21 09:49:01 +00:00
m3o-actions
d33dbbf317 Commit from m3o/m3o action 2021-11-21 09:48:05 +00:00
m3o-actions
77a58e78bd Commit from m3o/m3o action 2021-11-19 14:29:44 +00:00
m3o-actions
c18f47ca4c Commit from m3o/m3o action 2021-11-19 12:14:30 +00:00
m3o-actions
33398d3eb8 Commit from m3o/m3o action 2021-11-19 11:58:09 +00:00
m3o-actions
bb46995e2f Commit from m3o/m3o action 2021-11-19 11:29:01 +00:00
m3o-actions
9c534ced3d Commit from m3o/m3o action 2021-11-19 11:06:58 +00:00
m3o-actions
15c55dec36 Commit from m3o/m3o action 2021-11-19 10:54:21 +00:00
m3o-actions
fb13c684fd Commit from m3o/m3o action 2021-11-18 13:50:00 +00:00
m3o-actions
65c906fbdc Commit from m3o/m3o action 2021-11-18 13:06:17 +00:00
m3o-actions
c362c676b2 Commit from m3o/m3o action 2021-11-18 13:02:12 +00:00
m3o-actions
9702ed5306 Commit from m3o/m3o action 2021-11-18 13:01:10 +00:00
m3o-actions
afe052b320 Commit from m3o/m3o action 2021-11-18 12:49:57 +00:00
Asim Aslam
a7879d3ff0 in travis test flag 2021-11-18 08:33:36 +00:00
Asim Aslam
45d3c6a791 remove broken examples 2021-11-18 08:32:29 +00:00
Asim Aslam
3760aaf9dd remove broken examples 2021-11-18 08:32:04 +00:00
m3o-actions
3953482915 Commit from m3o/m3o action 2021-11-17 22:21:48 +00:00
m3o-actions
9864b467b8 Commit from m3o/m3o action 2021-11-17 20:29:20 +00:00
m3o-actions
675871d282 Commit from m3o/m3o action 2021-11-17 20:17:39 +00:00
m3o-actions
3ac4947f91 Commit from m3o/m3o action 2021-11-17 20:15:24 +00:00
m3o-actions
3167558049 Commit from m3o/m3o action 2021-11-17 19:49:10 +00:00
m3o-actions
2958807fe2 Commit from m3o/m3o action 2021-11-17 16:59:11 +00:00
m3o-actions
8e553f6e16 Commit from m3o/m3o action 2021-11-17 16:56:17 +00:00
m3o-actions
bc769baed5 Commit from m3o/m3o action 2021-11-17 16:55:33 +00:00
m3o-actions
2ca79f5288 Commit from m3o/m3o action 2021-11-17 16:53:57 +00:00
m3o-actions
a22b8a3053 Commit from m3o/m3o action 2021-11-17 16:53:35 +00:00
m3o-actions
fd05c41d21 Commit from m3o/m3o action 2021-11-17 16:50:32 +00:00
m3o-actions
9bfc15e14a Commit from m3o/m3o action 2021-11-17 16:39:54 +00:00
m3o-actions
b522b298f3 Commit from m3o/m3o action 2021-11-17 16:29:53 +00:00
m3o-actions
14d247a66c Commit from m3o/m3o action 2021-11-17 12:37:29 +00:00
m3o-actions
ef2606dc60 Commit from m3o/m3o action 2021-11-17 12:28:02 +00:00
m3o-actions
be8f5aeae4 Commit from m3o/m3o action 2021-11-17 12:27:15 +00:00
m3o-actions
8dcea9e986 Commit from m3o/m3o action 2021-11-17 11:37:31 +00:00
m3o-actions
af0c644ac3 Commit from m3o/m3o action 2021-11-17 11:10:07 +00:00
m3o-actions
ebd60b1d5c Commit from m3o/m3o action 2021-11-17 10:49:59 +00:00
m3o-actions
38d4ff491f Commit from m3o/m3o action 2021-11-17 10:49:43 +00:00
m3o-actions
21395762be Commit from m3o/m3o action 2021-11-17 10:46:33 +00:00
m3o-actions
28a3532ecb Commit from m3o/m3o action 2021-11-17 10:43:23 +00:00
m3o-actions
7fec9491f1 Commit from m3o/m3o action 2021-11-17 10:34:05 +00:00
m3o-actions
ae8a49329f Commit from m3o/m3o action 2021-11-17 10:27:35 +00:00
m3o-actions
93af926271 Commit from m3o/m3o action 2021-11-17 10:20:05 +00:00
m3o-actions
40f0fb073d Commit from m3o/m3o action 2021-11-17 09:54:21 +00:00
m3o-actions
4c6a11492e Commit from m3o/m3o action 2021-11-17 09:06:03 +00:00
m3o-actions
e5f79370cd Commit from m3o/m3o action 2021-11-17 09:05:28 +00:00
m3o-actions
4e8f9de392 Commit from m3o/m3o action 2021-11-16 15:11:11 +00:00
m3o-actions
03b2b439e5 Commit from m3o/m3o action 2021-11-16 15:11:05 +00:00
m3o-actions
f1e6613177 Commit from m3o/m3o action 2021-11-16 14:48:52 +00:00
m3o-actions
ea7e43f6cd Commit from m3o/m3o action 2021-11-16 14:37:38 +00:00
m3o-actions
edd466a2f9 Commit from m3o/m3o action 2021-11-16 14:33:39 +00:00
m3o-actions
730ab1fa1e Commit from m3o/m3o action 2021-11-16 14:13:23 +00:00
m3o-actions
23dd049bf8 Commit from m3o/m3o action 2021-11-16 13:48:29 +00:00
m3o-actions
1947d31ee7 Commit from m3o/m3o action 2021-11-16 13:44:56 +00:00
m3o-actions
2b6719c9c6 Commit from m3o/m3o action 2021-11-16 13:40:43 +00:00
m3o-actions
00d34547f3 Commit from m3o/m3o action 2021-11-16 13:39:57 +00:00
m3o-actions
0f8436ce86 Commit from m3o/m3o action 2021-11-16 11:01:02 +00:00
m3o-actions
bb53f7cc48 Commit from m3o/m3o action 2021-11-16 10:46:34 +00:00
m3o-actions
9e5bed8e5a Commit from m3o/m3o action 2021-11-16 10:45:52 +00:00
m3o-actions
caac0f5355 Commit from m3o/m3o action 2021-11-16 10:36:24 +00:00
m3o-actions
5685e31a37 Commit from m3o/m3o action 2021-11-12 14:47:34 +00:00
m3o-actions
c43f57ce29 Commit from m3o/m3o action 2021-11-12 14:46:43 +00:00
m3o-actions
d9476960d4 Commit from m3o/m3o action 2021-11-11 23:36:13 +00:00
m3o-actions
3f583e059f Commit from m3o/m3o action 2021-11-11 23:27:10 +00:00
m3o-actions
bd1dcf3fed Commit from m3o/m3o action 2021-11-11 17:37:18 +00:00
m3o-actions
baff11e1d7 Commit from m3o/m3o action 2021-11-11 17:30:45 +00:00
m3o-actions
7c67ac14c2 Commit from m3o/m3o action 2021-11-11 17:12:21 +00:00
m3o-actions
fb8efda643 Commit from m3o/m3o action 2021-11-11 16:53:07 +00:00
m3o-actions
6fcd1d7028 Commit from m3o/m3o action 2021-11-11 16:30:48 +00:00
m3o-actions
02558a8f3f Commit from m3o/m3o action 2021-11-11 16:12:03 +00:00
m3o-actions
17f624b6a7 Commit from m3o/m3o action 2021-11-11 15:41:41 +00:00
m3o-actions
3f9d7cccf8 Commit from m3o/m3o action 2021-11-11 15:36:49 +00:00
m3o-actions
cb7f8b3403 Commit from m3o/m3o action 2021-11-11 15:27:20 +00:00
m3o-actions
072d96b1ca Commit from m3o/m3o action 2021-11-11 14:10:13 +00:00
m3o-actions
03a7225806 Commit from m3o/m3o action 2021-11-11 14:07:57 +00:00
m3o-actions
1083f55216 Commit from m3o/m3o action 2021-11-11 13:56:57 +00:00
m3o-actions
bd469033e2 Commit from m3o/m3o action 2021-11-11 13:46:49 +00:00
m3o-actions
b5f58efe8b Commit from m3o/m3o action 2021-11-11 12:45:56 +00:00
m3o-actions
018e87a593 Commit from m3o/m3o action 2021-11-11 12:43:36 +00:00
m3o-actions
07312f010e Commit from m3o/m3o action 2021-11-11 12:39:10 +00:00
m3o-actions
2321fde555 Commit from m3o/m3o action 2021-11-11 12:17:40 +00:00
m3o-actions
be676eff6c Commit from m3o/m3o action 2021-11-11 12:09:26 +00:00
m3o-actions
9dcc428a55 Commit from m3o/m3o action 2021-11-11 12:05:26 +00:00
m3o-actions
b6d8111005 Commit from m3o/m3o action 2021-11-11 12:02:51 +00:00
m3o-actions
1e54e284f6 Commit from m3o/m3o action 2021-11-11 11:59:54 +00:00
m3o-actions
d31fde4be4 Commit from m3o/m3o action 2021-11-11 11:51:18 +00:00
m3o-actions
d2adcc0208 Commit from m3o/m3o action 2021-11-11 11:19:50 +00:00
m3o-actions
956adcbced Commit from m3o/m3o action 2021-11-11 11:09:27 +00:00
m3o-actions
fab7b1892d Commit from m3o/m3o action 2021-11-11 11:02:04 +00:00
m3o-actions
7d037fe871 Commit from m3o/m3o action 2021-11-11 11:00:15 +00:00
m3o-actions
53a197a685 Commit from m3o/m3o action 2021-11-11 10:57:32 +00:00
m3o-actions
a7586670e6 Commit from m3o/m3o action 2021-11-11 10:56:43 +00:00
m3o-actions
2b5509db64 Commit from m3o/m3o action 2021-11-11 10:55:40 +00:00
m3o-actions
03a720c4d0 Commit from m3o/m3o action 2021-11-11 10:54:44 +00:00
m3o-actions
581945da61 Commit from m3o/m3o action 2021-11-11 10:26:25 +00:00
m3o-actions
d27ecddd94 Commit from m3o/m3o action 2021-11-11 10:13:24 +00:00
m3o-actions
034d9aa5ac Commit from m3o/m3o action 2021-11-10 23:58:27 +00:00
m3o-actions
328997c217 Commit from m3o/m3o action 2021-11-10 22:29:50 +00:00
m3o-actions
f87a55000e Commit from m3o/m3o action 2021-11-10 22:17:37 +00:00
m3o-actions
5ec5e88b61 Commit from m3o/m3o action 2021-11-10 16:26:02 +00:00
m3o-actions
d664134226 Commit from m3o/m3o action 2021-11-10 16:21:04 +00:00
m3o-actions
20bb0adb52 Commit from m3o/m3o action 2021-11-10 16:16:45 +00:00
m3o-actions
b32923c69c Commit from m3o/m3o action 2021-11-10 16:15:20 +00:00
m3o-actions
bb8552ac72 Commit from m3o/m3o action 2021-11-10 16:00:58 +00:00
m3o-actions
2e2264a045 Commit from m3o/m3o action 2021-11-10 15:58:48 +00:00
m3o-actions
8fbc04d515 Commit from m3o/m3o action 2021-11-10 15:50:32 +00:00
m3o-actions
6c77e113d7 Commit from m3o/m3o action 2021-11-10 13:54:12 +00:00
m3o-actions
be500e861e Commit from m3o/m3o action 2021-11-10 13:11:50 +00:00
m3o-actions
8217b63c9a Commit from m3o/m3o action 2021-11-10 13:06:03 +00:00
m3o-actions
5e75ed6f44 Commit from m3o/m3o action 2021-11-10 12:39:48 +00:00
m3o-actions
3ea4ec9b77 Commit from m3o/m3o action 2021-11-10 12:37:48 +00:00
m3o-actions
6715cd7575 Commit from m3o/m3o action 2021-11-10 12:31:16 +00:00
m3o-actions
36fa586811 Commit from m3o/m3o action 2021-11-10 12:19:48 +00:00
m3o-actions
f3c2a87ba8 Commit from m3o/m3o action 2021-11-10 11:57:00 +00:00
m3o-actions
48a07e015a Commit from m3o/m3o action 2021-11-10 11:32:49 +00:00
m3o-actions
2deeb0ca70 Commit from m3o/m3o action 2021-11-10 11:05:04 +00:00
m3o-actions
1305ec64f5 Commit from m3o/m3o action 2021-11-10 10:55:08 +00:00
Janos Dobronszki
120c1cfe31 Run idempotent exaples as tests in CI (#7) 2021-11-10 09:37:45 +00:00
m3o-actions
3c1c9769fb Commit from m3o/m3o action 2021-11-10 09:21:08 +00:00
m3o-actions
9404bd621a Commit from m3o/m3o action 2021-11-10 09:20:30 +00:00
m3o-actions
429d8543ba Commit from m3o/m3o action 2021-11-10 09:16:45 +00:00
m3o-actions
0515ac3485 Commit from m3o/m3o action 2021-11-10 09:03:04 +00:00
m3o-actions
36ebf2726c Commit from m3o/m3o action 2021-11-10 07:02:27 +00:00
m3o-actions
13eb3a674c Commit from m3o/m3o action 2021-11-10 06:57:47 +00:00
m3o-actions
b724299623 Commit from m3o/m3o action 2021-11-10 06:57:03 +00:00
m3o-actions
a2eea8e982 Commit from m3o/m3o action 2021-11-09 15:01:52 +00:00
m3o-actions
b36641e39e Commit from m3o/m3o action 2021-11-09 11:39:14 +00:00
m3o-actions
e9f001a53c Commit from m3o/m3o action 2021-11-09 11:10:41 +00:00
m3o-actions
80c683fa2a Commit from m3o/m3o action 2021-11-09 10:50:05 +00:00
m3o-actions
7b1ff7cdba Commit from m3o/m3o action 2021-11-09 10:41:16 +00:00
m3o-actions
93b0465212 Commit from m3o/m3o action 2021-11-09 10:23:33 +00:00
m3o-actions
0c2f5b7138 Commit from m3o/m3o action 2021-11-09 10:11:09 +00:00
m3o-actions
0d4aacf4c1 Commit from m3o/m3o action 2021-11-09 09:59:49 +00:00
m3o-actions
3cd6a304e8 Commit from m3o/m3o action 2021-11-09 09:55:58 +00:00
m3o-actions
5ed7ec293a Commit from m3o/m3o action 2021-11-09 00:12:20 +00:00
m3o-actions
b69dce32b5 Commit from m3o/m3o action 2021-11-09 00:08:05 +00:00
m3o-actions
24a8774b65 Commit from m3o/m3o action 2021-11-08 23:58:17 +00:00
m3o-actions
c70c849348 Commit from m3o/m3o action 2021-11-08 23:56:42 +00:00
m3o-actions
48a87453db Commit from m3o/m3o action 2021-11-08 23:50:31 +00:00
m3o-actions
d02ff341b9 Commit from m3o/m3o action 2021-11-08 23:45:01 +00:00
m3o-actions
e357681055 Commit from m3o/m3o action 2021-11-08 23:38:39 +00:00
m3o-actions
01728ef128 Commit from m3o/m3o action 2021-11-08 23:25:53 +00:00
m3o-actions
57653a725d Commit from m3o/m3o action 2021-11-08 23:13:03 +00:00
m3o-actions
ceba4eac78 Commit from m3o/m3o action 2021-11-08 23:00:09 +00:00
m3o-actions
e2457aa0ef Commit from m3o/m3o action 2021-11-08 22:49:41 +00:00
m3o-actions
eff7396cfd Commit from m3o/m3o action 2021-11-08 22:16:22 +00:00
m3o-actions
b6914f82d4 Commit from m3o/m3o action 2021-11-08 22:05:24 +00:00
m3o-actions
e3e358df0b Commit from m3o/m3o action 2021-11-08 21:58:01 +00:00
m3o-actions
78900e379e Commit from m3o/m3o action 2021-11-08 17:01:54 +00:00
m3o-actions
39cf329baa Commit from m3o/m3o action 2021-11-08 15:54:16 +00:00
m3o-actions
c4df401021 Commit from m3o/m3o action 2021-11-08 15:42:22 +00:00
m3o-actions
7d5d0555b3 Commit from m3o/m3o action 2021-11-08 15:01:27 +00:00
m3o-actions
16e313b176 Commit from m3o/m3o action 2021-11-08 13:23:33 +00:00
m3o-actions
f5e55c81b0 Commit from m3o/m3o action 2021-11-08 11:36:04 +00:00
m3o-actions
d0307610bc Commit from m3o/m3o action 2021-11-08 10:59:15 +00:00
m3o-actions
cab87b9b3e Commit from m3o/m3o action 2021-11-05 22:42:46 +00:00
m3o-actions
c18a866b71 Commit from m3o/m3o action 2021-11-05 18:00:15 +00:00
m3o-actions
5f43c72002 Commit from m3o/m3o action 2021-11-05 17:23:25 +00:00
m3o-actions
d9c5465869 Commit from m3o/m3o action 2021-11-05 15:43:54 +00:00
m3o-actions
bf17b77f32 Commit from m3o/m3o action 2021-11-05 15:16:17 +00:00
m3o-actions
dc963b5c18 Commit from m3o/m3o action 2021-11-05 14:46:52 +00:00
m3o-actions
d0c9e6f959 Commit from m3o/m3o action 2021-11-05 14:46:11 +00:00
m3o-actions
87139ca743 Commit from m3o/m3o action 2021-11-05 14:44:14 +00:00
m3o-actions
c9438a2715 Commit from m3o/m3o action 2021-11-05 14:44:10 +00:00
m3o-actions
fcf0cacf5f Commit from m3o/m3o action 2021-11-05 12:06:56 +00:00
m3o-actions
dd375dcb39 Commit from m3o/m3o action 2021-11-04 22:07:58 +00:00
m3o-actions
df176092d8 Commit from m3o/m3o action 2021-11-04 14:40:35 +00:00
m3o-actions
5c96743ac2 Commit from m3o/m3o action 2021-11-04 12:19:32 +00:00
m3o-actions
2293c9ffcd Commit from m3o/m3o action 2021-11-04 12:12:06 +00:00
m3o-actions
6814ff2132 Commit from m3o/m3o action 2021-11-04 11:33:12 +00:00
m3o-actions
3b0248b764 Commit from m3o/m3o action 2021-11-04 10:31:23 +00:00
m3o-actions
b71caa6818 Commit from m3o/m3o action 2021-11-04 09:47:59 +00:00
m3o-actions
857cdfd2ad Commit from m3o/m3o action 2021-11-04 09:42:11 +00:00
m3o-actions
de3da7ad78 Commit from m3o/m3o action 2021-11-04 00:34:55 +00:00
m3o-actions
9661bd5ae1 Commit from m3o/m3o action 2021-11-04 00:31:43 +00:00
m3o-actions
4ffa2e1a25 Commit from m3o/m3o action 2021-11-03 23:56:08 +00:00
m3o-actions
bab7357a54 Commit from m3o/m3o action 2021-11-03 23:51:59 +00:00
m3o-actions
e5e197566d Commit from m3o/m3o action 2021-11-03 23:44:49 +00:00
m3o-actions
e256e24571 Commit from m3o/m3o action 2021-11-03 23:27:18 +00:00
m3o-actions
a72108fe32 Commit from m3o/m3o action 2021-11-03 22:01:40 +00:00
m3o-actions
a88d369ab2 Commit from m3o/m3o action 2021-11-03 22:01:12 +00:00
m3o-actions
784c4e4c37 Commit from m3o/m3o action 2021-11-03 21:55:24 +00:00
m3o-actions
2e374bf3b0 Commit from m3o/m3o action 2021-11-03 21:49:35 +00:00
m3o-actions
36ea54da44 Commit from m3o/m3o action 2021-11-03 21:44:16 +00:00
m3o-actions
6a5d769c70 Commit from m3o/m3o action 2021-11-03 17:09:53 +00:00
m3o-actions
5963caaa3f Commit from m3o/m3o action 2021-11-03 17:03:09 +00:00
m3o-actions
611202c283 Commit from m3o/m3o action 2021-11-03 16:59:37 +00:00
m3o-actions
1645b031e1 Commit from m3o/m3o action 2021-11-03 16:20:20 +00:00
m3o-actions
d87e334dca Commit from m3o/m3o action 2021-11-03 16:08:32 +00:00
m3o-actions
9a245d66ac Commit from m3o/m3o action 2021-11-03 15:50:29 +00:00
m3o-actions
7335a0576f Commit from m3o/m3o action 2021-11-03 15:36:34 +00:00
m3o-actions
aecab5372c Commit from m3o/m3o action 2021-11-03 15:16:55 +00:00
m3o-actions
a3f66cea0b Commit from m3o/m3o action 2021-11-03 14:15:29 +00:00
m3o-actions
2a5dc16cef Commit from m3o/m3o action 2021-11-03 14:12:51 +00:00
m3o-actions
3af01580b7 Commit from m3o/m3o action 2021-11-03 14:00:31 +00:00
m3o-actions
49e533797f Commit from m3o/m3o action 2021-11-03 11:49:43 +00:00
m3o-actions
2283f13e57 Commit from m3o/m3o action 2021-11-03 11:19:16 +00:00
Janos Dobronszki
e59c2bcc38 Add CI (#6) 2021-11-03 10:28:07 +00:00
m3o-actions
c6b213570b Commit from m3o/m3o action 2021-11-03 10:19:08 +00:00
m3o-actions
8e6e73a8eb Commit from m3o/m3o action 2021-11-02 19:13:21 +00:00
m3o-actions
075c121632 Commit from m3o/m3o action 2021-11-02 18:38:37 +00:00
m3o-actions
99e2f22d5b Commit from m3o/m3o action 2021-11-02 18:37:33 +00:00
m3o-actions
8623e7fec8 Commit from m3o/m3o action 2021-11-02 16:43:32 +00:00
m3o-actions
114660a002 Commit from m3o/m3o action 2021-11-02 16:31:05 +00:00
m3o-actions
913e2d609a Commit from m3o/m3o action 2021-11-02 16:01:40 +00:00
m3o-actions
ec70bb0b96 Commit from m3o/m3o action 2021-11-02 15:20:10 +00:00
m3o-actions
0e5e506abb Commit from m3o/m3o action 2021-11-02 15:15:35 +00:00
m3o-actions
96b0791847 Commit from m3o/m3o action 2021-11-02 14:59:05 +00:00
m3o-actions
15117f4033 Commit from m3o/m3o action 2021-11-02 14:55:18 +00:00
m3o-actions
716231b211 Commit from m3o/m3o action 2021-11-02 14:08:59 +00:00
m3o-actions
abbc8bcd49 Commit from m3o/m3o action 2021-11-02 14:08:34 +00:00
m3o-actions
c5f35e9f42 Commit from m3o/m3o action 2021-11-02 14:06:57 +00:00
m3o-actions
1b52b0f771 Commit from m3o/m3o action 2021-11-02 14:03:39 +00:00
m3o-actions
6533fdf6ff Commit from m3o/m3o action 2021-11-02 14:00:42 +00:00
m3o-actions
476fc61f51 Commit from m3o/m3o action 2021-11-02 13:52:46 +00:00
m3o-actions
fa2e8a5283 Commit from m3o/m3o action 2021-11-02 13:41:15 +00:00
m3o-actions
a8b7e20a0c Commit from m3o/m3o action 2021-11-02 13:31:19 +00:00
m3o-actions
d38b38c742 Commit from m3o/m3o action 2021-11-02 11:53:01 +00:00
m3o-actions
47e7a6709f Commit from m3o/m3o action 2021-11-02 11:49:54 +00:00
m3o-actions
68b5269093 Commit from m3o/m3o action 2021-11-02 11:36:55 +00:00
m3o-actions
4707018011 Commit from m3o/m3o action 2021-11-02 10:55:57 +00:00
m3o-actions
f3da9bd908 Commit from m3o/m3o action 2021-11-02 08:19:52 +00:00
m3o-actions
2ccc1a4d17 Commit from m3o/m3o action 2021-11-02 08:18:51 +00:00
m3o-actions
eff35e79ef Commit from m3o/m3o action 2021-11-02 07:44:22 +00:00
m3o-actions
fe077602a7 Commit from m3o/m3o action 2021-11-01 17:16:01 +00:00
m3o-actions
e2913e9e7c Commit from m3o/m3o action 2021-11-01 17:11:34 +00:00
m3o-actions
0561a7f7c2 Commit from m3o/m3o action 2021-11-01 17:09:11 +00:00
m3o-actions
21ded67c07 Commit from m3o/m3o action 2021-11-01 15:55:15 +00:00
m3o-actions
b3f128386d Commit from m3o/m3o action 2021-11-01 15:47:02 +00:00
m3o-actions
97f56e72a2 Commit from m3o/m3o action 2021-11-01 15:41:08 +00:00
m3o-actions
c64b4b029f Commit from m3o/m3o action 2021-10-31 13:53:09 +00:00
m3o-actions
5c6ed49281 Commit from m3o/m3o action 2021-10-31 13:51:20 +00:00
m3o-actions
6411450031 Commit from m3o/m3o action 2021-10-31 13:47:11 +00:00
m3o-actions
1c389d4cca Commit from m3o/m3o action 2021-10-30 11:56:34 +00:00
m3o-actions
0805168f1d Commit from m3o/m3o action 2021-10-30 11:51:28 +00:00
m3o-actions
429a6ad180 Commit from m3o/m3o action 2021-10-30 07:30:10 +00:00
m3o-actions
218188cbcf Commit from m3o/m3o action 2021-10-29 13:17:32 +00:00
m3o-actions
168985fe21 Commit from m3o/m3o action 2021-10-29 13:12:31 +00:00
m3o-actions
6d4b56721d Commit from m3o/m3o action 2021-10-29 13:12:23 +00:00
m3o-actions
9482db748c Commit from m3o/m3o action 2021-10-29 12:43:44 +00:00
m3o-actions
a3b4eba5f1 Commit from m3o/m3o action 2021-10-29 12:41:37 +00:00
m3o-actions
c84accfb12 Commit from m3o/m3o action 2021-10-29 12:34:38 +00:00
m3o-actions
a4c61983ce Commit from m3o/m3o action 2021-10-29 12:15:32 +00:00
m3o-actions
814f4826d6 Commit from m3o/m3o action 2021-10-29 12:14:54 +00:00
Asim Aslam
a142615a6b Update README.md 2021-10-29 12:07:10 +01:00
m3o-actions
7b95e8f58f Commit from m3o/m3o action 2021-10-29 11:05:31 +00:00
Asim Aslam
cdd1eea406 update readme 2021-10-29 11:58:04 +01:00
Asim Aslam
8604d436eb remove curl files 2021-10-29 11:49:15 +01:00
m3o-actions
eb73d115f2 Commit from m3o/m3o action 2021-10-29 10:44:29 +00:00
m3o-actions
4e64b77e47 Commit from m3o/m3o action 2021-10-29 10:40:25 +00:00
Asim Aslam
8e9779a8cb remove curl files 2021-10-29 11:39:33 +01:00
m3o-actions
c5c2867dc3 Commit from m3o/m3o action 2021-10-29 10:32:59 +00:00
Asim Aslam
0a3298c33b remove curl files 2021-10-29 11:03:26 +01:00
m3o-actions
5c34812294 Commit from m3o/m3o action 2021-10-29 09:09:35 +00:00
m3o-actions
2576812b54 Commit from m3o/m3o action 2021-10-29 08:41:22 +00:00
m3o-actions
8fc6fd6913 Commit from m3o/m3o action 2021-10-29 08:37:53 +00:00
m3o-actions
f3f53f865a Commit from m3o/m3o action 2021-10-29 08:13:31 +00:00
m3o-actions
1682d4075e Commit from m3o/m3o action 2021-10-29 08:12:32 +00:00
m3o-actions
c2ee05e2eb Commit from m3o/m3o action 2021-10-29 07:43:23 +00:00
m3o-actions
268689a87d Commit from m3o/m3o action 2021-10-29 07:31:06 +00:00
m3o-actions
e8c2e112f5 Commit from m3o/m3o action 2021-10-29 07:17:30 +00:00
m3o-actions
f5260050e4 Commit from m3o/m3o action 2021-10-29 07:15:05 +00:00
m3o-actions
f33dc1e44c Commit from m3o/m3o action 2021-10-29 06:59:53 +00:00
m3o-actions
ae73a4aca1 Commit from m3o/m3o action 2021-10-29 06:38:17 +00:00
Janos Dobronszki
87f310675d Update go.mod 2021-10-28 14:58:32 +01:00
m3o-actions
6b328d406c Commit from m3o/m3o action 2021-10-28 13:52:36 +00:00
Janos Dobronszki
aba344cf69 Delete go directory 2021-10-28 14:51:42 +01:00
m3o-actions
fced949d94 Commit from m3o/m3o action 2021-10-28 13:41:00 +00:00
Janos Dobronszki
ec8910b174 Delete go directory 2021-10-28 14:38:07 +01:00
m3o-actions
f8f41e7434 Commit from m3o/m3o action 2021-10-28 13:31:19 +00:00
Asim Aslam
55b73f2fc7 Update vanity.yaml 2021-10-28 12:08:20 +01:00
Asim Aslam
f2f62ad942 Merge branch 'master' of ssh://github.com/m3o/m3o-go 2021-09-17 11:30:41 +01:00
Asim Aslam
101c159dcf move vanity 2021-09-17 11:30:31 +01:00
Janos Dobronszki
a4f018a78d Remove type safe clients 2021-09-15 12:36:33 +01:00
Janos Dobronszki
726d1ccef6 Add separate service clients (#5) 2021-09-14 16:36:40 +01:00
Asim Aslam
ba48658a46 Update go.mod 2021-09-14 16:23:15 +01:00
Asim Aslam
8b37b56cb3 add vanity url code 2021-09-14 14:31:31 +01:00
523 changed files with 20839 additions and 467 deletions

31
.github/workflows/generate.yml vendored Normal file
View File

@@ -0,0 +1,31 @@
name: Test Clients
on:
push:
branches:
- main
- beta
- ci
jobs:
generate:
name: Test Clients
runs-on: ubuntu-latest
steps:
- name: Check out repo
uses: actions/checkout@v2
with:
path: clients
#ref: main
- name: Test
working-directory: clients
env:
M3O_API_TOKEN: ${{ secrets.M3O_API_TOKEN }}
run: |
# stream is temporarily excluded as it hangs forever because test does not close connection
# @TODO remove "idempotent: true" from stream example
O=$(find . -name ".run" | grep -v stream | xargs -n1 dirname | xargs -n1 go run)
echo $O
if grep -q Detail "$O"; then
exit 1
fi

View File

@@ -1,9 +1,46 @@
<p align="center">
<a href="https://discord.gg/TBR9bRjd6Z">
<img src="https://discordapp.com/api/guilds/861917584437805127/widget.png?style=banner2" alt="Discord Banner"/>
</a>
</p>
---
# M3O Go Client [![godoc](https://godoc.org/github.com/m3o/m3o-go?status.svg)](https://godoc.org/github.com/m3o/m3o-go) [![Go Report Card](https://goreportcard.com/badge/github.com/m3o/m3o-go)](https://goreportcard.com/report/github.com/m3o/m3o-go) [![Apache 2.0 License](https://img.shields.io/github/license/m3o/m3o-go)](https://github.com/m3o/m3o-go/blob/master/LICENSE) # M3O Go Client [![godoc](https://godoc.org/github.com/m3o/m3o-go?status.svg)](https://godoc.org/github.com/m3o/m3o-go) [![Go Report Card](https://goreportcard.com/badge/github.com/m3o/m3o-go)](https://goreportcard.com/report/github.com/m3o/m3o-go) [![Apache 2.0 License](https://img.shields.io/github/license/m3o/m3o-go)](https://github.com/m3o/m3o-go/blob/master/LICENSE)
This is the Go client to access APIs on the M3O Platform This is the Go client to access APIs on the M3O Platform
## Usage ## Usage
Call a service using the generated client. Populate the `M3O_API_TOKEN` environment variable.
Import the package and initialise the service with your API token.
```go
package main
import(
"fmt"
"os"
"go.m3o.com/helloworld"
)
// Call returns a personalised "Hello $name" response
func main() {
helloworldService := helloworld.NewHelloworldService(os.Getenv("M3O_API_TOKEN"))
rsp, err := helloworldService.Call(&helloworld.CallRequest{
Name: "John",
})
fmt.Println(rsp, err)
}
```
## Generic Client
The generic client enables you to call any endpoint by name with freeform request/response types.
```go ```go
package main package main
@@ -11,7 +48,7 @@ import (
"fmt" "fmt"
"os" "os"
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Request struct { type Request struct {
@@ -49,15 +86,15 @@ func main() {
## Streaming ## Streaming
The client supports streaming The client supports streaming but is not yet code generated. Use the following for streaming endpoints.
```go ```go
package main package main
import ( import (
"fmt" "fmt"
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Request struct { type Request struct {

View File

@@ -1,9 +1,13 @@
package address package address
import ( import (
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Address interface {
LookupPostcode(*LookupPostcodeRequest) (*LookupPostcodeResponse, error)
}
func NewAddressService(token string) *AddressService { func NewAddressService(token string) *AddressService {
return &AddressService{ return &AddressService{
client: client.NewClient(&client.Options{ client: client.NewClient(&client.Options{
@@ -18,8 +22,10 @@ type AddressService struct {
// Lookup a list of UK addresses by postcode // Lookup a list of UK addresses by postcode
func (t *AddressService) LookupPostcode(request *LookupPostcodeRequest) (*LookupPostcodeResponse, error) { func (t *AddressService) LookupPostcode(request *LookupPostcodeRequest) (*LookupPostcodeResponse, error) {
rsp := &LookupPostcodeResponse{} rsp := &LookupPostcodeResponse{}
return rsp, t.client.Call("address", "LookupPostcode", request, rsp) return rsp, t.client.Call("address", "LookupPostcode", request, rsp)
} }
type LookupPostcodeRequest struct { type LookupPostcodeRequest struct {
@@ -33,13 +39,13 @@ type LookupPostcodeResponse struct {
type Record struct { type Record struct {
// building name // building name
BuildingName string `json:"buildingName"` BuildingName string `json:"building_name"`
// the county // the county
County string `json:"county"` County string `json:"county"`
// line one of address // line one of address
LineOne string `json:"lineOne"` LineOne string `json:"line_one"`
// line two of address // line two of address
LineTwo string `json:"lineTwo"` LineTwo string `json:"line_two"`
// dependent locality // dependent locality
Locality string `json:"locality"` Locality string `json:"locality"`
// organisation if present // organisation if present

View File

@@ -1,9 +1,13 @@
package answer package answer
import ( import (
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Answer interface {
Question(*QuestionRequest) (*QuestionResponse, error)
}
func NewAnswerService(token string) *AnswerService { func NewAnswerService(token string) *AnswerService {
return &AnswerService{ return &AnswerService{
client: client.NewClient(&client.Options{ client: client.NewClient(&client.Options{
@@ -18,8 +22,10 @@ type AnswerService struct {
// Ask a question and receive an instant answer // Ask a question and receive an instant answer
func (t *AnswerService) Question(request *QuestionRequest) (*QuestionResponse, error) { func (t *AnswerService) Question(request *QuestionRequest) (*QuestionResponse, error) {
rsp := &QuestionResponse{} rsp := &QuestionResponse{}
return rsp, t.client.Call("answer", "Question", request, rsp) return rsp, t.client.Call("answer", "Question", request, rsp)
} }
type QuestionRequest struct { type QuestionRequest struct {

215
app/app.go Executable file
View File

@@ -0,0 +1,215 @@
package app
import (
"go.m3o.com/client"
)
type App interface {
Delete(*DeleteRequest) (*DeleteResponse, error)
List(*ListRequest) (*ListResponse, error)
Regions(*RegionsRequest) (*RegionsResponse, error)
Reserve(*ReserveRequest) (*ReserveResponse, error)
Resolve(*ResolveRequest) (*ResolveResponse, error)
Run(*RunRequest) (*RunResponse, error)
Status(*StatusRequest) (*StatusResponse, error)
Update(*UpdateRequest) (*UpdateResponse, error)
}
func NewAppService(token string) *AppService {
return &AppService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type AppService struct {
client *client.Client
}
// Delete an app
func (t *AppService) Delete(request *DeleteRequest) (*DeleteResponse, error) {
rsp := &DeleteResponse{}
return rsp, t.client.Call("app", "Delete", request, rsp)
}
// List all the apps
func (t *AppService) List(request *ListRequest) (*ListResponse, error) {
rsp := &ListResponse{}
return rsp, t.client.Call("app", "List", request, rsp)
}
// Return the support regions
func (t *AppService) Regions(request *RegionsRequest) (*RegionsResponse, error) {
rsp := &RegionsResponse{}
return rsp, t.client.Call("app", "Regions", request, rsp)
}
// Reserve apps beyond the free quota. Call Run after.
func (t *AppService) Reserve(request *ReserveRequest) (*ReserveResponse, error) {
rsp := &ReserveResponse{}
return rsp, t.client.Call("app", "Reserve", request, rsp)
}
// Resolve an app by id to its raw backend endpoint
func (t *AppService) Resolve(request *ResolveRequest) (*ResolveResponse, error) {
rsp := &ResolveResponse{}
return rsp, t.client.Call("app", "Resolve", request, rsp)
}
// Run an app from source
func (t *AppService) Run(request *RunRequest) (*RunResponse, error) {
rsp := &RunResponse{}
return rsp, t.client.Call("app", "Run", request, rsp)
}
// Get the status of an app
func (t *AppService) Status(request *StatusRequest) (*StatusResponse, error) {
rsp := &StatusResponse{}
return rsp, t.client.Call("app", "Status", request, rsp)
}
// Update the app. The latest source code will be downloaded, built and deployed.
func (t *AppService) Update(request *UpdateRequest) (*UpdateResponse, error) {
rsp := &UpdateResponse{}
return rsp, t.client.Call("app", "Update", request, rsp)
}
type DeleteRequest struct {
// name of the app
Name string `json:"name"`
}
type DeleteResponse struct {
}
type ListRequest struct {
}
type ListResponse struct {
// all the apps
Services []Service `json:"services"`
}
type RegionsRequest struct {
}
type RegionsResponse struct {
Regions []string `json:"regions"`
}
type Reservation struct {
// time of reservation
Created string `json:"created"`
// time reservation expires
Expires string `json:"expires"`
// name of the app
Name string `json:"name"`
// owner id
Owner string `json:"owner"`
// associated token
Token string `json:"token"`
}
type ReserveRequest struct {
// name of your app e.g helloworld
Name string `json:"name"`
}
type ReserveResponse struct {
// The app reservation
Reservation *Reservation `json:"reservation"`
}
type ResolveRequest struct {
// the service id
Id string `json:"id"`
}
type ResolveResponse struct {
// the end provider url
Url string `json:"url"`
}
type RunRequest struct {
// branch. defaults to master
Branch string `json:"branch"`
// associated env vars to pass in
EnvVars map[string]string `json:"env_vars"`
// name of the app
Name string `json:"name"`
// port to run on
Port int32 `json:"port"`
// region to run in
Region string `json:"region"`
// source repository
Repo string `json:"repo"`
}
type RunResponse struct {
// The running service
Service *Service `json:"service"`
}
type Service struct {
// branch of code
Branch string `json:"branch"`
// time of creation
Created string `json:"created"`
// custom domains
CustomDomains string `json:"custom_domains"`
// associated env vars
EnvVars map[string]string `json:"env_vars"`
// unique id
Id string `json:"id"`
// name of the app
Name string `json:"name"`
// port running on
Port int32 `json:"port"`
// region running in
Region string `json:"region"`
// source repository
Repo string `json:"repo"`
// status of the app
Status string `json:"status"`
// last updated
Updated string `json:"updated"`
// app url
Url string `json:"url"`
}
type StatusRequest struct {
// name of the app
Name string `json:"name"`
}
type StatusResponse struct {
// running service info
Service *Service `json:"service"`
}
type UpdateRequest struct {
// Additional env vars to update
EnvVars map[string]string `json:"env_vars"`
// name of the app
Name string `json:"name"`
}
type UpdateResponse struct {
}

49
avatar/avatar.go Executable file
View File

@@ -0,0 +1,49 @@
package avatar
import (
"go.m3o.com/client"
)
type Avatar interface {
Generate(*GenerateRequest) (*GenerateResponse, error)
}
func NewAvatarService(token string) *AvatarService {
return &AvatarService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type AvatarService struct {
client *client.Client
}
// Generate an unique avatar
func (t *AvatarService) Generate(request *GenerateRequest) (*GenerateResponse, error) {
rsp := &GenerateResponse{}
return rsp, t.client.Call("avatar", "Generate", request, rsp)
}
type GenerateRequest struct {
// encode format of avatar image: `png` or `jpeg`; default is `jpeg`
Format string `json:"format"`
// avatar's gender: `male` or `female`; default is `male`
Gender string `json:"gender"`
// set to true to upload to the M3O CDN and receive the url
Upload bool `json:"upload"`
// avatar's username, unique username will generate the unique avatar;
// if empty, every request generates a random avatar;
// if upload == true, username will be the CDN filename rather than a random uuid string
Username string `json:"username"`
}
type GenerateResponse struct {
// base64 encoded string of the avatar image
Base64 string `json:"base64"`
// M3O's CDN url of the avatar image
Url string `json:"url"`
}

View File

@@ -1,9 +1,18 @@
package cache package cache
import ( import (
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Cache interface {
Decrement(*DecrementRequest) (*DecrementResponse, error)
Delete(*DeleteRequest) (*DeleteResponse, error)
Get(*GetRequest) (*GetResponse, error)
Increment(*IncrementRequest) (*IncrementResponse, error)
ListKeys(*ListKeysRequest) (*ListKeysResponse, error)
Set(*SetRequest) (*SetResponse, error)
}
func NewCacheService(token string) *CacheService { func NewCacheService(token string) *CacheService {
return &CacheService{ return &CacheService{
client: client.NewClient(&client.Options{ client: client.NewClient(&client.Options{
@@ -16,48 +25,66 @@ type CacheService struct {
client *client.Client client *client.Client
} }
// Decrement a value (if it's a number) // Decrement a value (if it's a number). If key not found it is equivalent to set.
func (t *CacheService) Decrement(request *DecrementRequest) (*DecrementResponse, error) { func (t *CacheService) Decrement(request *DecrementRequest) (*DecrementResponse, error) {
rsp := &DecrementResponse{} rsp := &DecrementResponse{}
return rsp, t.client.Call("cache", "Decrement", request, rsp) return rsp, t.client.Call("cache", "Decrement", request, rsp)
} }
// Delete a value from the cache // Delete a value from the cache. If key not found a success response is returned.
func (t *CacheService) Delete(request *DeleteRequest) (*DeleteResponse, error) { func (t *CacheService) Delete(request *DeleteRequest) (*DeleteResponse, error) {
rsp := &DeleteResponse{} rsp := &DeleteResponse{}
return rsp, t.client.Call("cache", "Delete", request, rsp) return rsp, t.client.Call("cache", "Delete", request, rsp)
} }
// Get an item from the cache by key // Get an item from the cache by key. If key is not found, an empty response is returned.
func (t *CacheService) Get(request *GetRequest) (*GetResponse, error) { func (t *CacheService) Get(request *GetRequest) (*GetResponse, error) {
rsp := &GetResponse{} rsp := &GetResponse{}
return rsp, t.client.Call("cache", "Get", request, rsp) return rsp, t.client.Call("cache", "Get", request, rsp)
} }
// Increment a value (if it's a number) // Increment a value (if it's a number). If key not found it is equivalent to set.
func (t *CacheService) Increment(request *IncrementRequest) (*IncrementResponse, error) { func (t *CacheService) Increment(request *IncrementRequest) (*IncrementResponse, error) {
rsp := &IncrementResponse{} rsp := &IncrementResponse{}
return rsp, t.client.Call("cache", "Increment", request, rsp) return rsp, t.client.Call("cache", "Increment", request, rsp)
}
// List all the available keys
func (t *CacheService) ListKeys(request *ListKeysRequest) (*ListKeysResponse, error) {
rsp := &ListKeysResponse{}
return rsp, t.client.Call("cache", "ListKeys", request, rsp)
} }
// Set an item in the cache. Overwrites any existing value already set. // Set an item in the cache. Overwrites any existing value already set.
func (t *CacheService) Set(request *SetRequest) (*SetResponse, error) { func (t *CacheService) Set(request *SetRequest) (*SetResponse, error) {
rsp := &SetResponse{} rsp := &SetResponse{}
return rsp, t.client.Call("cache", "Set", request, rsp) return rsp, t.client.Call("cache", "Set", request, rsp)
} }
type DecrementRequest struct { type DecrementRequest struct {
// The key to decrement // The key to decrement
Key string `json:"key"` Key string `json:"key"`
// The amount to decrement the value by // The amount to decrement the value by
Value int64 `json:"value"` Value int64 `json:"value,string"`
} }
type DecrementResponse struct { type DecrementResponse struct {
// The key decremented // The key decremented
Key string `json:"key"` Key string `json:"key"`
// The new value // The new value
Value int64 `json:"value"` Value int64 `json:"value,string"`
} }
type DeleteRequest struct { type DeleteRequest struct {
@@ -79,7 +106,7 @@ type GetResponse struct {
// The key // The key
Key string `json:"key"` Key string `json:"key"`
// Time to live in seconds // Time to live in seconds
Ttl int64 `json:"ttl"` Ttl int64 `json:"ttl,string"`
// The value // The value
Value string `json:"value"` Value string `json:"value"`
} }
@@ -88,21 +115,28 @@ type IncrementRequest struct {
// The key to increment // The key to increment
Key string `json:"key"` Key string `json:"key"`
// The amount to increment the value by // The amount to increment the value by
Value int64 `json:"value"` Value int64 `json:"value,string"`
} }
type IncrementResponse struct { type IncrementResponse struct {
// The key incremented // The key incremented
Key string `json:"key"` Key string `json:"key"`
// The new value // The new value
Value int64 `json:"value"` Value int64 `json:"value,string"`
}
type ListKeysRequest struct {
}
type ListKeysResponse struct {
Keys []string `json:"keys"`
} }
type SetRequest struct { type SetRequest struct {
// The key to update // The key to update
Key string `json:"key"` Key string `json:"key"`
// Time to live in seconds // Time to live in seconds
Ttl int64 `json:"ttl"` Ttl int64 `json:"ttl,string"`
// The value to set // The value to set
Value string `json:"value"` Value string `json:"value"`
} }

52
carbon/carbon.go Executable file
View File

@@ -0,0 +1,52 @@
package carbon
import (
"go.m3o.com/client"
)
type Carbon interface {
Offset(*OffsetRequest) (*OffsetResponse, error)
}
func NewCarbonService(token string) *CarbonService {
return &CarbonService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type CarbonService struct {
client *client.Client
}
// Purchase 1KG (0.001 tonne) of carbon offsets in a single request
func (t *CarbonService) Offset(request *OffsetRequest) (*OffsetResponse, error) {
rsp := &OffsetResponse{}
return rsp, t.client.Call("carbon", "Offset", request, rsp)
}
type OffsetRequest struct {
}
type OffsetResponse struct {
// the metric used e.g KG or Tonnes
Metric string `json:"metric"`
// projects it was allocated to
Projects []Project `json:"projects"`
// number of tonnes
Tonnes float64 `json:"tonnes"`
// number of units purchased
Units int32 `json:"units"`
}
type Project struct {
// name of the project
Name string `json:"name"`
// percentage that went to this
Percentage float64 `json:"percentage"`
// amount in tonnes
Tonnes float64 `json:"tonnes"`
}

256
chat/chat.go Executable file
View File

@@ -0,0 +1,256 @@
package chat
import (
"go.m3o.com/client"
)
type Chat interface {
Create(*CreateRequest) (*CreateResponse, error)
Delete(*DeleteRequest) (*DeleteResponse, error)
History(*HistoryRequest) (*HistoryResponse, error)
Invite(*InviteRequest) (*InviteResponse, error)
Join(*JoinRequest) (*JoinResponseStream, error)
Kick(*KickRequest) (*KickResponse, error)
Leave(*LeaveRequest) (*LeaveResponse, error)
List(*ListRequest) (*ListResponse, error)
Send(*SendRequest) (*SendResponse, error)
}
func NewChatService(token string) *ChatService {
return &ChatService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type ChatService struct {
client *client.Client
}
// Create a new chat room
func (t *ChatService) Create(request *CreateRequest) (*CreateResponse, error) {
rsp := &CreateResponse{}
return rsp, t.client.Call("chat", "Create", request, rsp)
}
// Delete a chat room
func (t *ChatService) Delete(request *DeleteRequest) (*DeleteResponse, error) {
rsp := &DeleteResponse{}
return rsp, t.client.Call("chat", "Delete", request, rsp)
}
// List the messages in a chat
func (t *ChatService) History(request *HistoryRequest) (*HistoryResponse, error) {
rsp := &HistoryResponse{}
return rsp, t.client.Call("chat", "History", request, rsp)
}
// Invite a user to a chat room
func (t *ChatService) Invite(request *InviteRequest) (*InviteResponse, error) {
rsp := &InviteResponse{}
return rsp, t.client.Call("chat", "Invite", request, rsp)
}
// Join a chat room
func (t *ChatService) Join(request *JoinRequest) (*JoinResponseStream, error) {
stream, err := t.client.Stream("chat", "Join", request)
if err != nil {
return nil, err
}
return &JoinResponseStream{
stream: stream,
}, nil
}
type JoinResponseStream struct {
stream *client.Stream
}
func (t *JoinResponseStream) Recv() (*JoinResponse, error) {
var rsp JoinResponse
if err := t.stream.Recv(&rsp); err != nil {
return nil, err
}
return &rsp, nil
}
// Kick a user from a chat room
func (t *ChatService) Kick(request *KickRequest) (*KickResponse, error) {
rsp := &KickResponse{}
return rsp, t.client.Call("chat", "Kick", request, rsp)
}
// Leave a chat room
func (t *ChatService) Leave(request *LeaveRequest) (*LeaveResponse, error) {
rsp := &LeaveResponse{}
return rsp, t.client.Call("chat", "Leave", request, rsp)
}
// List available chats
func (t *ChatService) List(request *ListRequest) (*ListResponse, error) {
rsp := &ListResponse{}
return rsp, t.client.Call("chat", "List", request, rsp)
}
// Connect to a chat to receive a stream of messages
// Send a message to a chat
func (t *ChatService) Send(request *SendRequest) (*SendResponse, error) {
rsp := &SendResponse{}
return rsp, t.client.Call("chat", "Send", request, rsp)
}
type CreateRequest struct {
// chat description
Description string `json:"description"`
// name of the room
Name string `json:"name"`
// whether its a private room
Private bool `json:"private"`
// optional list of user ids
UserIds string `json:"user_ids"`
}
type CreateResponse struct {
// the unique chat room
Room *Room `json:"room"`
}
type DeleteRequest struct {
// the chat room id to delete
RoomId string `json:"room_id"`
}
type DeleteResponse struct {
Room *Room `json:"room"`
}
type HistoryRequest struct {
// the chat room id to get
RoomId string `json:"room_id"`
}
type HistoryResponse struct {
// messages in the chat room
Messages []Message `json:"messages"`
}
type InviteRequest struct {
// the room id
RoomId string `json:"room_id"`
// the user id
UserId string `json:"user_id"`
}
type InviteResponse struct {
Room *Room `json:"room"`
}
type JoinRequest struct {
// chat room to join
RoomId string `json:"room_id"`
// user id joining
UserId string `json:"user_id"`
}
type JoinResponse struct {
Message *Message `json:"message"`
}
type KickRequest struct {
// the chat room id
RoomId string `json:"room_id"`
// the user id
UserId string `json:"user_id"`
}
type KickResponse struct {
Room *Room `json:"room"`
}
type LeaveRequest struct {
// the chat room id
RoomId string `json:"room_id"`
// the user id
UserId string `json:"user_id"`
}
type LeaveResponse struct {
Room *Room `json:"room"`
}
type ListRequest struct {
// optional user id to filter by
UserId string `json:"user_id"`
}
type ListResponse struct {
Rooms []Room `json:"rooms"`
}
type Message struct {
// a client side id, should be validated by the server to make the request retry safe
Client string `json:"client"`
// id of the message, allocated by the server
Id string `json:"id"`
// id of the chat the message is being sent to / from
RoomId string `json:"room_id"`
// time the message was sent in RFC3339 format
SentAt string `json:"sent_at"`
// subject of the message
Subject string `json:"subject"`
// text of the message
Text string `json:"text"`
// id of the user who sent the message
UserId string `json:"user_id"`
}
type Room struct {
// time of creation
CreatedAt string `json:"created_at"`
// description of the that
Description string `json:"description"`
// unique room id
Id string `json:"id"`
// name of the chat
Name string `json:"name"`
// whether its a private room
Private bool `json:"private"`
// list of users
UserIds string `json:"user_ids"`
}
type SendRequest struct {
// a client side id, should be validated by the server to make the request retry safe
Client string `json:"client"`
// id of the chat room the message is being sent to / from
RoomId string `json:"room_id"`
// subject of the message
Subject string `json:"subject"`
// text of the message
Text string `json:"text"`
// id of the user who sent the message
UserId string `json:"user_id"`
}
type SendResponse struct {
// the message which was created
Message *Message `json:"message"`
}

View File

@@ -6,6 +6,10 @@ import (
) )
func TestBasicCall(t *testing.T) { func TestBasicCall(t *testing.T) {
if v := os.Getenv("IN_TRAVIS"); v == "yes" {
return
}
response := map[string]interface{}{} response := map[string]interface{}{}
if err := NewClient(&Options{ if err := NewClient(&Options{
Token: os.Getenv("TOKEN"), Token: os.Getenv("TOKEN"),

201
cmd/m3o-go-url/LICENSE Normal file
View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

134
cmd/m3o-go-url/README.md Normal file
View File

@@ -0,0 +1,134 @@
# M3O Go Vanity URL
M3O Go Vanity URL is a simple Go server that sets the custom url `go.m3o.com`
## Quickstart
Install and run the binary:
```
$ go get -u github.com/m3o-go/cmd/m3o-go-url
$ # update vanity.yaml
$ m3o-go-url
$ # open http://localhost:8080
```
### Google App Engine
Install [gcloud](https://cloud.google.com/sdk/downloads) and install Go App Engine component:
```
$ gcloud components install app-engine-go
```
Setup a [custom domain](https://cloud.google.com/appengine/docs/standard/python/using-custom-domains-and-ssl) for your app.
Get the application:
```
git clone https://github.com/GoogleCloudPlatform/govanityurls
cd govanityurls
```
Edit `vanity.yaml` to add any number of git repos. E.g., `customdomain.com/portmidi` will
serve the [https://github.com/rakyll/portmidi](https://github.com/rakyll/portmidi) repo.
```
paths:
/portmidi:
repo: https://github.com/rakyll/portmidi
```
You can add as many rules as you wish.
Deploy the app:
```
$ gcloud app deploy
```
That's it! You can use `go get` to get the package from your custom domain.
```
$ go get customdomain.com/portmidi
```
### Running in other environments
You can also deploy this as an App Engine Flexible app by changing the
`app.yaml` file:
```
runtime: go
env: flex
```
This project is a normal Go HTTP server, so you can also incorporate the
handler into larger Go servers.
## Configuration File
```
host: example.com
cache_max_age: 3600
paths:
/foo:
repo: https://github.com/example/foo
display: "https://github.com/example/foo https://github.com/example/foo/tree/master{/dir} https://github.com/example/foo/blob/master{/dir}/{file}#L{line}"
vcs: git
```
<table>
<thead>
<tr>
<th scope="col">Key</th>
<th scope="col">Required</th>
<th scope="col">Description</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row"><code>cache_max_age</code></th>
<td>optional</td>
<td>The amount of time to cache package pages in seconds. Controls the <code>max-age</code> directive sent in the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control"><code>Cache-Control</code></a> HTTP header.</td>
</tr>
<tr>
<th scope="row"><code>host</code></th>
<td>optional</td>
<td>Host name to use in meta tags. If omitted, uses the App Engine default version host or the Host header on non-App Engine Standard environments. You can use this option to fix the host when using this service behind a reverse proxy or a <a href="https://cloud.google.com/appengine/docs/standard/go/how-requests-are-routed#routing_with_a_dispatch_file">custom dispatch file</a>.</td>
</tr>
<tr>
<th scope="row"><code>paths</code></th>
<td>required</td>
<td>Map of paths to path configurations. Each key is a path that will point to the root of a repository hosted elsewhere. The fields are documented in the Path Configuration section below.</td>
</tr>
</tbody>
</table>
### Path Configuration
<table>
<thead>
<tr>
<th scope="col">Key</th>
<th scope="col">Required</th>
<th scope="col">Description</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row"><code>display</code></th>
<td>optional</td>
<td>The last three fields of the <a href="https://github.com/golang/gddo/wiki/Source-Code-Links"><code>go-source</code> meta tag</a>. If omitted, it is inferred from the code hosting service if possible.</td>
</tr>
<tr>
<th scope="row"><code>repo</code></th>
<td>required</td>
<td>Root URL of the repository as it would appear in <a href="https://golang.org/cmd/go/#hdr-Remote_import_paths"><code>go-import</code> meta tag</a>.</td>
</tr>
<tr>
<th scope="row"><code>vcs</code></th>
<td>required if ambiguous</td>
<td>If the version control system cannot be inferred (e.g. for Bitbucket or a custom domain), then this specifies the version control system as it would appear in <a href="https://golang.org/cmd/go/#hdr-Remote_import_paths"><code>go-import</code> meta tag</a>. This can be one of <code>git</code>, <code>hg</code>, <code>svn</code>, or <code>bzr</code>.</td>
</tr>
</tbody>
</table>

10
cmd/m3o-go-url/go.mod Normal file
View File

@@ -0,0 +1,10 @@
module github.com/m3o/m3o-go/cmd/m3o-go-url
go 1.13
require (
github.com/golang/protobuf v1.3.3 // indirect
golang.org/x/net v0.0.0-20200202094626-16171245cfb2 // indirect
google.golang.org/appengine v1.6.5
gopkg.in/yaml.v2 v2.2.8
)

13
cmd/m3o-go-url/go.sum Normal file
View File

@@ -0,0 +1,13 @@
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

225
cmd/m3o-go-url/handler.go Normal file
View File

@@ -0,0 +1,225 @@
// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// govanityurls serves Go vanity URLs.
package main
import (
"errors"
"fmt"
"html/template"
"net/http"
"sort"
"strings"
"gopkg.in/yaml.v2"
)
type handler struct {
host string
cacheControl string
paths pathConfigSet
}
type pathConfig struct {
path string
repo string
display string
vcs string
}
func newHandler(config []byte) (*handler, error) {
var parsed struct {
Host string `yaml:"host,omitempty"`
CacheAge *int64 `yaml:"cache_max_age,omitempty"`
Paths map[string]struct {
Repo string `yaml:"repo,omitempty"`
Display string `yaml:"display,omitempty"`
VCS string `yaml:"vcs,omitempty"`
} `yaml:"paths,omitempty"`
}
if err := yaml.Unmarshal(config, &parsed); err != nil {
return nil, err
}
h := &handler{host: parsed.Host}
cacheAge := int64(86400) // 24 hours (in seconds)
if parsed.CacheAge != nil {
cacheAge = *parsed.CacheAge
if cacheAge < 0 {
return nil, errors.New("cache_max_age is negative")
}
}
h.cacheControl = fmt.Sprintf("public, max-age=%d", cacheAge)
for path, e := range parsed.Paths {
pc := pathConfig{
path: strings.TrimSuffix(path, "/"),
repo: e.Repo,
display: e.Display,
vcs: e.VCS,
}
switch {
case e.Display != "":
// Already filled in.
case strings.HasPrefix(e.Repo, "https://github.com/"):
pc.display = fmt.Sprintf("%v %v/tree/master{/dir} %v/blob/master{/dir}/{file}#L{line}", e.Repo, e.Repo, e.Repo)
case strings.HasPrefix(e.Repo, "https://bitbucket.org"):
pc.display = fmt.Sprintf("%v %v/src/default{/dir} %v/src/default{/dir}/{file}#{file}-{line}", e.Repo, e.Repo, e.Repo)
}
switch {
case e.VCS != "":
// Already filled in.
if e.VCS != "bzr" && e.VCS != "git" && e.VCS != "hg" && e.VCS != "svn" {
return nil, fmt.Errorf("configuration for %v: unknown VCS %s", path, e.VCS)
}
case strings.HasPrefix(e.Repo, "https://github.com/"):
pc.vcs = "git"
default:
return nil, fmt.Errorf("configuration for %v: cannot infer VCS from %s", path, e.Repo)
}
h.paths = append(h.paths, pc)
}
sort.Sort(h.paths)
return h, nil
}
func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
current := r.URL.Path
pc, subpath := h.paths.find(current)
if pc == nil && current == "/" {
h.serveIndex(w, r)
return
}
if pc == nil {
http.NotFound(w, r)
return
}
w.Header().Set("Cache-Control", h.cacheControl)
if err := vanityTmpl.Execute(w, struct {
Import string
Subpath string
Repo string
Display string
VCS string
}{
Import: h.Host(r) + pc.path,
Subpath: subpath,
Repo: pc.repo,
Display: pc.display,
VCS: pc.vcs,
}); err != nil {
http.Error(w, "cannot render the page", http.StatusInternalServerError)
}
}
func (h *handler) serveIndex(w http.ResponseWriter, r *http.Request) {
host := h.Host(r)
handlers := make([]string, len(h.paths))
for i, h := range h.paths {
handlers[i] = host + h.path
}
if err := indexTmpl.Execute(w, struct {
Host string
Handlers []string
}{
Host: host,
Handlers: handlers,
}); err != nil {
http.Error(w, "cannot render the page", http.StatusInternalServerError)
}
}
func (h *handler) Host(r *http.Request) string {
host := h.host
if host == "" {
host = defaultHost(r)
}
return host
}
var indexTmpl = template.Must(template.New("index").Parse(`<!DOCTYPE html>
<html>
<h1>{{.Host}}</h1>
<ul>
{{range .Handlers}}<li><a href="https://pkg.go.dev/{{.}}">{{.}}</a></li>{{end}}
</ul>
</html>
`))
var vanityTmpl = template.Must(template.New("vanity").Parse(`<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="go-import" content="{{.Import}} {{.VCS}} {{.Repo}}">
<meta name="go-source" content="{{.Import}} {{.Display}}">
<meta http-equiv="refresh" content="0; url=https://pkg.go.dev/{{.Import}}/{{.Subpath}}">
</head>
<body>
Nothing to see here; <a href="https://pkg.go.dev/{{.Import}}/{{.Subpath}}">see the package on pkg.go.dev</a>.
</body>
</html>`))
type pathConfigSet []pathConfig
func (pset pathConfigSet) Len() int {
return len(pset)
}
func (pset pathConfigSet) Less(i, j int) bool {
return pset[i].path < pset[j].path
}
func (pset pathConfigSet) Swap(i, j int) {
pset[i], pset[j] = pset[j], pset[i]
}
func (pset pathConfigSet) find(path string) (pc *pathConfig, subpath string) {
// Fast path with binary search to retrieve exact matches
// e.g. given pset ["/", "/abc", "/xyz"], path "/def" won't match.
i := sort.Search(len(pset), func(i int) bool {
return pset[i].path >= path
})
if i < len(pset) && pset[i].path == path {
return &pset[i], ""
}
if i > 0 && strings.HasPrefix(path, pset[i-1].path+"/") {
return &pset[i-1], path[len(pset[i-1].path)+1:]
}
// Slow path, now looking for the longest prefix/shortest subpath i.e.
// e.g. given pset ["/", "/abc/", "/abc/def/", "/xyz"/]
// * query "/abc/foo" returns "/abc/" with a subpath of "foo"
// * query "/x" returns "/" with a subpath of "x"
lenShortestSubpath := len(path)
var bestMatchConfig *pathConfig
// After binary search with the >= lexicographic comparison,
// nothing greater than i will be a prefix of path.
max := i
for i := 0; i < max; i++ {
ps := pset[i]
if len(ps.path) >= len(path) {
// We previously didn't find the path by search, so any
// route with equal or greater length is NOT a match.
continue
}
sSubpath := strings.TrimPrefix(path, ps.path)
if len(sSubpath) < lenShortestSubpath {
subpath = sSubpath
lenShortestSubpath = len(sSubpath)
bestMatchConfig = &pset[i]
}
}
return bestMatchConfig, subpath
}

View File

@@ -0,0 +1,315 @@
// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"bytes"
"io/ioutil"
"net/http"
"net/http/httptest"
"sort"
"testing"
)
func TestHandler(t *testing.T) {
tests := []struct {
name string
config string
path string
goImport string
goSource string
}{
{
name: "explicit display",
config: "host: example.com\n" +
"paths:\n" +
" /portmidi:\n" +
" repo: https://github.com/rakyll/portmidi\n" +
" display: https://github.com/rakyll/portmidi _ _\n",
path: "/portmidi",
goImport: "example.com/portmidi git https://github.com/rakyll/portmidi",
goSource: "example.com/portmidi https://github.com/rakyll/portmidi _ _",
},
{
name: "display GitHub inference",
config: "host: example.com\n" +
"paths:\n" +
" /portmidi:\n" +
" repo: https://github.com/rakyll/portmidi\n",
path: "/portmidi",
goImport: "example.com/portmidi git https://github.com/rakyll/portmidi",
goSource: "example.com/portmidi https://github.com/rakyll/portmidi https://github.com/rakyll/portmidi/tree/master{/dir} https://github.com/rakyll/portmidi/blob/master{/dir}/{file}#L{line}",
},
{
name: "Bitbucket Mercurial",
config: "host: example.com\n" +
"paths:\n" +
" /gopdf:\n" +
" repo: https://bitbucket.org/zombiezen/gopdf\n" +
" vcs: hg\n",
path: "/gopdf",
goImport: "example.com/gopdf hg https://bitbucket.org/zombiezen/gopdf",
goSource: "example.com/gopdf https://bitbucket.org/zombiezen/gopdf https://bitbucket.org/zombiezen/gopdf/src/default{/dir} https://bitbucket.org/zombiezen/gopdf/src/default{/dir}/{file}#{file}-{line}",
},
{
name: "Bitbucket Git",
config: "host: example.com\n" +
"paths:\n" +
" /mygit:\n" +
" repo: https://bitbucket.org/zombiezen/mygit\n" +
" vcs: git\n",
path: "/mygit",
goImport: "example.com/mygit git https://bitbucket.org/zombiezen/mygit",
goSource: "example.com/mygit https://bitbucket.org/zombiezen/mygit https://bitbucket.org/zombiezen/mygit/src/default{/dir} https://bitbucket.org/zombiezen/mygit/src/default{/dir}/{file}#{file}-{line}",
},
{
name: "subpath",
config: "host: example.com\n" +
"paths:\n" +
" /portmidi:\n" +
" repo: https://github.com/rakyll/portmidi\n" +
" display: https://github.com/rakyll/portmidi _ _\n",
path: "/portmidi/foo",
goImport: "example.com/portmidi git https://github.com/rakyll/portmidi",
goSource: "example.com/portmidi https://github.com/rakyll/portmidi _ _",
},
{
name: "subpath with trailing config slash",
config: "host: example.com\n" +
"paths:\n" +
" /portmidi/:\n" +
" repo: https://github.com/rakyll/portmidi\n" +
" display: https://github.com/rakyll/portmidi _ _\n",
path: "/portmidi/foo",
goImport: "example.com/portmidi git https://github.com/rakyll/portmidi",
goSource: "example.com/portmidi https://github.com/rakyll/portmidi _ _",
},
}
for _, test := range tests {
h, err := newHandler([]byte(test.config))
if err != nil {
t.Errorf("%s: newHandler: %v", test.name, err)
continue
}
s := httptest.NewServer(h)
resp, err := http.Get(s.URL + test.path)
if err != nil {
s.Close()
t.Errorf("%s: http.Get: %v", test.name, err)
continue
}
data, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
s.Close()
if resp.StatusCode != http.StatusOK {
t.Errorf("%s: status code = %s; want 200 OK", test.name, resp.Status)
}
if err != nil {
t.Errorf("%s: ioutil.ReadAll: %v", test.name, err)
continue
}
if got := findMeta(data, "go-import"); got != test.goImport {
t.Errorf("%s: meta go-import = %q; want %q", test.name, got, test.goImport)
}
if got := findMeta(data, "go-source"); got != test.goSource {
t.Errorf("%s: meta go-source = %q; want %q", test.name, got, test.goSource)
}
}
}
func TestBadConfigs(t *testing.T) {
badConfigs := []string{
"paths:\n" +
" /missingvcs:\n" +
" repo: https://bitbucket.org/zombiezen/gopdf\n",
"paths:\n" +
" /unknownvcs:\n" +
" repo: https://bitbucket.org/zombiezen/gopdf\n" +
" vcs: xyzzy\n",
"cache_max_age: -1\n" +
"paths:\n" +
" /portmidi:\n" +
" repo: https://github.com/rakyll/portmidi\n",
}
for _, config := range badConfigs {
_, err := newHandler([]byte(config))
if err == nil {
t.Errorf("expected config to produce an error, but did not:\n%s", config)
}
}
}
func findMeta(data []byte, name string) string {
var sep []byte
sep = append(sep, `<meta name="`...)
sep = append(sep, name...)
sep = append(sep, `" content="`...)
i := bytes.Index(data, sep)
if i == -1 {
return ""
}
content := data[i+len(sep):]
j := bytes.IndexByte(content, '"')
if j == -1 {
return ""
}
return string(content[:j])
}
func TestPathConfigSetFind(t *testing.T) {
tests := []struct {
paths []string
query string
want string
subpath string
}{
{
paths: []string{"/portmidi"},
query: "/portmidi",
want: "/portmidi",
},
{
paths: []string{"/portmidi"},
query: "/portmidi/",
want: "/portmidi",
},
{
paths: []string{"/portmidi"},
query: "/foo",
want: "",
},
{
paths: []string{"/portmidi"},
query: "/zzz",
want: "",
},
{
paths: []string{"/abc", "/portmidi", "/xyz"},
query: "/portmidi",
want: "/portmidi",
},
{
paths: []string{"/abc", "/portmidi", "/xyz"},
query: "/portmidi/foo",
want: "/portmidi",
subpath: "foo",
},
{
paths: []string{"/example/helloworld", "/", "/y", "/foo"},
query: "/x",
want: "/",
subpath: "x",
},
{
paths: []string{"/example/helloworld", "/", "/y", "/foo"},
query: "/",
want: "/",
subpath: "",
},
{
paths: []string{"/example/helloworld", "/", "/y", "/foo"},
query: "/example",
want: "/",
subpath: "example",
},
{
paths: []string{"/example/helloworld", "/", "/y", "/foo"},
query: "/example/foo",
want: "/",
subpath: "example/foo",
},
{
paths: []string{"/example/helloworld", "/", "/y", "/foo"},
query: "/y",
want: "/y",
},
{
paths: []string{"/example/helloworld", "/", "/y", "/foo"},
query: "/x/y/",
want: "/",
subpath: "x/y/",
},
{
paths: []string{"/example/helloworld", "/y", "/foo"},
query: "/x",
want: "",
},
}
emptyToNil := func(s string) string {
if s == "" {
return "<nil>"
}
return s
}
for _, test := range tests {
pset := make(pathConfigSet, len(test.paths))
for i := range test.paths {
pset[i].path = test.paths[i]
}
sort.Sort(pset)
pc, subpath := pset.find(test.query)
var got string
if pc != nil {
got = pc.path
}
if got != test.want || subpath != test.subpath {
t.Errorf("pathConfigSet(%v).find(%q) = %v, %v; want %v, %v",
test.paths, test.query, emptyToNil(got), subpath, emptyToNil(test.want), test.subpath)
}
}
}
func TestCacheHeader(t *testing.T) {
tests := []struct {
name string
config string
cacheControl string
}{
{
name: "default",
cacheControl: "public, max-age=86400",
},
{
name: "specify time",
config: "cache_max_age: 60\n",
cacheControl: "public, max-age=60",
},
{
name: "zero",
config: "cache_max_age: 0\n",
cacheControl: "public, max-age=0",
},
}
for _, test := range tests {
h, err := newHandler([]byte("paths:\n /portmidi:\n repo: https://github.com/rakyll/portmidi\n" +
test.config))
if err != nil {
t.Errorf("%s: newHandler: %v", test.name, err)
continue
}
s := httptest.NewServer(h)
resp, err := http.Get(s.URL + "/portmidi")
if err != nil {
t.Errorf("%s: http.Get: %v", test.name, err)
continue
}
resp.Body.Close()
got := resp.Header.Get("Cache-Control")
if got != test.cacheControl {
t.Errorf("%s: Cache-Control header = %q; want %q", test.name, got, test.cacheControl)
}
}
}

55
cmd/m3o-go-url/main.go Normal file
View File

@@ -0,0 +1,55 @@
// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package main
import (
"io/ioutil"
"log"
"net/http"
"os"
)
func main() {
var configPath string
switch len(os.Args) {
case 1:
configPath = "vanity.yaml"
case 2:
configPath = os.Args[1]
default:
log.Fatal("usage: m3o-go-url [CONFIG]")
}
vanity, err := ioutil.ReadFile(configPath)
if err != nil {
log.Fatal(err)
}
h, err := newHandler(vanity)
if err != nil {
log.Fatal(err)
}
http.Handle("/", h)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
if err := http.ListenAndServe(":"+port, nil); err != nil {
log.Fatal(err)
}
}
func defaultHost(r *http.Request) string {
return r.Host
}

View File

@@ -0,0 +1,5 @@
host: go.m3o.com
paths:
/:
repo: https://github.com/m3o/m3o-go

162
comments/comments.go Executable file
View File

@@ -0,0 +1,162 @@
package comments
import (
"go.m3o.com/client"
)
type Comments interface {
Create(*CreateRequest) (*CreateResponse, error)
Delete(*DeleteRequest) (*DeleteResponse, error)
Events(*EventsRequest) (*EventsResponseStream, error)
List(*ListRequest) (*ListResponse, error)
Read(*ReadRequest) (*ReadResponse, error)
Update(*UpdateRequest) (*UpdateResponse, error)
}
func NewCommentsService(token string) *CommentsService {
return &CommentsService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type CommentsService struct {
client *client.Client
}
// Create a new comment
func (t *CommentsService) Create(request *CreateRequest) (*CreateResponse, error) {
rsp := &CreateResponse{}
return rsp, t.client.Call("comments", "Create", request, rsp)
}
// Delete a comment
func (t *CommentsService) Delete(request *DeleteRequest) (*DeleteResponse, error) {
rsp := &DeleteResponse{}
return rsp, t.client.Call("comments", "Delete", request, rsp)
}
// Subscribe to comments events
func (t *CommentsService) Events(request *EventsRequest) (*EventsResponseStream, error) {
stream, err := t.client.Stream("comments", "Events", request)
if err != nil {
return nil, err
}
return &EventsResponseStream{
stream: stream,
}, nil
}
type EventsResponseStream struct {
stream *client.Stream
}
func (t *EventsResponseStream) Recv() (*EventsResponse, error) {
var rsp EventsResponse
if err := t.stream.Recv(&rsp); err != nil {
return nil, err
}
return &rsp, nil
}
// List all the comments
func (t *CommentsService) List(request *ListRequest) (*ListResponse, error) {
rsp := &ListResponse{}
return rsp, t.client.Call("comments", "List", request, rsp)
}
// Read a comment
func (t *CommentsService) Read(request *ReadRequest) (*ReadResponse, error) {
rsp := &ReadResponse{}
return rsp, t.client.Call("comments", "Read", request, rsp)
}
// Update a comment
func (t *CommentsService) Update(request *UpdateRequest) (*UpdateResponse, error) {
rsp := &UpdateResponse{}
return rsp, t.client.Call("comments", "Update", request, rsp)
}
type Comment struct {
// time at which the comment was created
Created string `json:"created"`
// unique id for the comment, generated if not specified
Id string `json:"id"`
// subject of the comment
Subject string `json:"subject"`
// text of the comment
Text string `json:"text"`
// time at which the comment was updated
Updated string `json:"updated"`
}
type CreateRequest struct {
// comment subject
Subject string `json:"subject"`
// comment items
Text string `json:"text"`
}
type CreateResponse struct {
// The created comment
Comment *Comment `json:"comment"`
}
type DeleteRequest struct {
// specify the id of the comment
Id string `json:"id"`
}
type DeleteResponse struct {
Comment *Comment `json:"comment"`
}
type EventsRequest struct {
// optionally specify a comment id
Id string `json:"id"`
}
type EventsResponse struct {
// the comment which the operation occured on
Comment *Comment `json:"comment"`
// the event which occured; create, delete, update
Event string `json:"event"`
}
type ListRequest struct {
}
type ListResponse struct {
// the comment of comments
Comments []Comment `json:"comments"`
}
type ReadRequest struct {
// the comment id
Id string `json:"id"`
}
type ReadResponse struct {
// The comment
Comment *Comment `json:"comment"`
}
type UpdateRequest struct {
Comment *Comment `json:"comment"`
}
type UpdateResponse struct {
Comment *Comment `json:"comment"`
}

200
contact/contact.go Executable file
View File

@@ -0,0 +1,200 @@
package contact
import (
"go.m3o.com/client"
)
type Contact interface {
Create(*CreateRequest) (*CreateResponse, error)
Delete(*DeleteRequest) (*DeleteResponse, error)
List(*ListRequest) (*ListResponse, error)
Read(*ReadRequest) (*ReadResponse, error)
Update(*UpdateRequest) (*UpdateResponse, error)
}
func NewContactService(token string) *ContactService {
return &ContactService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type ContactService struct {
client *client.Client
}
// Create a contact
func (t *ContactService) Create(request *CreateRequest) (*CreateResponse, error) {
rsp := &CreateResponse{}
return rsp, t.client.Call("contact", "Create", request, rsp)
}
// Delete a contact
func (t *ContactService) Delete(request *DeleteRequest) (*DeleteResponse, error) {
rsp := &DeleteResponse{}
return rsp, t.client.Call("contact", "Delete", request, rsp)
}
// List contacts
func (t *ContactService) List(request *ListRequest) (*ListResponse, error) {
rsp := &ListResponse{}
return rsp, t.client.Call("contact", "List", request, rsp)
}
// Read contact details
func (t *ContactService) Read(request *ReadRequest) (*ReadResponse, error) {
rsp := &ReadResponse{}
return rsp, t.client.Call("contact", "Read", request, rsp)
}
// Update a contact
func (t *ContactService) Update(request *UpdateRequest) (*UpdateResponse, error) {
rsp := &UpdateResponse{}
return rsp, t.client.Call("contact", "Update", request, rsp)
}
type Address struct {
// the label of the address
Label string `json:"label"`
// the address location
Location string `json:"location"`
}
type ContactInfo struct {
// the address
Addresses []Address `json:"addresses"`
// the birthday
Birthday string `json:"birthday"`
// create date string in RFC3339
CreatedAt string `json:"created_at"`
// the emails
Emails []Email `json:"emails"`
// contact id
Id string `json:"id"`
// the contact links
Links []Link `json:"links"`
// the contact name
Name string `json:"name"`
// note of the contact
Note string `json:"note"`
// the phone numbers
Phones []Phone `json:"phones"`
// the social media username
SocialMedias *SocialMedia `json:"social_medias"`
// update date string in RFC3339
UpdatedAt string `json:"updated_at"`
}
type CreateRequest struct {
// optional, location
Addresses []Address `json:"addresses"`
// optional, birthday
Birthday string `json:"birthday"`
// optional, emails
Emails []Email `json:"emails"`
// optional, links
Links []Link `json:"links"`
// required, the name of the contact
Name string `json:"name"`
// optional, note of the contact
Note string `json:"note"`
// optional, phone numbers
Phones []Phone `json:"phones"`
// optional, social media
SocialMedias *SocialMedia `json:"social_medias"`
}
type CreateResponse struct {
Contact *ContactInfo `json:"contact"`
}
type DeleteRequest struct {
// the id of the contact
Id string `json:"id"`
}
type DeleteResponse struct {
}
type Email struct {
// the email address
Address string `json:"address"`
// the label of the email
Label string `json:"label"`
}
type Link struct {
// the label of the link
Label string `json:"label"`
// the url of the contact
Url string `json:"url"`
}
type ListRequest struct {
// optional, default is 30
Limit int32 `json:"limit"`
// optional
Offset int32 `json:"offset"`
}
type ListResponse struct {
Contacts []ContactInfo `json:"contacts"`
}
type Phone struct {
// the label of the phone number
Label string `json:"label"`
// phone number
Number string `json:"number"`
}
type ReadRequest struct {
Id string `json:"id"`
}
type ReadResponse struct {
Contact *ContactInfo `json:"contact"`
}
type SocialMedia struct {
// the label of the social
Label string `json:"label"`
// the username of social media
Username string `json:"username"`
}
type UpdateRequest struct {
// optional, addresses
Addresses []Address `json:"addresses"`
// optional, birthday
Birthday string `json:"birthday"`
// optional, emails
Emails []Email `json:"emails"`
// required, the contact id
Id string `json:"id"`
// optional, links
Links []Link `json:"links"`
// required, the name
Name string `json:"name"`
// optional, note
Note string `json:"note"`
// optional, phone number
Phones []Phone `json:"phones"`
// optional, social media
SocialMedias *SocialMedia `json:"social_medias"`
}
type UpdateResponse struct {
Contact *ContactInfo `json:"contact"`
}

View File

@@ -1,9 +1,17 @@
package crypto package crypto
import ( import (
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Crypto interface {
History(*HistoryRequest) (*HistoryResponse, error)
News(*NewsRequest) (*NewsResponse, error)
Price(*PriceRequest) (*PriceResponse, error)
Quote(*QuoteRequest) (*QuoteResponse, error)
Symbols(*SymbolsRequest) (*SymbolsResponse, error)
}
func NewCryptoService(token string) *CryptoService { func NewCryptoService(token string) *CryptoService {
return &CryptoService{ return &CryptoService{
client: client.NewClient(&client.Options{ client: client.NewClient(&client.Options{
@@ -18,26 +26,42 @@ type CryptoService struct {
// Returns the history for the previous close // Returns the history for the previous close
func (t *CryptoService) History(request *HistoryRequest) (*HistoryResponse, error) { func (t *CryptoService) History(request *HistoryRequest) (*HistoryResponse, error) {
rsp := &HistoryResponse{} rsp := &HistoryResponse{}
return rsp, t.client.Call("crypto", "History", request, rsp) return rsp, t.client.Call("crypto", "History", request, rsp)
} }
// Get news related to a currency // Get news related to a currency
func (t *CryptoService) News(request *NewsRequest) (*NewsResponse, error) { func (t *CryptoService) News(request *NewsRequest) (*NewsResponse, error) {
rsp := &NewsResponse{} rsp := &NewsResponse{}
return rsp, t.client.Call("crypto", "News", request, rsp) return rsp, t.client.Call("crypto", "News", request, rsp)
} }
// Get the last price for a given crypto ticker // Get the last price for a given crypto ticker
func (t *CryptoService) Price(request *PriceRequest) (*PriceResponse, error) { func (t *CryptoService) Price(request *PriceRequest) (*PriceResponse, error) {
rsp := &PriceResponse{} rsp := &PriceResponse{}
return rsp, t.client.Call("crypto", "Price", request, rsp) return rsp, t.client.Call("crypto", "Price", request, rsp)
} }
// Get the last quote for a given crypto ticker // Get the last quote for a given crypto ticker
func (t *CryptoService) Quote(request *QuoteRequest) (*QuoteResponse, error) { func (t *CryptoService) Quote(request *QuoteRequest) (*QuoteResponse, error) {
rsp := &QuoteResponse{} rsp := &QuoteResponse{}
return rsp, t.client.Call("crypto", "Quote", request, rsp) return rsp, t.client.Call("crypto", "Quote", request, rsp)
}
// Returns the full list of supported symbols
func (t *CryptoService) Symbols(request *SymbolsRequest) (*SymbolsResponse, error) {
rsp := &SymbolsResponse{}
return rsp, t.client.Call("crypto", "Symbols", request, rsp)
} }
type Article struct { type Article struct {
@@ -106,15 +130,27 @@ type QuoteRequest struct {
type QuoteResponse struct { type QuoteResponse struct {
// the asking price // the asking price
AskPrice float64 `json:"askPrice"` AskPrice float64 `json:"ask_price"`
// the ask size // the ask size
AskSize float64 `json:"askSize"` AskSize float64 `json:"ask_size"`
// the bidding price // the bidding price
BidPrice float64 `json:"bidPrice"` BidPrice float64 `json:"bid_price"`
// the bid size // the bid size
BidSize float64 `json:"bidSize"` BidSize float64 `json:"bid_size"`
// the crypto symbol // the crypto symbol
Symbol string `json:"symbol"` Symbol string `json:"symbol"`
// the UTC timestamp of the quote // the UTC timestamp of the quote
Timestamp string `json:"timestamp"` Timestamp string `json:"timestamp"`
} }
type Symbol struct {
Name string `json:"name"`
Symbol string `json:"symbol"`
}
type SymbolsRequest struct {
}
type SymbolsResponse struct {
Symbols []Symbol `json:"symbols"`
}

View File

@@ -1,9 +1,16 @@
package currency package currency
import ( import (
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Currency interface {
Codes(*CodesRequest) (*CodesResponse, error)
Convert(*ConvertRequest) (*ConvertResponse, error)
History(*HistoryRequest) (*HistoryResponse, error)
Rates(*RatesRequest) (*RatesResponse, error)
}
func NewCurrencyService(token string) *CurrencyService { func NewCurrencyService(token string) *CurrencyService {
return &CurrencyService{ return &CurrencyService{
client: client.NewClient(&client.Options{ client: client.NewClient(&client.Options{
@@ -18,26 +25,34 @@ type CurrencyService struct {
// Codes returns the supported currency codes for the API // Codes returns the supported currency codes for the API
func (t *CurrencyService) Codes(request *CodesRequest) (*CodesResponse, error) { func (t *CurrencyService) Codes(request *CodesRequest) (*CodesResponse, error) {
rsp := &CodesResponse{} rsp := &CodesResponse{}
return rsp, t.client.Call("currency", "Codes", request, rsp) return rsp, t.client.Call("currency", "Codes", request, rsp)
} }
// Convert returns the currency conversion rate between two pairs e.g USD/GBP // Convert returns the currency conversion rate between two pairs e.g USD/GBP
func (t *CurrencyService) Convert(request *ConvertRequest) (*ConvertResponse, error) { func (t *CurrencyService) Convert(request *ConvertRequest) (*ConvertResponse, error) {
rsp := &ConvertResponse{} rsp := &ConvertResponse{}
return rsp, t.client.Call("currency", "Convert", request, rsp) return rsp, t.client.Call("currency", "Convert", request, rsp)
} }
// Returns the historic rates for a currency on a given date // Returns the historic rates for a currency on a given date
func (t *CurrencyService) History(request *HistoryRequest) (*HistoryResponse, error) { func (t *CurrencyService) History(request *HistoryRequest) (*HistoryResponse, error) {
rsp := &HistoryResponse{} rsp := &HistoryResponse{}
return rsp, t.client.Call("currency", "History", request, rsp) return rsp, t.client.Call("currency", "History", request, rsp)
} }
// Rates returns the currency rates for a given code e.g USD // Rates returns the currency rates for a given code e.g USD
func (t *CurrencyService) Rates(request *RatesRequest) (*RatesResponse, error) { func (t *CurrencyService) Rates(request *RatesRequest) (*RatesResponse, error) {
rsp := &RatesResponse{} rsp := &RatesResponse{}
return rsp, t.client.Call("currency", "Rates", request, rsp) return rsp, t.client.Call("currency", "Rates", request, rsp)
} }
type Code struct { type Code struct {

View File

@@ -1,9 +1,21 @@
package db package db
import ( import (
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Db interface {
Count(*CountRequest) (*CountResponse, error)
Create(*CreateRequest) (*CreateResponse, error)
Delete(*DeleteRequest) (*DeleteResponse, error)
DropTable(*DropTableRequest) (*DropTableResponse, error)
ListTables(*ListTablesRequest) (*ListTablesResponse, error)
Read(*ReadRequest) (*ReadResponse, error)
RenameTable(*RenameTableRequest) (*RenameTableResponse, error)
Truncate(*TruncateRequest) (*TruncateResponse, error)
Update(*UpdateRequest) (*UpdateResponse, error)
}
func NewDbService(token string) *DbService { func NewDbService(token string) *DbService {
return &DbService{ return &DbService{
client: client.NewClient(&client.Options{ client: client.NewClient(&client.Options{
@@ -16,37 +28,91 @@ type DbService struct {
client *client.Client client *client.Client
} }
// Count records in a table
func (t *DbService) Count(request *CountRequest) (*CountResponse, error) {
rsp := &CountResponse{}
return rsp, t.client.Call("db", "Count", request, rsp)
}
// Create a record in the database. Optionally include an "id" field otherwise it's set automatically. // Create a record in the database. Optionally include an "id" field otherwise it's set automatically.
func (t *DbService) Create(request *CreateRequest) (*CreateResponse, error) { func (t *DbService) Create(request *CreateRequest) (*CreateResponse, error) {
rsp := &CreateResponse{} rsp := &CreateResponse{}
return rsp, t.client.Call("db", "Create", request, rsp) return rsp, t.client.Call("db", "Create", request, rsp)
} }
// Delete a record in the database by id. // Delete a record in the database by id.
func (t *DbService) Delete(request *DeleteRequest) (*DeleteResponse, error) { func (t *DbService) Delete(request *DeleteRequest) (*DeleteResponse, error) {
rsp := &DeleteResponse{} rsp := &DeleteResponse{}
return rsp, t.client.Call("db", "Delete", request, rsp) return rsp, t.client.Call("db", "Delete", request, rsp)
}
// Drop a table in the DB
func (t *DbService) DropTable(request *DropTableRequest) (*DropTableResponse, error) {
rsp := &DropTableResponse{}
return rsp, t.client.Call("db", "DropTable", request, rsp)
}
// List tables in the DB
func (t *DbService) ListTables(request *ListTablesRequest) (*ListTablesResponse, error) {
rsp := &ListTablesResponse{}
return rsp, t.client.Call("db", "ListTables", request, rsp)
} }
// Read data from a table. Lookup can be by ID or via querying any field in the record. // Read data from a table. Lookup can be by ID or via querying any field in the record.
func (t *DbService) Read(request *ReadRequest) (*ReadResponse, error) { func (t *DbService) Read(request *ReadRequest) (*ReadResponse, error) {
rsp := &ReadResponse{} rsp := &ReadResponse{}
return rsp, t.client.Call("db", "Read", request, rsp) return rsp, t.client.Call("db", "Read", request, rsp)
}
// Rename a table
func (t *DbService) RenameTable(request *RenameTableRequest) (*RenameTableResponse, error) {
rsp := &RenameTableResponse{}
return rsp, t.client.Call("db", "RenameTable", request, rsp)
} }
// Truncate the records in a table // Truncate the records in a table
func (t *DbService) Truncate(request *TruncateRequest) (*TruncateResponse, error) { func (t *DbService) Truncate(request *TruncateRequest) (*TruncateResponse, error) {
rsp := &TruncateResponse{} rsp := &TruncateResponse{}
return rsp, t.client.Call("db", "Truncate", request, rsp) return rsp, t.client.Call("db", "Truncate", request, rsp)
} }
// Update a record in the database. Include an "id" in the record to update. // Update a record in the database. Include an "id" in the record to update.
func (t *DbService) Update(request *UpdateRequest) (*UpdateResponse, error) { func (t *DbService) Update(request *UpdateRequest) (*UpdateResponse, error) {
rsp := &UpdateResponse{} rsp := &UpdateResponse{}
return rsp, t.client.Call("db", "Update", request, rsp) return rsp, t.client.Call("db", "Update", request, rsp)
}
type CountRequest struct {
// specify the table name
Table string `json:"table"`
}
type CountResponse struct {
// the number of records in the table
Count int32 `json:"count"`
} }
type CreateRequest struct { type CreateRequest struct {
// optional record id to use
Id string `json:"id"`
// JSON encoded record or records (can be array or object) // JSON encoded record or records (can be array or object)
Record map[string]interface{} `json:"record"` Record map[string]interface{} `json:"record"`
// Optional table name. Defaults to 'default' // Optional table name. Defaults to 'default'
@@ -68,6 +134,21 @@ type DeleteRequest struct {
type DeleteResponse struct { type DeleteResponse struct {
} }
type DropTableRequest struct {
Table string `json:"table"`
}
type DropTableResponse struct {
}
type ListTablesRequest struct {
}
type ListTablesResponse struct {
// list of tables
Tables []string `json:"tables"`
}
type ReadRequest struct { type ReadRequest struct {
// Read by id. Equivalent to 'id == "your-id"' // Read by id. Equivalent to 'id == "your-id"'
Id string `json:"id"` Id string `json:"id"`
@@ -94,14 +175,21 @@ type ReadResponse struct {
Records []map[string]interface{} `json:"records"` Records []map[string]interface{} `json:"records"`
} }
type RenameTableRequest struct {
// current table name
From string `json:"from"`
// new table name
To string `json:"to"`
}
type RenameTableResponse struct {
}
type TruncateRequest struct { type TruncateRequest struct {
// Optional table name. Defaults to 'default'
Table string `json:"table"` Table string `json:"table"`
} }
type TruncateResponse struct { type TruncateResponse struct {
// The table truncated
Table string `json:"table"`
} }
type UpdateRequest struct { type UpdateRequest struct {

85
email/email.go Executable file
View File

@@ -0,0 +1,85 @@
package email
import (
"go.m3o.com/client"
)
type Email interface {
Parse(*ParseRequest) (*ParseResponse, error)
Send(*SendRequest) (*SendResponse, error)
Validate(*ValidateRequest) (*ValidateResponse, error)
}
func NewEmailService(token string) *EmailService {
return &EmailService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type EmailService struct {
client *client.Client
}
// Parse an RFC5322 address e.g "Joe Blogs <joe@example.com>"
func (t *EmailService) Parse(request *ParseRequest) (*ParseResponse, error) {
rsp := &ParseResponse{}
return rsp, t.client.Call("email", "Parse", request, rsp)
}
// Send an email by passing in from, to, subject, and a text or html body
func (t *EmailService) Send(request *SendRequest) (*SendResponse, error) {
rsp := &SendResponse{}
return rsp, t.client.Call("email", "Send", request, rsp)
}
// Validate an email address format
func (t *EmailService) Validate(request *ValidateRequest) (*ValidateResponse, error) {
rsp := &ValidateResponse{}
return rsp, t.client.Call("email", "Validate", request, rsp)
}
type ParseRequest struct {
// The address to parse. Can be of the format "Joe Blogs <joe@example.com>" or "joe@example.com"
Address string `json:"address"`
}
type ParseResponse struct {
// the email address
Address string `json:"address"`
// associated name e.g Joe Blogs
Name string `json:"name"`
}
type SendRequest struct {
// the display name of the sender
From string `json:"from"`
// the html body
HtmlBody string `json:"html_body"`
// an optional reply to email address
ReplyTo string `json:"reply_to"`
// the email subject
Subject string `json:"subject"`
// the text body
TextBody string `json:"text_body"`
// the email address of the recipient
To string `json:"to"`
}
type SendResponse struct {
}
type ValidateRequest struct {
Address string `json:"address"`
}
type ValidateResponse struct {
IsValid bool `json:"is_valid"`
}

View File

@@ -1,9 +1,15 @@
package emoji package emoji
import ( import (
"github.com/m3o/m3o-go/client" "go.m3o.com/client"
) )
type Emoji interface {
Find(*FindRequest) (*FindResponse, error)
Flag(*FlagRequest) (*FlagResponse, error)
Print(*PrintRequest) (*PrintResponse, error)
}
func NewEmojiService(token string) *EmojiService { func NewEmojiService(token string) *EmojiService {
return &EmojiService{ return &EmojiService{
client: client.NewClient(&client.Options{ client: client.NewClient(&client.Options{
@@ -18,27 +24,27 @@ type EmojiService struct {
// Find an emoji by its alias e.g :beer: // Find an emoji by its alias e.g :beer:
func (t *EmojiService) Find(request *FindRequest) (*FindResponse, error) { func (t *EmojiService) Find(request *FindRequest) (*FindResponse, error) {
rsp := &FindResponse{} rsp := &FindResponse{}
return rsp, t.client.Call("emoji", "Find", request, rsp) return rsp, t.client.Call("emoji", "Find", request, rsp)
} }
// Get the flag for a country. Requires country code e.g GB for great britain // Get the flag for a country. Requires country code e.g GB for great britain
func (t *EmojiService) Flag(request *FlagRequest) (*FlagResponse, error) { func (t *EmojiService) Flag(request *FlagRequest) (*FlagResponse, error) {
rsp := &FlagResponse{} rsp := &FlagResponse{}
return rsp, t.client.Call("emoji", "Flag", request, rsp) return rsp, t.client.Call("emoji", "Flag", request, rsp)
} }
// Print text and renders the emojis with aliases e.g // Print text and renders the emojis with aliases e.g
// let's grab a :beer: becomes let's grab a 🍺 // let's grab a :beer: becomes let's grab a 🍺
func (t *EmojiService) Print(request *PrintRequest) (*PrintResponse, error) { func (t *EmojiService) Print(request *PrintRequest) (*PrintResponse, error) {
rsp := &PrintResponse{} rsp := &PrintResponse{}
return rsp, t.client.Call("emoji", "Print", request, rsp) return rsp, t.client.Call("emoji", "Print", request, rsp)
}
// Send an emoji to anyone via SMS. Messages are sent in the form '<message> Sent from <from>'
func (t *EmojiService) Send(request *SendRequest) (*SendResponse, error) {
rsp := &SendResponse{}
return rsp, t.client.Call("emoji", "Send", request, rsp)
} }
type FindRequest struct { type FindRequest struct {
@@ -70,17 +76,3 @@ type PrintResponse struct {
// text with rendered emojis // text with rendered emojis
Text string `json:"text"` Text string `json:"text"`
} }
type SendRequest struct {
// the name of the sender from e.g Alice
From string `json:"from"`
// message to send including emoji aliases
Message string `json:"message"`
// phone number to send to (including international dialing code)
To string `json:"to"`
}
type SendResponse struct {
// whether or not it succeeded
Success bool `json:"success"`
}

249
evchargers/evchargers.go Executable file
View File

@@ -0,0 +1,249 @@
package evchargers
import (
"go.m3o.com/client"
)
type Evchargers interface {
ReferenceData(*ReferenceDataRequest) (*ReferenceDataResponse, error)
Search(*SearchRequest) (*SearchResponse, error)
}
func NewEvchargersService(token string) *EvchargersService {
return &EvchargersService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type EvchargersService struct {
client *client.Client
}
// Retrieve reference data as used by this API and in conjunction with the Search endpoint
func (t *EvchargersService) ReferenceData(request *ReferenceDataRequest) (*ReferenceDataResponse, error) {
rsp := &ReferenceDataResponse{}
return rsp, t.client.Call("evchargers", "ReferenceData", request, rsp)
}
// Search by giving a coordinate and a max distance, or bounding box and optional filters
func (t *EvchargersService) Search(request *SearchRequest) (*SearchResponse, error) {
rsp := &SearchResponse{}
return rsp, t.client.Call("evchargers", "Search", request, rsp)
}
type Address struct {
// Any comments about how to access the charger
AccessComments string `json:"access_comments"`
AddressLine1 string `json:"address_line_1"`
AddressLine2 string `json:"address_line_2"`
Country *Country `json:"country"`
CountryId string `json:"country_id"`
LatLng string `json:"lat_lng"`
Location *Coordinates `json:"location"`
Postcode string `json:"postcode"`
StateOrProvince string `json:"state_or_province"`
Title string `json:"title"`
Town string `json:"town"`
}
type BoundingBox struct {
BottomLeft *Coordinates `json:"bottom_left"`
TopRight *Coordinates `json:"top_right"`
}
type ChargerType struct {
Comments string `json:"comments"`
Id string `json:"id"`
// Is this 40KW+
IsFastChargeCapable bool `json:"is_fast_charge_capable"`
Title string `json:"title"`
}
type CheckinStatusType struct {
Id string `json:"id"`
IsAutomated bool `json:"is_automated"`
IsPositive bool `json:"is_positive"`
Title string `json:"title"`
}
type Connection struct {
// The amps offered
Amps float64 `json:"amps"`
ConnectionType *ConnectionType `json:"connection_type"`
// The ID of the connection type
ConnectionTypeId string `json:"connection_type_id"`
// The current
Current string `json:"current"`
Level *ChargerType `json:"level"`
// The level of charging power available
LevelId string `json:"level_id"`
// The power in KW
Power float64 `json:"power"`
Reference string `json:"reference"`
// The voltage offered
Voltage float64 `json:"voltage"`
}
type ConnectionType struct {
FormalName string `json:"formal_name"`
Id string `json:"id"`
IsDiscontinued bool `json:"is_discontinued"`
IsObsolete bool `json:"is_obsolete"`
Title string `json:"title"`
}
type Coordinates struct {
Latitude float64 `json:"latitude"`
Longitude float64 `json:"longitude"`
}
type Country struct {
ContinentCode string `json:"continent_code"`
Id string `json:"id"`
IsoCode string `json:"iso_code"`
Title string `json:"title"`
}
type CurrentType struct {
Description string `json:"description"`
Id string `json:"id"`
Title string `json:"title"`
}
type DataProvider struct {
Comments string `json:"comments"`
DataProviderStatusType *DataProviderStatusType `json:"data_provider_status_type"`
Id string `json:"id"`
// How is this data licensed
License string `json:"license"`
Title string `json:"title"`
Website string `json:"website"`
}
type DataProviderStatusType struct {
Id string `json:"id"`
IsProviderEnabled bool `json:"is_provider_enabled"`
Title string `json:"title"`
}
type Operator struct {
Comments string `json:"comments"`
ContactEmail string `json:"contact_email"`
FaultReportEmail string `json:"fault_report_email"`
Id string `json:"id"`
// Is this operator a private individual vs a company
IsPrivateIndividual bool `json:"is_private_individual"`
PhonePrimary string `json:"phone_primary"`
PhoneSecondary string `json:"phone_secondary"`
Title string `json:"title"`
Website string `json:"website"`
}
type Poi struct {
// The address
Address *Address `json:"address"`
// The connections available at this charge point
Connections []Connection `json:"connections"`
// The cost of charging
Cost string `json:"cost"`
// The ID of the data provider
DataProviderId string `json:"data_provider_id"`
// The ID of the charger
Id string `json:"id"`
// The number of charging points
NumPoints int64 `json:"num_points,string"`
// The operator
Operator *Operator `json:"operator"`
// The ID of the operator of the charger
OperatorId string `json:"operator_id"`
// The type of usage
UsageType *UsageType `json:"usage_type"`
// The type of usage for this charger point (is it public, membership required, etc)
UsageTypeId string `json:"usage_type_id"`
}
type ReferenceDataRequest struct {
}
type ReferenceDataResponse struct {
// The types of charger
ChargerTypes *ChargerType `json:"charger_types"`
// The types of checkin status
CheckinStatusTypes *CheckinStatusType `json:"checkin_status_types"`
// The types of connection
ConnectionTypes *ConnectionType `json:"connection_types"`
// The countries
Countries []Country `json:"countries"`
// The types of current
CurrentTypes *CurrentType `json:"current_types"`
// The providers of the charger data
DataProviders *DataProvider `json:"data_providers"`
// The companies operating the chargers
Operators []Operator `json:"operators"`
// The status of the charger
StatusTypes *StatusType `json:"status_types"`
// The status of a submission
SubmissionStatusTypes *SubmissionStatusType `json:"submission_status_types"`
// The different types of usage
UsageTypes *UsageType `json:"usage_types"`
// The types of user comment
UserCommentTypes *UserCommentType `json:"user_comment_types"`
}
type SearchRequest struct {
// Bounding box to search within (top left and bottom right coordinates)
Box *BoundingBox `json:"box"`
// IDs of the connection type
ConnectionTypes string `json:"connection_types"`
// Country ID
CountryId string `json:"country_id"`
// Search distance from point in metres, defaults to 5000m
Distance int64 `json:"distance,string"`
// Supported charging levels
Levels []string `json:"levels"`
// Coordinates from which to begin search
Location *Coordinates `json:"location"`
// Maximum number of results to return, defaults to 100
MaxResults int64 `json:"max_results,string"`
// Minimum power in KW. Note: data not available for many chargers
MinPower int64 `json:"min_power,string"`
// IDs of the the EV charger operator
Operators []string `json:"operators"`
// Usage of the charge point (is it public, membership required, etc)
UsageTypes string `json:"usage_types"`
}
type SearchResponse struct {
Pois []Poi `json:"pois"`
}
type StatusType struct {
Id string `json:"id"`
IsOperational bool `json:"is_operational"`
Title string `json:"title"`
}
type SubmissionStatusType struct {
Id string `json:"id"`
IsLive bool `json:"is_live"`
Title string `json:"title"`
}
type UsageType struct {
Id string `json:"id"`
IsAccessKeyRequired bool `json:"is_access_key_required"`
IsMembershipRequired bool `json:"is_membership_required"`
IsPayAtLocation bool `json:"is_pay_at_location"`
Title string `json:"title"`
}
type UserCommentType struct {
Id string `json:"id"`
Title string `json:"title"`
}

116
event/event.go Executable file
View File

@@ -0,0 +1,116 @@
package event
import (
"go.m3o.com/client"
)
type Event interface {
Consume(*ConsumeRequest) (*ConsumeResponseStream, error)
Publish(*PublishRequest) (*PublishResponse, error)
Read(*ReadRequest) (*ReadResponse, error)
}
func NewEventService(token string) *EventService {
return &EventService{
client: client.NewClient(&client.Options{
Token: token,
}),
}
}
type EventService struct {
client *client.Client
}
// Consume events from a given topic.
func (t *EventService) Consume(request *ConsumeRequest) (*ConsumeResponseStream, error) {
stream, err := t.client.Stream("event", "Consume", request)
if err != nil {
return nil, err
}
return &ConsumeResponseStream{
stream: stream,
}, nil
}
type ConsumeResponseStream struct {
stream *client.Stream
}
func (t *ConsumeResponseStream) Recv() (*ConsumeResponse, error) {
var rsp ConsumeResponse
if err := t.stream.Recv(&rsp); err != nil {
return nil, err
}
return &rsp, nil
}
// Publish a event to the event stream.
func (t *EventService) Publish(request *PublishRequest) (*PublishResponse, error) {
rsp := &PublishResponse{}
return rsp, t.client.Call("event", "Publish", request, rsp)
}
// Read stored events
func (t *EventService) Read(request *ReadRequest) (*ReadResponse, error) {
rsp := &ReadResponse{}
return rsp, t.client.Call("event", "Read", request, rsp)
}
type ConsumeRequest struct {
// Optional group for the subscription
Group string `json:"group"`
// Optional offset to read from e.g "2006-01-02T15:04:05.999Z07:00"
Offset string `json:"offset"`
// The topic to subscribe to
Topic string `json:"topic"`
}
type ConsumeResponse struct {
// Unique message id
Id string `json:"id"`
// The next json message on the topic
Message map[string]interface{} `json:"message"`
// Timestamp of publishing
Timestamp string `json:"timestamp"`
// The topic subscribed to
Topic string `json:"topic"`
}
type Ev struct {
// event id
Id string `json:"id"`
// event message
Message map[string]interface{} `json:"message"`
// event timestamp
Timestamp string `json:"timestamp"`
}
type PublishRequest struct {
// The json message to publish
Message map[string]interface{} `json:"message"`
// The topic to publish to
Topic string `json:"topic"`
}
type PublishResponse struct {
}
type ReadRequest struct {
// number of events to read; default 25
Limit int32 `json:"limit"`
// offset for the events; default 0
Offset int32 `json:"offset"`
// topic to read from
Topic string `json:"topic"`
}
type ReadResponse struct {
// the events
Events []Ev `json:"events"`
}

34
examples/address/README.md Executable file
View File

@@ -0,0 +1,34 @@
# Address
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/address/api](https://m3o.com/address/api).
Endpoints:
## LookupPostcode
Lookup a list of UK addresses by postcode
[https://m3o.com/address/api#LookupPostcode](https://m3o.com/address/api#LookupPostcode)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/address"
)
// Lookup a list of UK addresses by postcode
func LookupPostcode() {
addressService := address.NewAddressService(os.Getenv("M3O_API_TOKEN"))
rsp, err := addressService.LookupPostcode(&address.LookupPostcodeRequest{
Postcode: "SW1A 2AA",
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/address"
)
// Lookup a list of UK addresses by postcode
func LookupPostcode() {
addressService := address.NewAddressService(os.Getenv("M3O_API_TOKEN"))
rsp, err := addressService.LookupPostcode(&address.LookupPostcodeRequest{
Postcode: "SW1A 2AA",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/address"
)
// Lookup a list of UK addresses by postcode
func main() {
addressService := address.NewAddressService(os.Getenv("M3O_API_TOKEN"))
rsp, err := addressService.LookupPostcode(&address.LookupPostcodeRequest{
Postcode: "SW1A 2AA",
})
fmt.Println(rsp, err)
}

34
examples/answer/README.md Executable file
View File

@@ -0,0 +1,34 @@
# Answer
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/answer/api](https://m3o.com/answer/api).
Endpoints:
## Question
Ask a question and receive an instant answer
[https://m3o.com/answer/api#Question](https://m3o.com/answer/api#Question)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/answer"
)
// Ask a question and receive an instant answer
func AskAquestion() {
answerService := answer.NewAnswerService(os.Getenv("M3O_API_TOKEN"))
rsp, err := answerService.Question(&answer.QuestionRequest{
Query: "microsoft",
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/answer"
)
// Ask a question and receive an instant answer
func AskAquestion() {
answerService := answer.NewAnswerService(os.Getenv("M3O_API_TOKEN"))
rsp, err := answerService.Question(&answer.QuestionRequest{
Query: "microsoft",
})
fmt.Println(rsp, err)
}

View File

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/answer"
)
// Ask a question and receive an instant answer
func main() {
answerService := answer.NewAnswerService(os.Getenv("M3O_API_TOKEN"))
rsp, err := answerService.Question(&answer.QuestionRequest{
Query: "microsoft",
})
fmt.Println(rsp, err)
}

232
examples/app/README.md Executable file
View File

@@ -0,0 +1,232 @@
# App
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/app/api](https://m3o.com/app/api).
Endpoints:
## Resolve
Resolve an app by id to its raw backend endpoint
[https://m3o.com/app/api#Resolve](https://m3o.com/app/api#Resolve)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// Resolve an app by id to its raw backend endpoint
func ResolveAppById() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Resolve(&app.ResolveRequest{
Id: "helloworld",
})
fmt.Println(rsp, err)
}
```
## Update
Update the app. The latest source code will be downloaded, built and deployed.
[https://m3o.com/app/api#Update](https://m3o.com/app/api#Update)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// Update the app. The latest source code will be downloaded, built and deployed.
func UpdateAnApp() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Update(&app.UpdateRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}
```
## Delete
Delete an app
[https://m3o.com/app/api#Delete](https://m3o.com/app/api#Delete)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// Delete an app
func DeleteAnApp() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Delete(&app.DeleteRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}
```
## Reserve
Reserve apps beyond the free quota. Call Run after.
[https://m3o.com/app/api#Reserve](https://m3o.com/app/api#Reserve)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// Reserve apps beyond the free quota. Call Run after.
func ReserveAppName() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Reserve(&app.ReserveRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}
```
## List
List all the apps
[https://m3o.com/app/api#List](https://m3o.com/app/api#List)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// List all the apps
func ListTheApps() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.List(&app.ListRequest{
})
fmt.Println(rsp, err)
}
```
## Run
Run an app from source
[https://m3o.com/app/api#Run](https://m3o.com/app/api#Run)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// Run an app from source
func RunAnApp() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Run(&app.RunRequest{
Branch: "master",
Name: "helloworld",
Port: 8080,
Region: "europe-west1",
Repo: "github.com/asim/helloworld",
})
fmt.Println(rsp, err)
}
```
## Regions
Return the support regions
[https://m3o.com/app/api#Regions](https://m3o.com/app/api#Regions)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// Return the support regions
func ListRegions() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Regions(&app.RegionsRequest{
})
fmt.Println(rsp, err)
}
```
## Status
Get the status of an app
[https://m3o.com/app/api#Status](https://m3o.com/app/api#Status)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/app"
)
// Get the status of an app
func GetTheStatusOfAnApp() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Status(&app.StatusRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// Delete an app
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Delete(&app.DeleteRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// List all the apps
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.List(&app.ListRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// Return the support regions
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Regions(&app.RegionsRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// Reserve apps beyond the free quota. Call Run after.
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Reserve(&app.ReserveRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// Resolve an app by id to its raw backend endpoint
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Resolve(&app.ResolveRequest{
Id: "helloworld",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,21 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// Run an app from source
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Run(&app.RunRequest{
Branch: "master",
Name: "helloworld",
Port: 8080,
Region: "europe-west1",
Repo: "github.com/asim/helloworld",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// Get the status of an app
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Status(&app.StatusRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/app"
)
// Update the app. The latest source code will be downloaded, built and deployed.
func main() {
appService := app.NewAppService(os.Getenv("M3O_API_TOKEN"))
rsp, err := appService.Update(&app.UpdateRequest{
Name: "helloworld",
})
fmt.Println(rsp, err)
}

68
examples/avatar/README.md Executable file
View File

@@ -0,0 +1,68 @@
# Avatar
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/avatar/api](https://m3o.com/avatar/api).
Endpoints:
## Generate
Generate an unique avatar
[https://m3o.com/avatar/api#Generate](https://m3o.com/avatar/api#Generate)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/avatar"
)
// Generate an unique avatar
func GenerateAvatarAndReturnBase64stringOfTheAvatar() {
avatarService := avatar.NewAvatarService(os.Getenv("M3O_API_TOKEN"))
rsp, err := avatarService.Generate(&avatar.GenerateRequest{
Format: "jpeg",
Gender: "female",
Upload: false,
Username: "",
})
fmt.Println(rsp, err)
}
```
## Generate
Generate an unique avatar
[https://m3o.com/avatar/api#Generate](https://m3o.com/avatar/api#Generate)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/avatar"
)
// Generate an unique avatar
func GenerateAnAvatarAndUploadTheAvatarToMicrosCdn() {
avatarService := avatar.NewAvatarService(os.Getenv("M3O_API_TOKEN"))
rsp, err := avatarService.Generate(&avatar.GenerateRequest{
Format: "png",
Gender: "female",
Upload: true,
Username: "",
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,20 @@
package main
import (
"fmt"
"os"
"go.m3o.com/avatar"
)
// Generate an unique avatar
func main() {
avatarService := avatar.NewAvatarService(os.Getenv("M3O_API_TOKEN"))
rsp, err := avatarService.Generate(&avatar.GenerateRequest{
Format: "png",
Gender: "female",
Upload: true,
Username: "",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,20 @@
package main
import (
"fmt"
"os"
"go.m3o.com/avatar"
)
// Generate an unique avatar
func main() {
avatarService := avatar.NewAvatarService(os.Getenv("M3O_API_TOKEN"))
rsp, err := avatarService.Generate(&avatar.GenerateRequest{
Format: "jpeg",
Gender: "female",
Upload: false,
Username: "",
})
fmt.Println(rsp, err)
}

176
examples/cache/README.md vendored Executable file
View File

@@ -0,0 +1,176 @@
# Cache
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/cache/api](https://m3o.com/cache/api).
Endpoints:
## Decrement
Decrement a value (if it's a number). If key not found it is equivalent to set.
[https://m3o.com/cache/api#Decrement](https://m3o.com/cache/api#Decrement)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/cache"
)
// Decrement a value (if it's a number). If key not found it is equivalent to set.
func DecrementAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Decrement(&cache.DecrementRequest{
Key: "counter",
Value: 2,
})
fmt.Println(rsp, err)
}
```
## ListKeys
List all the available keys
[https://m3o.com/cache/api#ListKeys](https://m3o.com/cache/api#ListKeys)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/cache"
)
// List all the available keys
func ListTheKeys() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.ListKeys(&cache.ListKeysRequest{
})
fmt.Println(rsp, err)
}
```
## Set
Set an item in the cache. Overwrites any existing value already set.
[https://m3o.com/cache/api#Set](https://m3o.com/cache/api#Set)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/cache"
)
// Set an item in the cache. Overwrites any existing value already set.
func SetAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Set(&cache.SetRequest{
Key: "foo",
Value: "bar",
})
fmt.Println(rsp, err)
}
```
## Get
Get an item from the cache by key. If key is not found, an empty response is returned.
[https://m3o.com/cache/api#Get](https://m3o.com/cache/api#Get)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/cache"
)
// Get an item from the cache by key. If key is not found, an empty response is returned.
func GetAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Get(&cache.GetRequest{
Key: "foo",
})
fmt.Println(rsp, err)
}
```
## Delete
Delete a value from the cache. If key not found a success response is returned.
[https://m3o.com/cache/api#Delete](https://m3o.com/cache/api#Delete)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/cache"
)
// Delete a value from the cache. If key not found a success response is returned.
func DeleteAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Delete(&cache.DeleteRequest{
Key: "foo",
})
fmt.Println(rsp, err)
}
```
## Increment
Increment a value (if it's a number). If key not found it is equivalent to set.
[https://m3o.com/cache/api#Increment](https://m3o.com/cache/api#Increment)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/cache"
)
// Increment a value (if it's a number). If key not found it is equivalent to set.
func IncrementAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Increment(&cache.IncrementRequest{
Key: "counter",
Value: 2,
})
fmt.Println(rsp, err)
}
```

18
examples/cache/decrement/decrementAValue.go vendored Executable file
View File

@@ -0,0 +1,18 @@
package example
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Decrement a value (if it's a number). If key not found it is equivalent to set.
func DecrementAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Decrement(&cache.DecrementRequest{
Key: "counter",
Value: 2,
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,18 @@
package main
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Decrement a value (if it's a number). If key not found it is equivalent to set.
func main() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Decrement(&cache.DecrementRequest{
Key: "counter",
Value: 2,
})
fmt.Println(rsp, err)
}

17
examples/cache/delete/deleteAValue.go vendored Executable file
View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Delete a value from the cache. If key not found a success response is returned.
func DeleteAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Delete(&cache.DeleteRequest{
Key: "foo",
})
fmt.Println(rsp, err)
}

17
examples/cache/delete/deleteAValue/main.go vendored Executable file
View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Delete a value from the cache. If key not found a success response is returned.
func main() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Delete(&cache.DeleteRequest{
Key: "foo",
})
fmt.Println(rsp, err)
}

17
examples/cache/get/getAValue.go vendored Executable file
View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Get an item from the cache by key. If key is not found, an empty response is returned.
func GetAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Get(&cache.GetRequest{
Key: "foo",
})
fmt.Println(rsp, err)
}

17
examples/cache/get/getAValue/main.go vendored Executable file
View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Get an item from the cache by key. If key is not found, an empty response is returned.
func main() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Get(&cache.GetRequest{
Key: "foo",
})
fmt.Println(rsp, err)
}

18
examples/cache/increment/incrementAValue.go vendored Executable file
View File

@@ -0,0 +1,18 @@
package example
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Increment a value (if it's a number). If key not found it is equivalent to set.
func IncrementAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Increment(&cache.IncrementRequest{
Key: "counter",
Value: 2,
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,18 @@
package main
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Increment a value (if it's a number). If key not found it is equivalent to set.
func main() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Increment(&cache.IncrementRequest{
Key: "counter",
Value: 2,
})
fmt.Println(rsp, err)
}

15
examples/cache/listKeys/listTheKeys/main.go vendored Executable file
View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// List all the available keys
func main() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.ListKeys(&cache.ListKeysRequest{})
fmt.Println(rsp, err)
}

18
examples/cache/set/setAValue.go vendored Executable file
View File

@@ -0,0 +1,18 @@
package example
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Set an item in the cache. Overwrites any existing value already set.
func SetAvalue() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Set(&cache.SetRequest{
Key: "foo",
Value: "bar",
})
fmt.Println(rsp, err)
}

0
examples/cache/set/setAValue/.run vendored Executable file
View File

18
examples/cache/set/setAValue/main.go vendored Executable file
View File

@@ -0,0 +1,18 @@
package main
import (
"fmt"
"os"
"go.m3o.com/cache"
)
// Set an item in the cache. Overwrites any existing value already set.
func main() {
cacheService := cache.NewCacheService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cacheService.Set(&cache.SetRequest{
Key: "foo",
Value: "bar",
})
fmt.Println(rsp, err)
}

33
examples/carbon/README.md Executable file
View File

@@ -0,0 +1,33 @@
# Carbon
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/carbon/api](https://m3o.com/carbon/api).
Endpoints:
## Offset
Purchase 1KG (0.001 tonne) of carbon offsets in a single request
[https://m3o.com/carbon/api#Offset](https://m3o.com/carbon/api#Offset)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/carbon"
)
// Purchase 1KG (0.001 tonne) of carbon offsets in a single request
func OffsetCarbon() {
carbonService := carbon.NewCarbonService(os.Getenv("M3O_API_TOKEN"))
rsp, err := carbonService.Offset(&carbon.OffsetRequest{
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/carbon"
)
// Purchase 1KG (0.001 tonne) of carbon offsets in a single request
func main() {
carbonService := carbon.NewCarbonService(os.Getenv("M3O_API_TOKEN"))
rsp, err := carbonService.Offset(&carbon.OffsetRequest{})
fmt.Println(rsp, err)
}

269
examples/chat/README.md Executable file
View File

@@ -0,0 +1,269 @@
# Chat
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/chat/api](https://m3o.com/chat/api).
Endpoints:
## Create
Create a new chat room
[https://m3o.com/chat/api#Create](https://m3o.com/chat/api#Create)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// Create a new chat room
func CreateAnewChat() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Create(&chat.CreateRequest{
Description: "The general chat room",
Name: "general",
})
fmt.Println(rsp, err)
}
```
## Invite
Invite a user to a chat room
[https://m3o.com/chat/api#Invite](https://m3o.com/chat/api#Invite)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// Invite a user to a chat room
func InviteAuser() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Invite(&chat.InviteRequest{
})
fmt.Println(rsp, err)
}
```
## Send
Connect to a chat to receive a stream of messages
Send a message to a chat
[https://m3o.com/chat/api#Send](https://m3o.com/chat/api#Send)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// Connect to a chat to receive a stream of messages
// Send a message to a chat
func SendAmessage() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Send(&chat.SendRequest{
Client: "web",
Subject: "Random",
Text: "Hey whats up?",
})
fmt.Println(rsp, err)
}
```
## History
List the messages in a chat
[https://m3o.com/chat/api#History](https://m3o.com/chat/api#History)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// List the messages in a chat
func GetChatHistory() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.History(&chat.HistoryRequest{
})
fmt.Println(rsp, err)
}
```
## Join
Join a chat room
[https://m3o.com/chat/api#Join](https://m3o.com/chat/api#Join)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// Join a chat room
func JoinAroom() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
stream, err := chatService.Join(&chat.JoinRequest{
})
if err != nil {
fmt.Println(err)
return
}
for {
rsp, err := stream.Recv()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(rsp)
}
}
```
## Kick
Kick a user from a chat room
[https://m3o.com/chat/api#Kick](https://m3o.com/chat/api#Kick)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// Kick a user from a chat room
func KickAuserFromAroom() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Kick(&chat.KickRequest{
})
fmt.Println(rsp, err)
}
```
## Leave
Leave a chat room
[https://m3o.com/chat/api#Leave](https://m3o.com/chat/api#Leave)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// Leave a chat room
func LeaveAroom() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Leave(&chat.LeaveRequest{
})
fmt.Println(rsp, err)
}
```
## List
List available chats
[https://m3o.com/chat/api#List](https://m3o.com/chat/api#List)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// List available chats
func ListChatRooms() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.List(&chat.ListRequest{
})
fmt.Println(rsp, err)
}
```
## Delete
Delete a chat room
[https://m3o.com/chat/api#Delete](https://m3o.com/chat/api#Delete)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/chat"
)
// Delete a chat room
func DeleteAchat() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Delete(&chat.DeleteRequest{
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,18 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// Create a new chat room
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Create(&chat.CreateRequest{
Description: "The general chat room",
Name: "general",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// Delete a chat room
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Delete(&chat.DeleteRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// List the messages in a chat
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.History(&chat.HistoryRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// Invite a user to a chat room
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Invite(&chat.InviteRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,28 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// Join a chat room
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
stream, err := chatService.Join(&chat.JoinRequest{})
if err != nil {
fmt.Println(err)
return
}
for {
rsp, err := stream.Recv()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(rsp)
}
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// Kick a user from a chat room
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Kick(&chat.KickRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// Leave a chat room
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Leave(&chat.LeaveRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// List available chats
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.List(&chat.ListRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,20 @@
package main
import (
"fmt"
"os"
"go.m3o.com/chat"
)
// Connect to a chat to receive a stream of messages
// Send a message to a chat
func main() {
chatService := chat.NewChatService(os.Getenv("M3O_API_TOKEN"))
rsp, err := chatService.Send(&chat.SendRequest{
Client: "web",
Subject: "Random",
Text: "Hey whats up?",
})
fmt.Println(rsp, err)
}

190
examples/comments/README.md Executable file
View File

@@ -0,0 +1,190 @@
# Comments
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/comments/api](https://m3o.com/comments/api).
Endpoints:
## Create
Create a new comment
[https://m3o.com/comments/api#Create](https://m3o.com/comments/api#Create)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/comments"
)
// Create a new comment
func CreateAcomment() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Create(&comments.CreateRequest{
Text: "This is my comment",
})
fmt.Println(rsp, err)
}
```
## Read
Read a comment
[https://m3o.com/comments/api#Read](https://m3o.com/comments/api#Read)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/comments"
)
// Read a comment
func ReadAcomment() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Read(&comments.ReadRequest{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
})
fmt.Println(rsp, err)
}
```
## List
List all the comments
[https://m3o.com/comments/api#List](https://m3o.com/comments/api#List)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/comments"
)
// List all the comments
func ListAllComments() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.List(&comments.ListRequest{
})
fmt.Println(rsp, err)
}
```
## Update
Update a comment
[https://m3o.com/comments/api#Update](https://m3o.com/comments/api#Update)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/comments"
)
// Update a comment
func UpdateAcomment() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Update(&comments.UpdateRequest{
Comment: &comments.Comment{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
Subject: "Update Comment",
Text: "Updated comment text",
},
})
fmt.Println(rsp, err)
}
```
## Delete
Delete a comment
[https://m3o.com/comments/api#Delete](https://m3o.com/comments/api#Delete)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/comments"
)
// Delete a comment
func DeleteAcomment() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Delete(&comments.DeleteRequest{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
})
fmt.Println(rsp, err)
}
```
## Events
Subscribe to comments events
[https://m3o.com/comments/api#Events](https://m3o.com/comments/api#Events)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/comments"
)
// Subscribe to comments events
func SubscribeToEvents() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
stream, err := commentsService.Events(&comments.EventsRequest{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
})
if err != nil {
fmt.Println(err)
return
}
for {
rsp, err := stream.Recv()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(rsp)
}
}
```

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/comments"
)
// Create a new comment
func main() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Create(&comments.CreateRequest{
Text: "This is my comment",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/comments"
)
// Delete a comment
func main() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Delete(&comments.DeleteRequest{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,30 @@
package main
import (
"fmt"
"os"
"go.m3o.com/comments"
)
// Subscribe to comments events
func main() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
stream, err := commentsService.Events(&comments.EventsRequest{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
})
if err != nil {
fmt.Println(err)
return
}
for {
rsp, err := stream.Recv()
if err != nil {
fmt.Println(err)
return
}
fmt.Println(rsp)
}
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/comments"
)
// List all the comments
func main() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.List(&comments.ListRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/comments"
)
// Read a comment
func main() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Read(&comments.ReadRequest{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,21 @@
package main
import (
"fmt"
"os"
"go.m3o.com/comments"
)
// Update a comment
func main() {
commentsService := comments.NewCommentsService(os.Getenv("M3O_API_TOKEN"))
rsp, err := commentsService.Update(&comments.UpdateRequest{
Comment: &comments.Comment{
Id: "63c0cdf8-2121-11ec-a881-0242e36f037a",
Subject: "Update Comment",
Text: "Updated comment text",
},
})
fmt.Println(rsp, err)
}

219
examples/contact/README.md Executable file
View File

@@ -0,0 +1,219 @@
# Contact
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/contact/api](https://m3o.com/contact/api).
Endpoints:
## Delete
Delete a contact
[https://m3o.com/contact/api#Delete](https://m3o.com/contact/api#Delete)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/contact"
)
// Delete a contact
func DeleteAcontact() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Delete(&contact.DeleteRequest{
Id: "42e48a3c-6221-11ec-96d2-acde48001122",
})
fmt.Println(rsp, err)
}
```
## List
List contacts
[https://m3o.com/contact/api#List](https://m3o.com/contact/api#List)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/contact"
)
// List contacts
func ListContactsWithDefaultOffsetAndLimitDefaultLimitIs20() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.List(&contact.ListRequest{
})
fmt.Println(rsp, err)
}
```
## List
List contacts
[https://m3o.com/contact/api#List](https://m3o.com/contact/api#List)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/contact"
)
// List contacts
func ListContactsWithSpecificOffsetAndLimit() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.List(&contact.ListRequest{
Limit: 1,
Offset: 1,
})
fmt.Println(rsp, err)
}
```
## Create
Create a contact
[https://m3o.com/contact/api#Create](https://m3o.com/contact/api#Create)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/contact"
)
// Create a contact
func CreateAcontact() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Create(&contact.CreateRequest{
Addresses: []contact.Address{
contact.Address{
Label: "company address",
Location: "123 street address",
}},
Birthday: "1995-01-01",
Emails: []contact.Email{
contact.Email{
Address: "home@example.com",
Label: "home",
}},
Links: []contact.Link{
contact.Link{
Label: "blog",
Url: "https://blog.joe.me",
}},
Name: "joe",
Note: "this person is very important",
Phones: []contact.Phone{
contact.Phone{
Label: "home",
Number: "010-12345678",
}},
})
fmt.Println(rsp, err)
}
```
## Update
Update a contact
[https://m3o.com/contact/api#Update](https://m3o.com/contact/api#Update)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/contact"
)
// Update a contact
func UpdateAcontact() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Update(&contact.UpdateRequest{
Addresses: []contact.Address{
contact.Address{
Label: "company address",
Location: "123 street address",
}},
Birthday: "1995-01-01",
Emails: []contact.Email{
contact.Email{
Address: "home@example.com",
Label: "home",
}},
Id: "42e48a3c-6221-11ec-96d2-acde48001122",
Links: []contact.Link{
contact.Link{
Label: "blog",
Url: "https://blog.joe.me",
}},
Name: "joe",
Note: "this person is very important",
Phones: []contact.Phone{
contact.Phone{
Label: "home",
Number: "010-12345678",
}},
})
fmt.Println(rsp, err)
}
```
## Read
Read contact details
[https://m3o.com/contact/api#Read](https://m3o.com/contact/api#Read)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/contact"
)
// Read contact details
func GetAcontact() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Read(&contact.ReadRequest{
Id: "42e48a3c-6221-11ec-96d2-acde48001122",
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,39 @@
package main
import (
"fmt"
"os"
"go.m3o.com/contact"
)
// Create a contact
func main() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Create(&contact.CreateRequest{
Addresses: []contact.Address{
contact.Address{
Label: "company address",
Location: "123 street address",
}},
Birthday: "1995-01-01",
Emails: []contact.Email{
contact.Email{
Address: "home@example.com",
Label: "home",
}},
Links: []contact.Link{
contact.Link{
Label: "blog",
Url: "https://blog.joe.me",
}},
Name: "joe",
Note: "this person is very important",
Phones: []contact.Phone{
contact.Phone{
Label: "home",
Number: "010-12345678",
}},
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/contact"
)
// Delete a contact
func main() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Delete(&contact.DeleteRequest{
Id: "42e48a3c-6221-11ec-96d2-acde48001122",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/contact"
)
// List contacts
func main() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.List(&contact.ListRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,18 @@
package main
import (
"fmt"
"os"
"go.m3o.com/contact"
)
// List contacts
func main() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.List(&contact.ListRequest{
Limit: 1,
Offset: 1,
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/contact"
)
// Read contact details
func main() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Read(&contact.ReadRequest{
Id: "42e48a3c-6221-11ec-96d2-acde48001122",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,40 @@
package main
import (
"fmt"
"os"
"go.m3o.com/contact"
)
// Update a contact
func main() {
contactService := contact.NewContactService(os.Getenv("M3O_API_TOKEN"))
rsp, err := contactService.Update(&contact.UpdateRequest{
Addresses: []contact.Address{
contact.Address{
Label: "company address",
Location: "123 street address",
}},
Birthday: "1995-01-01",
Emails: []contact.Email{
contact.Email{
Address: "home@example.com",
Label: "home",
}},
Id: "42e48a3c-6221-11ec-96d2-acde48001122",
Links: []contact.Link{
contact.Link{
Label: "blog",
Url: "https://blog.joe.me",
}},
Name: "joe",
Note: "this person is very important",
Phones: []contact.Phone{
contact.Phone{
Label: "home",
Number: "010-12345678",
}},
})
fmt.Println(rsp, err)
}

145
examples/crypto/README.md Executable file
View File

@@ -0,0 +1,145 @@
# Crypto
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/crypto/api](https://m3o.com/crypto/api).
Endpoints:
## News
Get news related to a currency
[https://m3o.com/crypto/api#News](https://m3o.com/crypto/api#News)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get news related to a currency
func GetCryptocurrencyNews() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.News(&crypto.NewsRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}
```
## Price
Get the last price for a given crypto ticker
[https://m3o.com/crypto/api#Price](https://m3o.com/crypto/api#Price)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get the last price for a given crypto ticker
func GetCryptocurrencyPrice() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Price(&crypto.PriceRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}
```
## Quote
Get the last quote for a given crypto ticker
[https://m3o.com/crypto/api#Quote](https://m3o.com/crypto/api#Quote)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get the last quote for a given crypto ticker
func GetAcryptocurrencyQuote() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Quote(&crypto.QuoteRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}
```
## History
Returns the history for the previous close
[https://m3o.com/crypto/api#History](https://m3o.com/crypto/api#History)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/crypto"
)
// Returns the history for the previous close
func GetPreviousClose() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.History(&crypto.HistoryRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}
```
## Symbols
Returns the full list of supported symbols
[https://m3o.com/crypto/api#Symbols](https://m3o.com/crypto/api#Symbols)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/crypto"
)
// Returns the full list of supported symbols
func GetListOfAllSupportedSymbols() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Symbols(&crypto.SymbolsRequest{
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Returns the history for the previous close
func GetPreviousClose() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.History(&crypto.HistoryRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Returns the history for the previous close
func main() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.History(&crypto.HistoryRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get news related to a currency
func GetCryptocurrencyNews() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.News(&crypto.NewsRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get news related to a currency
func main() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.News(&crypto.NewsRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get the last price for a given crypto ticker
func GetCryptocurrencyPrice() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Price(&crypto.PriceRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get the last price for a given crypto ticker
func main() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Price(&crypto.PriceRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package example
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get the last quote for a given crypto ticker
func GetAcryptocurrencyQuote() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Quote(&crypto.QuoteRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,17 @@
package main
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Get the last quote for a given crypto ticker
func main() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Quote(&crypto.QuoteRequest{
Symbol: "BTCUSD",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/crypto"
)
// Returns the full list of supported symbols
func main() {
cryptoService := crypto.NewCryptoService(os.Getenv("M3O_API_TOKEN"))
rsp, err := cryptoService.Symbols(&crypto.SymbolsRequest{})
fmt.Println(rsp, err)
}

149
examples/currency/README.md Executable file
View File

@@ -0,0 +1,149 @@
# Currency
An [m3o.com](https://m3o.com) API. For example usage see [m3o.com/currency/api](https://m3o.com/currency/api).
Endpoints:
## Codes
Codes returns the supported currency codes for the API
[https://m3o.com/currency/api#Codes](https://m3o.com/currency/api#Codes)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/currency"
)
// Codes returns the supported currency codes for the API
func GetSupportedCodes() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Codes(&currency.CodesRequest{
})
fmt.Println(rsp, err)
}
```
## Rates
Rates returns the currency rates for a given code e.g USD
[https://m3o.com/currency/api#Rates](https://m3o.com/currency/api#Rates)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/currency"
)
// Rates returns the currency rates for a given code e.g USD
func GetRatesForUsd() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Rates(&currency.RatesRequest{
Code: "USD",
})
fmt.Println(rsp, err)
}
```
## Convert
Convert returns the currency conversion rate between two pairs e.g USD/GBP
[https://m3o.com/currency/api#Convert](https://m3o.com/currency/api#Convert)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/currency"
)
// Convert returns the currency conversion rate between two pairs e.g USD/GBP
func ConvertUsdToGbp() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Convert(&currency.ConvertRequest{
From: "USD",
To: "GBP",
})
fmt.Println(rsp, err)
}
```
## Convert
Convert returns the currency conversion rate between two pairs e.g USD/GBP
[https://m3o.com/currency/api#Convert](https://m3o.com/currency/api#Convert)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/currency"
)
// Convert returns the currency conversion rate between two pairs e.g USD/GBP
func Convert10usdToGbp() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Convert(&currency.ConvertRequest{
Amount: 10,
From: "USD",
To: "GBP",
})
fmt.Println(rsp, err)
}
```
## History
Returns the historic rates for a currency on a given date
[https://m3o.com/currency/api#History](https://m3o.com/currency/api#History)
```go
package example
import(
"fmt"
"os"
"go.m3o.com/currency"
)
// Returns the historic rates for a currency on a given date
func HistoricRatesForAcurrency() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.History(&currency.HistoryRequest{
Code: "USD",
Date: "2021-05-30",
})
fmt.Println(rsp, err)
}
```

View File

@@ -0,0 +1,15 @@
package example
import (
"fmt"
"os"
"go.m3o.com/currency"
)
// Codes returns the supported currency codes for the API
func GetSupportedCodes() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Codes(&currency.CodesRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"go.m3o.com/currency"
)
// Codes returns the supported currency codes for the API
func main() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Codes(&currency.CodesRequest{})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,19 @@
package example
import (
"fmt"
"os"
"go.m3o.com/currency"
)
// Convert returns the currency conversion rate between two pairs e.g USD/GBP
func Convert10usdToGbp() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Convert(&currency.ConvertRequest{
Amount: 10,
From: "USD",
To: "GBP",
})
fmt.Println(rsp, err)
}

View File

@@ -0,0 +1,19 @@
package main
import (
"fmt"
"os"
"go.m3o.com/currency"
)
// Convert returns the currency conversion rate between two pairs e.g USD/GBP
func main() {
currencyService := currency.NewCurrencyService(os.Getenv("M3O_API_TOKEN"))
rsp, err := currencyService.Convert(&currency.ConvertRequest{
Amount: 10,
From: "USD",
To: "GBP",
})
fmt.Println(rsp, err)
}

Some files were not shown because too many files have changed in this diff Show More