Skip to content

Instantly share code, notes, and snippets.

@chocolatkey
Created October 23, 2015 18:09
Show Gist options
  • Select an option

  • Save chocolatkey/8a9696517edcee0cfd4b to your computer and use it in GitHub Desktop.

Select an option

Save chocolatkey/8a9696517edcee0cfd4b to your computer and use it in GitHub Desktop.
Slack team invite sign-up form handler
<?php
/*
Slack team invite sign-up form handler
Henry Stark 2015
Original Idea: https://levels.io/slack-typeform-auto-invite-sign-ups/
*/
/* VARIABLES TO EDIT */
$slackTeam = 'scanlation';// Slack team name
$slackToken = 'xoxp-1234';// Slack API token (Generate at https://api.slack.com/web)
$slackJoinChannels = 'C0D2ET69W';// Separate IDs with a comma
$usedEmailsFile = $_SERVER["DOCUMENT_ROOT"].'/sho/prevEmails.json';// File for used emails
$formName = 'name';// Form name field name var
$formEmail = 'email';// Form email field name var
/* END VARIABLES */
mb_internal_encoding("UTF-8");
if(isset($_POST[$formName]) && isset($_POST[$formEmail])){
$name = htmlspecialchars($_POST[$formName]);
$email = htmlspecialchars($_POST[$formEmail]);
// Load used emails file
if(@!file_get_contents($usedEmailsFile)) {
$usedEmails = array();
} else {
$usedEmails = json_decode(file_get_contents($usedEmailsFile),true);
}
$offset = count($usedEmails);
if(!in_array($email, $usedEmails)) {// If account has not been registered via form
$slackInviteUrl = 'https://'.$slackTeam.'.slack.com/api/users.admin.invite?t='.time();
// URL fields
$fields = array(
'email' => urlencode($email),
'channels' => urlencode($slackJoinChannels),
'first_name' => urlencode($name),
'token' => $slackToken,
'set_active' => urlencode('true'),
'_attempts' => '1'
);
// Convert to url
$fields_string='';
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
// POST connection to Slack API
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $slackInviteUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
$replyRaw = curl_exec($ch);
$reply = json_decode($replyRaw,true);
if($reply['ok'] == false) {// Success
echo('Error regitstering: '.$reply['error']);
}
else {// Error posting
echo('Thank you for your signing up, '.$name.'!. You have been added to the <a href="//'.$slackTeam.'.slack.com">'.$slackTeam.'</a> Slack team.<br/>Check your email ('.$email.') for an invite link.');
}
curl_close($ch);
// Save email in used emails file
array_push($usedEmails, $email);
file_put_contents($usedEmailsFile, json_encode($usedEmails));
} else {// Error email in use
echo('Error: The email '.$email.' has already been used to sign up in the team <a href="//'.$slackTeam.'">'.$slackTeam.'</a>.');
}
} else {// Error name or email values not set
echo('Error: Missing data. Please (re)submit the form.');
}
@gaelfoppolo
Copy link
Copy Markdown

Hey! No need to store e-mail used, Slack API provide errors for that !
Check isset($reply['error']) and check $reply['error] is :

  • bad_address
  • already_invited
  • already_in_team
  • other is unknown error

Hope I help you!

@chocolatkey
Copy link
Copy Markdown
Author

Thank you gael! I'll change this soon

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment