SMS trailers at Uboot
We developed a cool algorithm to add informational trailer texts to SMS at Uboot. It was online from mid 2000 to mid 2011 (when Uboot stopped doing SMS). I developed this algorithm together with my colleague Mike. So that it doesn't get lost forever, here is a description of it :-)
The general situation was this:
- The users may send SMS from Uboot to phones
- SMS have fixed length (e.g. single part SMS contains 160 characters)
- The user may well type fewer than the maximum number of characters (e.g. 100 characters, resulting in a 1-part SMS with a maximum length of 160 characters)
- We can use this space to promote Uboot (e.g. add "Sent by www.uboot.com" text)
- We realized we needed a trailer system to define what text should be added to which SMS under which circumstances
Requirements:
- Texts should be stored in a separate file/files or DB (i.e. not in the middle of the source code)
- Different SMSs have a different number of free characters at the end (from zero characters upwards). It would be nice to put longer texts on those SMS which have more characters free.
- Users speak different languages (English, German, ..)
- It would be nice to put variables in the text (e.g. "Sent by USERNAME")
- The text depends on various other factors: Is the recipient the telephone number of a registered user?
We came up with the following solution. We called it "Table with Wildcards". Inspired by crontab, we used a file, one line of the file per rule.
- Each line had a set of columns for the conditions (language,..) with values such as "de" (single value), or "en,de" (multiple values), or * (any value is acceptable)
- The last column of the file was the text
- The text may contain variables such as ${USER}
For example:
language recipient-registered text en yes Sent by ${USER} on Uboot en no Sent by ${USER} on www.uboot.com en yes Sent by Uboot en no Sent by www.uboot.com * * Uboot * no www.uboot.com de yes Verschickt von ${USER} auf Uboot
The algorithm would do the following, when sending a particular SMS:
- Search through the file, finding all rules that matched the condition, take the texts
- Expand variables in the texts
- See how many characters are available in the user's SMS
- Throw away any texts (with variables expanded) which are longer than the available space
- Take the longest text out of the remaining text
- If there are more than one texts with the same length, choose one at random
- If no text matches, simply use no trailer (e.g. if only 1 character is free, it's unlikely a useful trailer will be defined with that length)
The advantage of this algorithm is, given two users who send an SMS with the same amount of space free, different trailers may be the longest, depending on how long their username is.