Secret Santa w/ Ruby

For our office secret santa pool, I wrote a quick little ruby script to generate the pairings and email each of the people in our office with their result.

Here’s the salient code:

pool = ["person1@email.address.com",
        "person2@email.address.com",
        "person3@email.address.com"]

avail = pool.dup
pairs = []

pool.each do |secret_santa|
  loop do
    index = (rand * avail.length).to_i
    recipient = avail[index]
    unless recipient == secret_santa
      avail.delete_at(index)
      pairs << [secret_santa, recipient]
      break
    end
  end
end

This generates a list of tuples (the variable pairs) that you can then iterate over, emailing out the results. Here's the full code (download here).

#!/usr/bin/ruby
require 'net/smtp'

PRINT_RESULTS = true # Print results to screen?
EMAIL_RESULTS = false # email the results?

pool = ["person1@email.address.com",
        "person2@email.address.com",
        "person3@email.address.com"]

avail = pool.dup
pairs = []

pool.each do |secret_santa|
  loop do
    index = (rand * avail.length).to_i
    recipient = avail[index]
    unless recipient == secret_santa
      avail.delete_at(index)
      pairs << [secret_santa, recipient]
      break
    end
  end
end

pairs.each do |secret_santa,recipient|
  from = "the_north_pole@northpole.np"
  from_alias = "santa"
  to = secret_santa
  to_alias = secret_santa

  sbj = "secret santa -- ho ho ho"
  msg = "You are #{secret_santa}. " <<
                  "Your secret santa recipient is: "<<
                  "#{recipient}."
  send_email(from, from_alias, to, to_alias, sbj, msg) if EMAIL_RESULTS
  puts "#{secret_santa}  => #{recipient}" if PRINT_RESULTS
end

def send_email(from, from_alias, to, to_alias, subject, message)
	msg = <
To: #{to_alias} <#{to}>
Subject: #{subject}

#{message}
END_OF_MESSAGE

   Net::SMTP.start('localhost') do |smtp|
      smtp.send_message msg, from, to
   end
end

18 December 2007 | general, ruby | Comments

blog comments powered by Disqus

About Me

I work at outside.in during the day. On nights and weekends I do stuff and work on side projects, which you can read about here.

    Meta