Workflow n8n

Automatisation n8n : gestion des notes et révisions sur Discord

  • Ce workflow n8n est conçu pour automatiser la gestion des notes et des révisions sur Discord, facilitant ainsi la collaboration au sein des équipes. Dans un environnement de travail où la communication est essentielle, ce processus permet de suivre les modifications apportées aux notes et d'assurer une révision efficace. Les utilisateurs peuvent ainsi se concentrer sur l'essentiel sans perdre de temps à gérer manuellement les mises à jour.
  • Le workflow débute par un déclencheur Webhook qui reçoit les données des notes. Ensuite, plusieurs noeuds Sticky Note sont utilisés pour stocker et gérer le contenu des notes. Le noeud 'Get Changes' effectue une requête HTTP pour récupérer les modifications, tandis que le noeud 'Split Out' permet de traiter les données en plusieurs segments. Une condition 'Need Review' détermine si une révision est nécessaire avant de passer à l'étape suivante. Si des modifications sont à ignorer, le noeud 'Skip File Changes' intervient pour filtrer ces éléments. Enfin, le noeud 'Post Discussions' envoie les informations pertinentes sur Discord, garantissant que toutes les parties prenantes sont informées des changements.
  • Les bénéfices de cette automatisation n8n sont multiples : réduction des erreurs humaines, gain de temps considérable dans la gestion des notes, et amélioration de la communication au sein des équipes. En intégrant ce workflow, les entreprises peuvent optimiser leur processus de révision et garantir une meilleure collaboration entre les membres de l'équipe.
Tags clés :automatisationDiscordworkflowcollaborationgestion des notes
Catégorie: Webhook · Tags: automatisation, Discord, workflow, collaboration, gestion des notes0

Workflow n8n Discord, collaboration, gestion des notes : vue d'ensemble

Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.

Workflow n8n Discord, collaboration, gestion des notes : détail des nœuds

  • Sticky Note

    Ce noeud crée une note autocollante avec le contenu spécifié.

  • Sticky Note2

    Ce noeud crée une seconde note autocollante avec un autre contenu.

  • Sticky Note3

    Ce noeud génère une troisième note autocollante avec un contenu différent.

  • Sticky Note4

    Ce noeud produit une quatrième note autocollante avec un contenu donné.

  • Need Review

    Ce noeud évalue des conditions pour déterminer si une révision est nécessaire.

  • Get Changes

    Ce noeud effectue une requête HTTP pour obtenir des modifications à partir d'une URL spécifiée.

  • Split Out

    Ce noeud divise les données en fonction d'un champ spécifié.

  • Skip File Changes

    Ce noeud évalue des conditions pour décider de sauter les modifications de fichiers.

  • Parse Last Diff Line

    Ce noeud exécute un code JavaScript pour analyser la dernière ligne de différence.

  • Basic LLM Chain

    Ce noeud exécute une chaîne de traitement de langage naturel avec un modèle de langage.

  • OpenAI Chat Model

    Ce noeud interagit avec le modèle de chat OpenAI pour générer des réponses.

  • Webhook

    Ce noeud configure un webhook pour recevoir des requêtes HTTP sur un chemin spécifique.

  • Code

    Ce noeud exécute un code JavaScript pour effectuer des traitements personnalisés.

  • Post Discussions

    Ce noeud envoie une requête HTTP pour poster des discussions à une URL donnée.

