| Bytes | Lang | Time | Link |
|---|---|---|---|
| 020 | UiuaSBCS | 240808T190415Z | Europe20 |
| 034 | TIBasic | 160501T231300Z | Timtech |
| 045 | JavaScript | 160501T184505Z | ericw314 |
| 016 | MATL | 160502T012330Z | David |
| 072 | GameMaker Language | 160501T231646Z | Timtech |
| 017 | CJam | 160501T225927Z | Sp3000 |
| 094 | Python 2.x | 160501T184321Z | hyper-ne |
| 045 | rs | 160501T181630Z | kirbyfan |
UiuaSBCS, 20 bytes
⨬"._.""O_O"∈"nrpt"⊡1
Explanation
⨬"._.""O_O"∈"nrpt"⊡1
⊡1 is the second letter
∈"nrpt" one of the letters "nprt"?
⨬"._.""O_O" pick the corresponding face
TI-Basic, 34 bytes
"._.
If inString("nrpt",sub(Ans,2,1:"O-O
Ans
39-byte oneliner:
sub("._.O-O",1+3inString("nrpt",sub(Ans,2,1)),3
JavaScript, 151 123 113 54 50 47 45 bytes
a=>["beat","bored","collapsing","consumed","distressed","empty","fagged","faint","fatigued","finished","jaded","wasted","worn"].includes(a)?"._.":"O_O"
Long, but it's a good start.
a=>/(beat|bored|collapsing|consumed|distressed|empty|fagged|faint|fatigued|finished|jaded|wasted|worn)/.test(a)?"._.":"O_O"
Still pretty long.
a=>(/beat|(bor|consum|distress|finish|jad|wast)ed|collapsing|empty|fa(gged|int|tigued)|worn/).test(a)?"._.":"O_O"
Eliminated some redundancy.
a=>/^(be|bo|c|di|en|fa|fi|j|w)\w+/.test(a)?"._.":"O_O"
Shorter.
a=>/^(a|br|dr|en|fr|i|s|u)\w+/.test(a)?"O_O":"._."
Switched to the other(even shorter) regex for open eyes, instead of closed ones.
a=>/^(a|br|dr|en|fr|i|s|u)/.test(a)?"O_O":"._."
Better.
a=>/^(a|[bdf]r|en|i|s|u)/.test(a)?"O_O":"._."
GameMaker Language, 72 bytes
a="._."if string_count(string_copy(argument0,2,1),"nrpt")a="O_O"return a
CJam, 17 bytes
q1=1^'n>".O"='_1$
Second letters. This would have been much more fun without any "tricks" in the test cases :/
Python (2.x), 95 94 bytes
import re
print('O_O','._.')[len(re.findall('^a|(br)|(dr)|(en)|(fr)|i|s|u.*',raw_input()))==0]
Regex! If it starts with:
a
br
dr
en
fr
i
s
u
then it is on the eyes-open list.
EDIT: Removed 1 byte because I didn't know how wc worked on bash. :P