2015-01-30 1 views
11

슬랙을위한 heroku로 설정된이 hubot-cron 스크립트가 있습니다. 한 가지 예외가 있습니다. Slack에서 '@'누군가 (언급) 사용자는 알림 설정에 따라 알림을 받게됩니다. 이것이 쓰여지는 방식으로, 명령 텍스트에서 사용자 이름을 입력하면, Slack은 텍스트로 간단히 사용자로 등록하지 않습니다.Slack에 대한이 hubot cron 스크립트에서 사용자를 어떻게 '언급'합니까? 알림 설정이 켜져 있다면 알림으로 볼 수 있습니까?

예를 들어

:

hubot 새 작업이는 2 분마다 게시 2 * * * * * "@everyone 테스트"

, 그것은 @everyone을 쓸 수 있지만, 여유가 않습니다 실제로 '@everyone'으로 보지 마라.

실제로이 코드를 사용하여 작업을 @user로 보낼 수있는 곳은 무엇입니까?

# Description: 
# register cron jobs to schedule messages on the current channel 
# 
# Commands: 
# hubot new job "<crontab format>" <message> - Schedule a cron job to say something 
# hubot new job <crontab format> "<message>" - Ditto 
# hubot new job <crontab format> say <message> - Ditto 
# hubot list jobs - List current cron jobs 
# hubot remove job <id> - remove job 
# hubot remove job with message <message> - remove with message 
# 
# Author: 
# miyagawa 

cronJob = require('cron').CronJob 

JOBS = {} 

createNewJob = (robot, pattern, user, message) -> 
    id = Math.floor(Math.random() * 1000000) while !id? || JOBS[id] 
    job = registerNewJob robot, id, pattern, user, message 
    robot.brain.data.cronjob[id] = job.serialize() 
    id 

registerNewJobFromBrain = (robot, id, pattern, user, message, timezone) -> 
    # for jobs saved in v0.2.0..v0.2.2 
    user = user.user if "user" of user 
    registerNewJob(robot, id, pattern, user, message, timezone) 

    envelope = user: user, room: user.room 
    robot.send envelope, "Job #{id} registered from brain" 

storeJobToBrain = (robot, id, job) -> 
    robot.brain.data.cronjob[id] = job.serialize() 

    envelope = user: job.user, room: job.user.room 
    robot.send envelope, "Job #{id} stored in brain asynchronously" 

registerNewJob = (robot, id, pattern, user, message, timezone) -> 
    job = new Job(id, pattern, user, message, timezone) 
    job.start(robot) 
    JOBS[id] = job 

unregisterJob = (robot, id)-> 
    if JOBS[id] 
    JOBS[id].stop() 
    delete robot.brain.data.cronjob[id] 
    delete JOBS[id] 
    return yes 
    no 

handleNewJob = (robot, msg, pattern, message) -> 
    try 
    id = createNewJob robot, pattern, msg.message.user, message 
    msg.send "Job #{id} created" 
    catch error 
    msg.send "Error caught parsing crontab pattern: #{error}. See http://crontab.org/ for the syntax" 

updateJobTimezone = (robot, id, timezone) -> 
    if JOBS[id] 
    JOBS[id].stop() 
    JOBS[id].timezone = timezone 
    robot.brain.data.cronjob[id] = JOBS[id].serialize() 
    JOBS[id].start(robot) 
    return yes 
    no 

syncJobs = (robot) -> 
    nonCachedJobs = difference(robot.brain.data.cronjob, JOBS) 
    for own id, job of nonCachedJobs 
    registerNewJobFromBrain robot, id, job... 

    nonStoredJobs = difference(JOBS, robot.brain.data.cronjob) 
    for own id, job of nonStoredJobs 
    storeJobToBrain robot, id, job 

difference = (obj1, obj2) -> 
    diff = {} 
    for id, job of obj1 
    diff[id] = job if id !of obj2 
    return diff 

module.exports = (robot) -> 
    robot.brain.data.cronjob or= {} 
    robot.brain.on 'loaded', => 
    syncJobs robot 

    robot.respond /(?:new|add) job "(.*?)" (.*)$/i, (msg) -> 
    handleNewJob robot, msg, msg.match[1], msg.match[2] 

    robot.respond /(?:new|add) job (.*) "(.*?)" *$/i, (msg) -> 
    handleNewJob robot, msg, msg.match[1], msg.match[2] 

    robot.respond /(?:new|add) job (.*?) say (.*?) *$/i, (msg) -> 
    handleNewJob robot, msg, msg.match[1], msg.match[2] 

    robot.respond /(?:list|ls) jobs?/i, (msg) -> 
    text = '' 
    for id, job of JOBS 
     room = job.user.reply_to || job.user.room 
     if room == msg.message.user.reply_to or room == msg.message.user.room 
     text += "#{id}: #{job.pattern} @#{room} \"#{job.message}\"\n" 
    msg.send text if text.length > 0 

    robot.respond /(?:rm|remove|del|delete) job (\d+)/i, (msg) -> 
    if (id = msg.match[1]) and unregisterJob(robot, id) 
     msg.send "Job #{id} deleted" 
    else 
     msg.send "Job #{id} does not exist" 

    robot.respond /(?:rm|remove|del|delete) job with message (.+)/i, (msg) -> 
    message = msg.match[1] 
    for id, job of JOBS 
     room = job.user.reply_to || job.user.room 
     if (room == msg.message.user.reply_to or room == msg.message.user.room) and job.message == message and unregisterJob(robot, id) 
     msg.send "Job #{id} deleted" 

    robot.respond /(?:tz|timezone) job (\d+) (.*)/i, (msg) -> 
    if (id = msg.match[1]) and (timezone = msg.match[2]) and updateJobTimezone(robot, id, timezone) 
     msg.send "Job #{id} updated to use #{timezone}" 
    else 
     msg.send "Job #{id} does not exist" 

class Job 
    constructor: (id, pattern, user, message, timezone) -> 
    @id = id 
    @pattern = pattern 
    # cloning user because adapter may touch it later 
    clonedUser = {} 
    clonedUser[k] = v for k,v of user 
    @user = clonedUser 
    @message = message 
    @timezone = timezone 

    start: (robot) -> 
    @cronjob = new cronJob(@pattern, => 
     @sendMessage robot 
    , null, false, @timezone) 
    @cronjob.start() 

    stop: -> 
    @cronjob.stop() 

    serialize: -> 
    [@pattern, @user, @message, @timezone] 

    sendMessage: (robot) -> 
    envelope = user: @user, room: @user.room 
    robot.send envelope, @message 
+0

현상금을 시작하고 답을 찾아주십시오. – dgrebb

답변

17

는 특정 사용자를 언급 @everyone 같은 특별한 @ 멘션 명령 중 하나를 사용하려면 다음 형식 중 하나

<@USER_ID>

<@USER_ID|user_name>

를 보내려면 :

현재 정의 된 명령은! channel,! group 및! everyone입니다. (그룹은 채널의 동의어이며 둘 다 채널과 그룹에서 사용할 수 있음). 이것은 @channel, @group 또는 @everyone 메시지를 나타내며 클라이언트가 알림을 표시해야합니다.

따라서 모든 사람을 언급하려면 <!everyone>을 보내고 싶을 것입니다.

{ 
    "text": "Hey <@U1234|stephen> pay attention!" 
} 

또는 내가 @everyone 언급하기를 원한다면, 내가 할 것 :

{ 
    "text": "Hey <!everyone> pay attention!" 
} 

그래서 사용자 ID U1234 인 스티븐 언급 메시지를 보내 원한다면, 나는 다음 보낼 것이다 여기에 서식 메시지에

전체 문서는 : https://api.slack.com/docs/formatting

+4

stephen이 유효한 슬랙 사용자 이름 인 경우에도 <@stephen>이 작동합니다. – kev

1

당신은 특별한 단어 <!>를 사용해야합니다.

일부 메시지에는 특별한 동작이있는 특수 단어가 포함되어 있습니다. 이를 위해 <!foo> 형식을 사용합니다. 여기서 foo는 특수 명령입니다. - 슬랙

예제에서 <!everyone>을 사용하여 알림을 보내면 대신 작동합니다.

관련 문제