Inscris-toi pour voir l'intégralité du workflow

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "meta": {
    "instanceId": "408f9fb9940c3cb18ffdef0e0150fe342d6e655c3a9fac21f0f644e8bedabcd9",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "2a5a96c9-926c-447d-8244-db760e48a45f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -180,
        -140
      ],
      "parameters": {
        "content": "## Edit your own prompt ⬇️\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4c3a6b0b-2771-441d-8cb2-e17c07a92156",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1440,
        -100
      ],
      "parameters": {
        "content": "## Filter comments and customize your trigger words ⬇️"
      },
      "typeVersion": 1
    },
    {
      "id": "4f42b776-cc24-486c-889f-7c09522503ed",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1180,
        -120
      ],
      "parameters": {
        "content": "## Replace your gitlab URL and token ⬇️"
      },
      "typeVersion": 1
    },
    {
      "id": "b8859219-ce90-4940-8d9e-338c742def5e",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        140,
        -140
      ],
      "parameters": {
        "content": "## Replace your gitlab URL and token ⬇️"
      },
      "typeVersion": 1
    },
    {
      "id": "6be296f3-bd61-4644-825f-d96d591f229e",
      "name": "Need Review",
      "type": "n8n-nodes-base.if",
      "position": [
        -1440,
        100
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "617eb2c5-dd4b-4e28-b533-0c32ea6ca961",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.body.object_attributes.note }}",
              "rightValue": "+0"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fe59eeab-03a1-4b36-97f2-bf04bf6e4b8d",
      "name": "Get Changes",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1180,
        80
      ],
      "parameters": {
        "url": "=https://gitlab.com/api/v4/projects/{{ $json[\"body\"][\"project_id\"] }}/merge_requests/{{ $json[\"body\"][\"merge_request\"][\"iid\"] }}/changes",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "4fe2800c-1eb5-44c6-93bb-25285a015b1d",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -1000,
        80
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "changes"
      },
      "typeVersion": 1
    },
    {
      "id": "1838ffe7-a846-473b-9716-2714d527c727",
      "name": "Skip File Changes",
      "type": "n8n-nodes-base.if",
      "position": [
        -820,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c6e1430b-84a7-47ce-8fe9-7b94da0f2d31",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.renamed_file }}",
              "rightValue": ""
            },
            {
              "id": "bf6e9eb9-d72d-459c-a722-9614bab8842c",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.deleted_file }}",
              "rightValue": ""
            },
            {
              "id": "501623a9-9515-4034-bb13-a5a6a4f924eb",
              "operator": {
                "type": "string",
                "operation": "startsWith"
              },
              "leftValue": "={{ $json.diff }}",
              "rightValue": "@@"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "6215ecd2-55ad-4652-8c1f-f08713fdc237",
      "name": "Parse Last Diff Line",
      "type": "n8n-nodes-base.code",
      "position": [
        -560,
        -120
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const parseLastDiff = (gitDiff) => {\n  gitDiff = gitDiff.replace(/\\n\\\\ No newline at end of file/, '')\n  \n  const diffList = gitDiff.trimEnd().split('\\n').reverse();\n  const lastLineFirstChar = diffList?.[0]?.[0];\n  const lastDiff =\n    diffList.find((item) => {\n      return /^@@ \\-\\d+,\\d+ \\+\\d+,\\d+ @@/g.test(item);\n    }) || '';\n\n  const [lastOldLineCount, lastNewLineCount] = lastDiff\n    .replace(/@@ \\-(\\d+),(\\d+) \\+(\\d+),(\\d+) @@.*/g, ($0, $1, $2, $3, $4) => {\n      return `${+$1 + +$2},${+$3 + +$4}`;\n    })\n    .split(',');\n  \n  if (!/^\\d+$/.test(lastOldLineCount) || !/^\\d+$/.test(lastNewLineCount)) {\n    return {\n      lastOldLine: -1,\n      lastNewLine: -1,\n      gitDiff,\n    };\n  }\n\n\n  const lastOldLine = lastLineFirstChar === '+' ? null : (parseInt(lastOldLineCount) || 0) - 1;\n  const lastNewLine = lastLineFirstChar === '-' ? null : (parseInt(lastNewLineCount) || 0) - 1;\n\n  return {\n    lastOldLine,\n    lastNewLine,\n    gitDiff,\n  };\n};\n\nreturn parseLastDiff($input.item.json.diff)\n"
      },
      "typeVersion": 2
    },
    {
      "id": "bb3d6be0-7e85-4c2e-840a-090a36b48236",
      "name": "Basic LLM Chain",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -180,
        60
      ],
      "parameters": {
        "text": "=File path:{{ $('Skip File Changes').item.json.new_path }}\n\n```Original code\n {{ $json.originalCode }}\n```\nchange to\n```New code\n {{ $json.newCode }}\n```\nPlease review the code changes in this section:",
        "messages": {
          "messageValues": [
            {
              "message": "# Overview:| You are a senior programming expert Bot, responsible for reviewing code changes and providing review recommendations. At the beginning of the suggestion, it is necessary to clearly make a decision to \"reject\" or \"accept\" the code change, and rate the change in the format \"Change Score: Actual Score\", with a score range of 0-100 points. Then, point out the existing problems in concise language and a stern tone. If you feel it is necessary, you can directly provide the modified content. Your review proposal must use rigorous Markdown format."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.5
    },
    {
      "id": "f3a6e8c6-eda1-4af1-bdd5-f3b56ef8c23b",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -180,
        220
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "8gccIjcuf3gvaoEr",
          "name": "OpenAi account"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "796b0d0f-320f-43ff-943a-0d15b73878c7",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -1680,
        100
      ],
      "webhookId": "78214945-1731-46ca-a13f-132df9ee1d14",
      "parameters": {
        "path": "e21095c0-1876-4cd9-9e92-a2eac737f03e",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "74a7dd0c-fc01-411c-8ea9-e43b45c376c2",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        -360,
        -120
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nvar diff = $input.item.json.gitDiff\n\nlet lines = diff.trimEnd().split('\\n');\n\nlet originalCode = '';\nlet newCode = '';\n\nlines.forEach(line => {\n  console.log(line)\n    if (line.startsWith('-')) {\n        originalCode += line + \"\\n\";\n    } else if (line.startsWith('+')) {\n        newCode += line + \"\\n\";\n    } else {\n        originalCode += line + \"\\n\";\n        newCode += line + \"\\n\";\n    }\n});\n\nreturn {\n  originalCode:originalCode,\n  newCode:newCode\n};\n\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d55f0b8f-aac5-49e3-a5f1-9dd1a7c46254",
      "name": "Post Discussions",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        240,
        60
      ],
      "parameters": {
        "url": "=https://gitlab.com/api/v4/projects/{{ $('Webhook').item.json[\"body\"][\"project_id\"] }}/merge_requests/{{ $('Webhook').item.json[\"body\"][\"merge_request\"][\"iid\"] }}/discussions",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "body",
              "value": "={{ $('Basic LLM Chain').item.json[\"text\"] }}"
            },
            {
              "name": "position[position_type]",
              "value": "text"
            },
            {
              "name": "position[old_path]",
              "value": "={{ $('Split Out').item.json.old_path }}"
            },
            {
              "name": "position[new_path]",
              "value": "={{ $('Split Out').item.json.new_path }}"
            },
            {
              "name": "position[start_sha]",
              "value": "={{ $('Get Changes').item.json.diff_refs.start_sha }}"
            },
            {
              "name": "position[head_sha]",
              "value": "={{ $('Get Changes').item.json.diff_refs.head_sha }}"
            },
            {
              "name": "position[base_sha]",
              "value": "={{ $('Get Changes').item.json.diff_refs.base_sha }}"
            },
            {
              "name": "position[new_line]",
              "value": "={{ $('Parse Last Diff Line').item.json.lastNewLine || ''  }}"
            },
            {
              "name": "position[old_line]",
              "value": "={{ $('Parse Last Diff Line').item.json.lastOldLine || '' }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN"
            }
          ]
        }
      },
      "typeVersion": 4.2
    }
  ],
  "pinData": {},
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Need Review",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Skip File Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Changes": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Need Review": {
      "main": [
        [
          {
            "node": "Get Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain": {
      "main": [
        [
          {
            "node": "Post Discussions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Skip File Changes": {
      "main": [
        [
          {
            "node": "Parse Last Diff Line",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Last Diff Line": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Workflow n8n Discord, collaboration, gestion des notes : pour qui est ce workflow ?

Ce workflow s'adresse aux équipes de projet, aux entreprises utilisant Discord pour la communication, ainsi qu'aux professionnels cherchant à automatiser la gestion de leurs notes et révisions. Un niveau technique intermédiaire est recommandé pour la mise en place.

Workflow n8n Discord, collaboration, gestion des notes : problème résolu

Ce workflow résout le problème de la gestion manuelle des notes et des révisions, qui peut entraîner des erreurs et des pertes de temps. En automatisant ce processus, les utilisateurs bénéficient d'une meilleure organisation et d'une communication fluide, réduisant ainsi le risque de confusion et d'oubli d'informations cruciales. Après mise en place, les équipes peuvent se concentrer sur leurs tâches principales, tout en ayant accès à des notes à jour et pertinentes.

Workflow n8n Discord, collaboration, gestion des notes : étapes du workflow

Étape 1 : Le workflow est déclenché par un Webhook qui reçoit les données des notes.

  • Étape 1 : Les noeuds Sticky Note stockent le contenu des notes.
  • Étape 2 : Le noeud 'Get Changes' effectue une requête HTTP pour récupérer les modifications apportées.
  • Étape 3 : Le noeud 'Split Out' divise les données pour un traitement plus efficace.
  • Étape 4 : La condition 'Need Review' vérifie si une révision est nécessaire.
  • Étape 5 : Si des modifications doivent être ignorées, le noeud 'Skip File Changes' les filtre.
  • Étape 6 : Enfin, le noeud 'Post Discussions' envoie les informations pertinentes sur Discord.

Workflow n8n Discord, collaboration, gestion des notes : guide de personnalisation

Pour personnaliser ce workflow, vous pouvez modifier l'URL du Webhook pour l'adapter à votre application. Les noeuds Sticky Note peuvent être ajustés pour inclure des champs supplémentaires selon vos besoins. Pensez également à adapter les conditions dans le noeud 'Need Review' pour qu'elles correspondent à vos critères de révision. Si vous souhaitez intégrer d'autres outils, vous pouvez ajouter des noeuds HTTP Request pour interagir avec des API externes. Assurez-vous de sécuriser votre flux en vérifiant les permissions d'accès aux données sensibles.