Update incoming webhooks to hide DMs and accept direct JSON payloads.
Этот коммит содержится в:
@@ -5,7 +5,7 @@
|
|||||||
"SegmentDeveloperKey": "",
|
"SegmentDeveloperKey": "",
|
||||||
"GoogleDeveloperKey": "",
|
"GoogleDeveloperKey": "",
|
||||||
"EnableOAuthServiceProvider": false,
|
"EnableOAuthServiceProvider": false,
|
||||||
"EnableIncomingWebhooks": false,
|
"EnableIncomingWebhooks": true,
|
||||||
"EnableTesting": false
|
"EnableTesting": false
|
||||||
},
|
},
|
||||||
"TeamSettings": {
|
"TeamSettings": {
|
||||||
|
|||||||
@@ -20,6 +20,11 @@ You can send the message by including a JSON string as the `payload` parameter i
|
|||||||
payload={"text": "Hello, this is some text."}
|
payload={"text": "Hello, this is some text."}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
In addition, if `Content-Type` is specified as `application/json` in the headers of the HTTP request then the body of the request can be direct JSON.
|
||||||
|
```
|
||||||
|
{"text": "Hello, this is some text."}
|
||||||
|
```
|
||||||
|
|
||||||
It is also possible to post richly formatted messages using [Markdown](../../help/enduser/markdown.md).
|
It is also possible to post richly formatted messages using [Markdown](../../help/enduser/markdown.md).
|
||||||
```
|
```
|
||||||
payload={"text": "# A Header\nThe _text_ below **the** header."}
|
payload={"text": "# A Header\nThe _text_ below **the** header."}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ export default class ManageIncomingHooks extends React.Component {
|
|||||||
this.getHooks();
|
this.getHooks();
|
||||||
}
|
}
|
||||||
addNewHook() {
|
addNewHook() {
|
||||||
let hook = {}; //eslint-disable-line prefer-const
|
const hook = {};
|
||||||
hook.channel_id = this.state.channelId;
|
hook.channel_id = this.state.channelId;
|
||||||
|
|
||||||
Client.addIncomingHook(
|
Client.addIncomingHook(
|
||||||
@@ -40,13 +40,13 @@ export default class ManageIncomingHooks extends React.Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
removeHook(id) {
|
removeHook(id) {
|
||||||
let data = {}; //eslint-disable-line prefer-const
|
const data = {};
|
||||||
data.id = id;
|
data.id = id;
|
||||||
|
|
||||||
Client.deleteIncomingHook(
|
Client.deleteIncomingHook(
|
||||||
data,
|
data,
|
||||||
() => {
|
() => {
|
||||||
let hooks = this.state.hooks; //eslint-disable-line prefer-const
|
const hooks = this.state.hooks;
|
||||||
let index = -1;
|
let index = -1;
|
||||||
for (let i = 0; i < hooks.length; i++) {
|
for (let i = 0; i < hooks.length; i++) {
|
||||||
if (hooks[i].id === id) {
|
if (hooks[i].id === id) {
|
||||||
@@ -69,7 +69,7 @@ export default class ManageIncomingHooks extends React.Component {
|
|||||||
getHooks() {
|
getHooks() {
|
||||||
Client.listIncomingHooks(
|
Client.listIncomingHooks(
|
||||||
(data) => {
|
(data) => {
|
||||||
let state = this.state; //eslint-disable-line prefer-const
|
const state = this.state;
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
state.hooks = data;
|
state.hooks = data;
|
||||||
@@ -93,9 +93,11 @@ export default class ManageIncomingHooks extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const channels = ChannelStore.getAll();
|
const channels = ChannelStore.getAll();
|
||||||
let options = []; //eslint-disable-line prefer-const
|
const options = [];
|
||||||
channels.forEach((channel) => {
|
channels.forEach((channel) => {
|
||||||
options.push(<option value={channel.id}>{channel.name}</option>);
|
if (channel.type !== Constants.DM_CHANNEL) {
|
||||||
|
options.push(<option value={channel.id}>{channel.name}</option>);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let disableButton = '';
|
let disableButton = '';
|
||||||
@@ -103,7 +105,7 @@ export default class ManageIncomingHooks extends React.Component {
|
|||||||
disableButton = ' disable';
|
disableButton = ' disable';
|
||||||
}
|
}
|
||||||
|
|
||||||
let hooks = []; //eslint-disable-line prefer-const
|
const hooks = [];
|
||||||
this.state.hooks.forEach((hook) => {
|
this.state.hooks.forEach((hook) => {
|
||||||
const c = ChannelStore.get(hook.channel_id);
|
const c = ChannelStore.get(hook.channel_id);
|
||||||
hooks.push(
|
hooks.push(
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
|
||||||
MAX_DMS: 20,
|
MAX_DMS: 20,
|
||||||
|
DM_CHANNEL: 'D',
|
||||||
MAX_POST_LEN: 4000,
|
MAX_POST_LEN: 4000,
|
||||||
EMOJI_SIZE: 16,
|
EMOJI_SIZE: 16,
|
||||||
ONLINE_ICON_SVG: "<svg version='1.1' id='Layer_1' 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:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' sodipodi:docname='TRASH_1_4.svg' inkscape:version='0.48.4 r9939' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='12px' height='12px' viewBox='0 0 12 12' enable-background='new 0 0 12 12' xml:space='preserve'><sodipodi:namedview inkscape:cy='139.7898' inkscape:cx='26.358185' inkscape:zoom='1.18' showguides='true' showgrid='false' id='namedview6' guidetolerance='10' gridtolerance='10' objecttolerance='10' borderopacity='1' bordercolor='#666666' pagecolor='#ffffff' inkscape:current-layer='Layer_1' inkscape:window-maximized='1' inkscape:window-y='-8' inkscape:window-x='-8' inkscape:window-height='705' inkscape:window-width='1366' inkscape:guide-bbox='true' inkscape:pageshadow='2' inkscape:pageopacity='0'><sodipodi:guide position='50.036793,85.991376' orientation='1,0' id='guide2986'></sodipodi:guide><sodipodi:guide position='58.426196,66.216355' orientation='0,1' id='guide3047'></sodipodi:guide></sodipodi:namedview><g><g><path class='online--icon' d='M6,5.487c1.371,0,2.482-1.116,2.482-2.493c0-1.378-1.111-2.495-2.482-2.495S3.518,1.616,3.518,2.994C3.518,4.371,4.629,5.487,6,5.487z M10.452,8.545c-0.101-0.829-0.36-1.968-0.726-2.541C9.475,5.606,8.5,5.5,8.5,5.5S8.43,7.521,6,7.521C3.507,7.521,3.5,5.5,3.5,5.5S2.527,5.606,2.273,6.004C1.908,6.577,1.648,7.716,1.547,8.545C1.521,8.688,1.49,9.082,1.498,9.142c0.161,1.295,2.238,2.322,4.375,2.358C5.916,11.501,5.958,11.501,6,11.501c0.043,0,0.084,0,0.127-0.001c2.076-0.026,4.214-1.063,4.375-2.358C10.509,9.082,10.471,8.696,10.452,8.545z'/></g></g></svg>",
|
ONLINE_ICON_SVG: "<svg version='1.1' id='Layer_1' 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:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' sodipodi:docname='TRASH_1_4.svg' inkscape:version='0.48.4 r9939' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='12px' height='12px' viewBox='0 0 12 12' enable-background='new 0 0 12 12' xml:space='preserve'><sodipodi:namedview inkscape:cy='139.7898' inkscape:cx='26.358185' inkscape:zoom='1.18' showguides='true' showgrid='false' id='namedview6' guidetolerance='10' gridtolerance='10' objecttolerance='10' borderopacity='1' bordercolor='#666666' pagecolor='#ffffff' inkscape:current-layer='Layer_1' inkscape:window-maximized='1' inkscape:window-y='-8' inkscape:window-x='-8' inkscape:window-height='705' inkscape:window-width='1366' inkscape:guide-bbox='true' inkscape:pageshadow='2' inkscape:pageopacity='0'><sodipodi:guide position='50.036793,85.991376' orientation='1,0' id='guide2986'></sodipodi:guide><sodipodi:guide position='58.426196,66.216355' orientation='0,1' id='guide3047'></sodipodi:guide></sodipodi:namedview><g><g><path class='online--icon' d='M6,5.487c1.371,0,2.482-1.116,2.482-2.493c0-1.378-1.111-2.495-2.482-2.495S3.518,1.616,3.518,2.994C3.518,4.371,4.629,5.487,6,5.487z M10.452,8.545c-0.101-0.829-0.36-1.968-0.726-2.541C9.475,5.606,8.5,5.5,8.5,5.5S8.43,7.521,6,7.521C3.507,7.521,3.5,5.5,3.5,5.5S2.527,5.606,2.273,6.004C1.908,6.577,1.648,7.716,1.547,8.545C1.521,8.688,1.49,9.082,1.498,9.142c0.161,1.295,2.238,2.322,4.375,2.358C5.916,11.501,5.958,11.501,6,11.501c0.043,0,0.084,0,0.127-0.001c2.076-0.026,4.214-1.063,4.375-2.358C10.509,9.082,10.471,8.696,10.452,8.545z'/></g></g></svg>",
|
||||||
|
|||||||
@@ -850,7 +850,12 @@ func incomingWebhook(c *api.Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
r.ParseForm()
|
r.ParseForm()
|
||||||
|
|
||||||
props := model.MapFromJson(strings.NewReader(r.FormValue("payload")))
|
var props map[string]string
|
||||||
|
if r.Header.Get("Content-Type") == "application/json" {
|
||||||
|
props = model.MapFromJson(r.Body)
|
||||||
|
} else {
|
||||||
|
props = model.MapFromJson(strings.NewReader(r.FormValue("payload")))
|
||||||
|
}
|
||||||
|
|
||||||
text := props["text"]
|
text := props["text"]
|
||||||
if len(text) == 0 {
|
if len(text) == 0 {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user