From 91cbb73ac87618bd13c333f7c612fa7bc817697e Mon Sep 17 00:00:00 2001
From: Jorik Schellekens <joriksch@gmail.com>
Date: Wed, 16 Sep 2020 14:28:29 +0100
Subject: [PATCH] add clients

---
 src/clients/Element.io.ts     |   2 +
 src/clients/Fractal.tsx       |  69 +++++++++++++++
 src/clients/Nheko.tsx         |  85 +++++++++++++++++++
 src/clients/Weechat.tsx       |  11 +++
 src/clients/index.ts          |   6 +-
 src/clients/types.ts          |   3 +
 src/components/ClientList.tsx |   4 +
 src/imgs/fractal.png          | Bin 0 -> 8796 bytes
 src/imgs/nheko.svg            | 155 ++++++++++++++++++++++++++++++++++
 9 files changed, 334 insertions(+), 1 deletion(-)
 create mode 100644 src/clients/Fractal.tsx
 create mode 100644 src/clients/Nheko.tsx
 create mode 100644 src/imgs/fractal.png
 create mode 100644 src/imgs/nheko.svg

diff --git a/src/clients/Element.io.ts b/src/clients/Element.io.ts
index 6d4f6c1..8a346ae 100644
--- a/src/clients/Element.io.ts
+++ b/src/clients/Element.io.ts
@@ -56,6 +56,7 @@ const Element: LinkedClient = {
                 );
         }
     },
+    linkSupport: () => true,
 };
 
 export const ElementDevelop: LinkedClient = {
@@ -90,5 +91,6 @@ export const ElementDevelop: LinkedClient = {
                 );
         }
     },
+    linkSupport: () => true,
 };
 export default Element;
diff --git a/src/clients/Fractal.tsx b/src/clients/Fractal.tsx
new file mode 100644
index 0000000..a0caaac
--- /dev/null
+++ b/src/clients/Fractal.tsx
@@ -0,0 +1,69 @@
+/*
+Copyright 2020 The Matrix.org Foundation C.I.C.
+
+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.
+*/
+
+import React from 'react';
+
+import { TextClient, Maturity, ClientKind, ClientId, Platform } from './types';
+
+import { LinkKind } from '../parser/types';
+
+import logo from '../imgs/fractal.png';
+
+const Fractal: TextClient = {
+    kind: ClientKind.TEXT_CLIENT,
+    name: 'Fractal',
+    logo: logo,
+    author: 'Daniel Garcia Moreno',
+    homepage: 'https://github.com/poljar/weechat-matrix',
+    maturity: Maturity.BETA,
+    experimental: false,
+    platform: Platform.Desktop,
+    clientId: ClientId.Fractal,
+    toInviteString: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+            case LinkKind.UserId:
+                return <span>Click the '+' button in the top right</span>;
+            default:
+                return <span>Weechat doesn't support this kind of link</span>;
+        }
+    },
+    copyString: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+            case LinkKind.UserId:
+                return `${link.identifier}`;
+            default:
+                return '';
+        }
+    },
+    linkSupport: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+            case LinkKind.UserId:
+                return true;
+            default:
+                return false;
+        }
+    },
+
+    description: 'Command-line Matrix interface using Weechat',
+};
+
+export default Fractal;
diff --git a/src/clients/Nheko.tsx b/src/clients/Nheko.tsx
new file mode 100644
index 0000000..a0954d1
--- /dev/null
+++ b/src/clients/Nheko.tsx
@@ -0,0 +1,85 @@
+/*
+Copyright 2020 The Matrix.org Foundation C.I.C.
+
+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.
+*/
+
+import React from 'react';
+
+import { TextClient, Maturity, ClientKind, ClientId, Platform } from './types';
+
+import { LinkKind } from '../parser/types';
+
+import logo from '../imgs/nheko.svg';
+
+const Nheko: TextClient = {
+    kind: ClientKind.TEXT_CLIENT,
+    name: 'Nheko',
+    logo: logo,
+    author: 'mujx, red_sky, deepbluev7, Konstantinos Sideris',
+    homepage: 'https://github.com/Nheko-Reborn/nheko',
+    maturity: Maturity.BETA,
+    experimental: false,
+    platform: Platform.Desktop,
+    clientId: ClientId.Nheko,
+    toInviteString: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+                return (
+                    <span>
+                        Type{' '}
+                        <code>
+                            /join <b>{link.identifier}</b>
+                        </code>
+                    </span>
+                );
+            case LinkKind.UserId:
+                return (
+                    <span>
+                        Type{' '}
+                        <code>
+                            /invite <b>{link.identifier}</b>
+                        </code>
+                    </span>
+                );
+            default:
+                return <span>Nheko doesn't support this kind of link</span>;
+        }
+    },
+    copyString: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+                return `/join ${link.identifier}`;
+            case LinkKind.UserId:
+                return `/invite ${link.identifier}`;
+            default:
+                return '';
+        }
+    },
+    linkSupport: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+            case LinkKind.UserId:
+                return true;
+            default:
+                return false;
+        }
+    },
+    description:
+        'A native desktop app for Matrix that feels more like a mainstream chat app.',
+};
+
+export default Nheko;
diff --git a/src/clients/Weechat.tsx b/src/clients/Weechat.tsx
index ff6b528..cd15769 100644
--- a/src/clients/Weechat.tsx
+++ b/src/clients/Weechat.tsx
@@ -68,6 +68,17 @@ const Weechat: TextClient = {
                 return '';
         }
     },
+    linkSupport: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+            case LinkKind.UserId:
+                return true;
+            default:
+                return false;
+        }
+    },
+
     description: 'Command-line Matrix interface using Weechat',
 };
 
diff --git a/src/clients/index.ts b/src/clients/index.ts
index ba39676..c3686bb 100644
--- a/src/clients/index.ts
+++ b/src/clients/index.ts
@@ -18,11 +18,13 @@ import { Client } from './types';
 
 import Element, { ElementDevelop } from './Element.io';
 import Weechat from './Weechat';
+import Nheko from './Nheko';
+import Fractal from './Fractal';
 
 /*
  * All the supported clients of matrix.to
  */
-const clients: Client[] = [Element, Weechat, ElementDevelop];
+const clients: Client[] = [Element, Weechat, Nheko, Fractal, ElementDevelop];
 
 /*
  * A map from sharer string to client.
@@ -33,6 +35,8 @@ export const clientMap: { [key: string]: Client } = {
     [Element.clientId]: Element,
     [Weechat.clientId]: Weechat,
     [ElementDevelop.clientId]: ElementDevelop,
+    [Nheko.clientId]: Nheko,
+    [Fractal.clientId]: Fractal,
 };
 
 /*
diff --git a/src/clients/types.ts b/src/clients/types.ts
index cdaed27..5a93f15 100644
--- a/src/clients/types.ts
+++ b/src/clients/types.ts
@@ -49,6 +49,8 @@ export enum ClientId {
     Element = 'element.io',
     ElementDevelop = 'develop.element.io',
     WeeChat = 'weechat',
+    Nheko = 'nheko',
+    Fractal = 'fractal',
 }
 
 /*
@@ -64,6 +66,7 @@ export interface ClientDescription {
     maturity: Maturity;
     clientId: ClientId;
     experimental: boolean;
+    linkSupport: (link: SafeLink) => boolean;
 }
 
 /*
diff --git a/src/components/ClientList.tsx b/src/components/ClientList.tsx
index fbef28f..4d23d37 100644
--- a/src/components/ClientList.tsx
+++ b/src/components/ClientList.tsx
@@ -63,6 +63,10 @@ const ClientList: React.FC<IProps> = ({ link, rememberSelection }: IProps) => {
             showClient = false;
         }
 
+        if (!client.linkSupport(link)) {
+            showClient = false;
+        }
+
         return showClient;
     };
 
diff --git a/src/imgs/fractal.png b/src/imgs/fractal.png
new file mode 100644
index 0000000000000000000000000000000000000000..e60c89c98878256859f41e0667183cccf6de2d68
GIT binary patch
literal 8796
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

literal 0
HcmV?d00001

diff --git a/src/imgs/nheko.svg b/src/imgs/nheko.svg
new file mode 100644
index 0000000..ce3ec40
--- /dev/null
+++ b/src/imgs/nheko.svg
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1024"
+   height="1024"
+   viewBox="0 0 270.93333 270.93333"
+   version="1.1"
+   id="svg8"
+   inkscape:version="0.92.4 5da689c313, 2019-01-14"
+   sodipodi:docname="nheko.svg"
+   inkscape:export-filename="/home/nicolas/Dokumente/devel/open-source/nheko/resources/nheko-rebuild-round-corners.svg.png"
+   inkscape:export-xdpi="130.048"
+   inkscape:export-ydpi="130.048">
+  <defs
+     id="defs2" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35355339"
+     inkscape:cx="852.07808"
+     inkscape:cy="-60.410565"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer2"
+     showgrid="true"
+     inkscape:window-width="1920"
+     inkscape:window-height="1019"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     showguides="true"
+     inkscape:snap-grids="true"
+     gridtolerance="10"
+     inkscape:snap-bbox="false"
+     inkscape:bbox-paths="true"
+     inkscape:snap-global="true"
+     inkscape:bbox-nodes="true"
+     inkscape:lockguides="false"
+     units="px">
+    <sodipodi:guide
+       position="0,0"
+       orientation="0,793.70079"
+       id="guide4797"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="0,297"
+       orientation="1122.5197,0"
+       id="guide4803"
+       inkscape:locked="false" />
+    <inkscape:grid
+       type="axonomgrid"
+       id="grid4805"
+       units="px"
+       empspacing="2"
+       snapvisiblegridlinesonly="true"
+       spacingy="1.0583333" />
+    <sodipodi:guide
+       position="0,0"
+       orientation="0,755.90551"
+       id="guide4807"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="200,0"
+       orientation="-755.90551,0"
+       id="guide4809"
+       inkscape:locked="false" />
+    <sodipodi:guide
+       position="200,200"
+       orientation="0,-755.90551"
+       id="guide4811"
+       inkscape:locked="false" />
+    <inkscape:grid
+       type="xygrid"
+       id="grid871"
+       empspacing="2"
+       color="#d43fff"
+       opacity="0.1254902"
+       empcolor="#cf3fff"
+       empopacity="0.25098039"
+       units="px"
+       spacingx="1.0583333"
+       spacingy="1.0583333"
+       enabled="false" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata5">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Logo"
+     style="display:inline"
+     transform="translate(0,-26.066668)">
+    <circle
+       id="path3792"
+       cx="135.46666"
+       cy="161.53333"
+       style="display:inline;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.3584221"
+       inkscape:transform-center-x="-57.929751"
+       inkscape:transform-center-y="532.03976"
+       inkscape:export-xdpi="96.000008"
+       inkscape:export-ydpi="96.000008"
+       r="135.46666" />
+    <path
+       style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.32663074px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 48.965212,110.73276 H 239.52342 c 4.88824,0 4.88824,0 0,8.46688 L 180.59519,221.2662 c -4.6188,8.00001 -4.6188,8.00001 -9.50702,8.00001 h -19.55294 c -4.88824,0 -4.88824,0 -0.26944,-8.00001 l 44.2635,-76.66608 h -29.41224 l -43.91123,76.19952 c -4.88823,8.46657 -4.88823,8.46657 -9.77646,8.46657 H 29.329398 l 49.299816,-84.66609 h -49.29982 z"
+       id="path4834"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccccccccccccc"
+       inkscape:export-xdpi="96.000008"
+       inkscape:export-ydpi="96.000008" />
+    <path
+       style="fill:#c0def5;fill-opacity:1;stroke:none;stroke-width:0.3584221px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 97.764652,110.73276 H 127.09406 L 58.658797,229.26621 H 29.329398 Z"
+       id="path4836"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       inkscape:export-xdpi="96.000008"
+       inkscape:export-ydpi="96.000008" />
+    <path
+       style="fill:#87aade;fill-opacity:1;stroke:none;stroke-width:0.3584221px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       d="M 58.658797,229.26621 127.09406,110.73276 h 29.3294 L 87.988193,229.26621 Z"
+       id="path4838"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ccccc"
+       inkscape:export-xdpi="96.000008"
+       inkscape:export-ydpi="96.000008" />
+  </g>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     transform="translate(0,-26.066668)" />
+</svg>
-- 
GitLab